ruby-on-rails-3 - Rails 3 - 登录另一个站点并在 session 中保留 cookie

标签 ruby-on-rails-3 cookies mechanize

我正在制作一个小应用程序,它允许用户登录到一个没有足够 API 的半流行社交网站,所以我使用 mechanize gem 来自动化一些我想添加的功能任何人都可以使用,例如群发消息。

由于 API 的限制,我不得不假装是与站点的 http 接口(interface)交互的用户来执行此操作。

我遇到的问题是,一旦用户登录到我的网站,我如何才能将来自社交网站的 cookie 有状态地保存在 session 中,这样他们就不需要为每个页面加载输入凭据?

我试图从 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

最佳答案

不要存储代理,只存储 session cookie。找到您要捕获的 cookie 的名称。登录后,从 Mechanize cookie jar 中获取它,将其存储在 session 中,并确保在每次“API 请求”之前它都在 cookie jar 中。

关于ruby-on-rails-3 - Rails 3 - 登录另一个站点并在 session 中保留 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17005921/

相关文章:

ruby-on-rails - 在 652ms 内完成 200 OK (Views : 50. 9ms | ActiveRecord : 18. 3ms)

ruby-on-rails - 通过 mTurk 对实时结果进行 Rspec 测试

javascript - 如何使用 cookie 更改 css <link href ="#">?

Magento 1.7 "Cookie Restriction Mode"符合欧盟标准

ruby-on-rails - 将变量放入字符串中,它不起作用?

python - 如何在 Selenium 中使用命令行选项启动 PhantomJS?

python - 有没有办法判断用 Mechanize 打开的页面是否没有返回 "search results"?

ruby - 恢复网络::ERR_CONNECTION_SET Mechanize ruby

python - 代理似乎被 Mechanize 忽略了?

ruby-on-rails - Rails file_field_tag 不上传文件