将Mechanize的Cookies保存为YAML字符串并存储到外部服务中

首先

这次是我第一次使用 Mechanize gem。一般来说,为了持久化 Cookies,通常会使用 Mechanize::CookieJar#save 方法将其以 YAML 形式保存。然而,这个 save 方法需要传入 IO 或者文件名作为参数。因为在 Heroku 等平台上,本地文件会在周期性重启时消失,所以使用这个方法保存的 Cookies 也会消失。这样就不太实用了。

那么,在使用 Heroku 时,如果要将 Cookies 保存到外部服务,比如存储到 Redis,应该怎么做呢?我进行了一些调研和验证,记录如下。

自动化实例生成

require 'mechanize'

agent = Mechanize.new

Redis To Go的设置

作为外部服务,我们选择了 Redis To Go(只要是可以保存字符串的服务,不一定非要选择Redis)。
我们已经完成了 Redis To Go 的注册,并且获取到了访问 Redis 的 URL,即 redis://redistogo:cdcddcfedd5ac469f64f4c44f7cc77bf@xxx.redistogo.com:9999/。

require 'redis-objects'

redis_url = "redis://redistogo:cdcddcfedd5ac469f64f4c44f7cc77bf@xxx.redistogo.com:9999/"
Redis.current = Redis.new(url: redis_url)
cookies = Redis::Value.new('cookies')

附带说明,Redis::Value是一个只能存储字符串的实例,其设置器/获取器分别为Redis::Value#value= / Redis::Value#value。

存储 Cookies

通过将StringIO实例传递给Mechanize::CookieJar#save方法,Mechanize实例的agent Cookies将被保存并转化为字符串。

def cookies_to_yaml_string(agent)
  cookies_io_write = StringIO.new("", 'r+')
  agent.cookie_jar.save(cookies_io_write)
  cookies_io_write.string
end

使用 cookies_to_yaml_string 方法,将 Cookies 转换为 YAML 格式的字符串并返回。
使用 setter 方法进行保存。在本次 Redis 示例中,使用 cookies.value = 进行设置。

cookies.value = cookies_to_yaml_string(agent)

饼干设置

要将 Cookies 设置到 Mechanize 实例的 agent 中,请使用 Mechanize::CookieJar#load 方法。

def set_cookies(agent, cookies_yaml)
  cookies_io_read = StringIO.new(cookies_yaml, 'r')
  agent.cookie_jar.clear # 念のために Cookies を削除している
  agent.cookie_jar.load(cookies_io_read)
end

通过使用set_cookies方法,您可以将转换为YAML格式的字符串Cookies设置到代理中。
通过使用getter方法读取Cookies的字符串并进行设置。本次将使用cookies.value。

set_cookies(agent, cookies.value)

抱歉

因为我从未使用过StringIO类,所以请您教我一种更好的使用方法。谢谢!

包含有关使用Mechanize的指南的文章

使用Mechanize工具(Cookies将被保存到Redis服务器上)- 分馆 子子子子子子(猫小猫)

广告
将在 10 秒后关闭
bannerAds