将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服务器上)- 分馆 子子子子子子(猫小猫)