【问题标题】:Ruby HTTP get call again site that requires an active sessionRuby HTTP 再次调用需要活动会话的站点
【发布时间】:2016-08-04 21:15:16
【问题描述】:

我正在尝试获取https://www.google.com/webmasters/tools/index-status?hl=en&authuser=0&siteUrl=xxx 的源代码,以获取由于某种原因未通过webmasters v3 API 公开的索引状态编号。

现在我不能只打一个HTTParty.get(url) 电话,因为这只会让我重定向到帐户登录页面 (https://accounts.google.com/ServiceLogin?xxxxxx)。如果我运行 HTTParty.get(url, {follow_redirects: false}) 我会收到 302 错误,因为该页面无法将我重定向到 Google 的登录页面。

基本上问题是:是否可以获取我现有的登录 cookie 并将其提供给脚本,或者让脚本“登录”然后存储会话 cookie?

后半部分主要包括:

  • 致电https://accounts.google.com
  • POST 提交登录表单
  • 等待响应,保存 cookie
  • 使用该会话转到上述搜索控制台 URL

【问题讨论】:

  • 请阅读“How to Ask”和链接页面。如果您在使用代码时遇到问题,请阅读“minimal reproducible example”。我们需要更好地描述问题。我们需要更好地了解您是如何做到这一点的。你看过使用Mechanize 吗?它旨在帮助浏览网站并为您处理 cookie。
  • 谢谢。使用 Mechanize,我能够获取我的 google 会话并抓取我需要的网站。

标签: ruby session authentication cookies get


【解决方案1】:

是的,可以使用您的 cookie 并将其发送。这就是浏览器的工作原理。

来自Wikipedia

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123
…

要弄清楚到底发生了什么,需要做一些工作。我建议查看浏览器上的“网络”选项卡以查看每个 HTTP 请求。

【讨论】:

    【解决方案2】:

    感谢@the-tin-man 建议mechanize。对于其他希望如何为您需要的任何服务获取有效 google 会话的人:

    agent = Mechanize.new
    login_page = agent.get("https://accounts.google.com")
    login_form1 = login_page.form
    login_form1.Email = "your_google_email_here"
    login_form2 = login_form1.click_button
    login_form2.form.Passwd = "your_google_password"
    login_form2.form.click_button
    #at this point you have a valid google session so the next part is specific for my needs
    search_console_page = agent.get("https://www.google.com/webmasters/tools/index-status?hl=en&authuser=0&siteUrl=xxx")
    total_indexed = search_console_page.search("td.property div.primary").inner_html.gsub(',', '').to_i
    

    现在我只需要弄清楚如何将该 cookie 永久存储在某个地方,这样我就不必每次使用它时都登录。

    【讨论】:

    • YAML 是一种很好的候选格式。只需将信息存储在与您的源代码相关的文件中。 YAML 类易于使用,并且随 Ruby 一起提供。有很多在 SO 上使用它的例子。如果您不想让窥探者轻易看到它,那么基于磁盘的 SQLite DB 会更安全一些。 Sequel 让这一切变得简单。如果您更加偏执,您可以对其进行加密和解密,但如果源可用,那将是浪费时间。
    • 如果谷歌有一个相关的 API 来处理你想要抓取的任何东西,你最好使用它。刮擦是最后的尝试,更容易失败。
    • 正如我提到的,这个特定的数据点不是 API 的一部分,所以我不得不求助于抓取。感谢您提供 YAML 提示,我将对此进行调查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2021-12-09
    相关资源
    最近更新 更多