我正在整理一个小应用程序,它允许用户登录到一个没有足够 API 的半流行社交网站,所以我正在使用 mechanize gem 来自动化一些我想添加的功能任何人都可以使用,例如群发消息。
由于 API 的限制,我不得不假装是与站点的 http 接口交互的用户来执行此操作。
我遇到的问题是,一旦用户登录到我的网站,我如何才能将来自社交网站的 cookie 有状态地保存在会话中,这样他们就不需要为每个页面加载输入凭据?
我试图从 mechanize 实例中编组 cookie,但我收到有关 mutex 没有 Marshal 方法的错误。
编辑 - 已解决
结果很简单,但是文档肯定没有帮助,只是因为不完整。
这是我为捕获 cookie 并将它们带回以供将来的请求所做的工作(为简洁起见,排除了代码和错误检查之间的大部分内容):
users_controller.rb
def create
session.delete(:agent) if session[:agent]
agent = Mechanize.new
page = agent.get('www.socialnetwork.com/login')
login_form = page.form
login_form.email = params[:login][:email]
login_form.password = params[:login][:password]
page = agent.submit(login_form, login_form.buttons.first)
cookies = agent.cookie_jar.store.map {|i| i}
session[:agent] = Marshal.dump cookies
redirect_to root_path
end
application_controller.rb
before_filter :set_agent
def set_agent
if session[:agent]
@agent = Mechanize.new
cookies = Marshal.load session[:agent]
cookies.each {|i| @agent.cookie_jar.store.add i}
end
end