Net::HTTPNotFound for https://dashboard.stripe.com/login -- 未处理的响应

Net::HTTPNotFound for https://dashboard.stripe.com/login -- unhandled response

我们需要检索特定时间段内 Stripe 实例的日志访问权限。那里没有端点 API (grrrr) 所以我们正在尝试快速抓取屏幕,因为仪表板很好地构建了它们。

此时我什至无法使用 Mechanize 登录 Stripe。下面是我用来登录的代码

require 'mechanize'

agent = Mechanize.new
agent.user_agent_alias = 'Mac Safari'
agent.follow_meta_refresh = true

starting_link = 'https://dashboard.stripe.com/login'

page = agent.get(starting_link)
login_form = page.form

login_form.email = email
login_form.password = pass

new_page = agent.submit(login_form, login_form.buttons[0])

我从 运行 得到的回复是:

Mechanize::ResponseCodeError: 404 => Net::HTTPNotFound for      https://dashboard.stripe.com/login -- unhandled response
from /Users/Nicholas/.rvm/gems/ruby-2.2.2/gems/mechanize-2.7.4/lib/mechanize/http/agent.rb:316:in `fetch'
from /Users/Nicholas/.rvm/gems/ruby-2.2.2/gems/mechanize-2.7.4/lib/mechanize.rb:1323:in `post_form'
from /Users/Nicholas/.rvm/gems/ruby-2.2.2/gems/mechanize-2.7.4/lib/mechanize.rb:584:in `submit'
from (irb):21
from /Users/Nicholas/.rvm/rubies/ruby-2.2.2/bin/irb:11:in `<main>'

我尝试登录其他几个网站并成功。我还给代理起了别名并处理了重定向(其他问题中提到的策略)。

有谁知道可以对 Mechanize 登录 Stripe 进行哪些调整?

非常感谢

简答:

我建议使用像 Selenium 这样的浏览器引擎来获取日志数据,因为那样会简单得多。

长答案:

虽然您的 mechanize 表单提交代码是正确的,但假设 Stripe 登录表单是使用正常的 POST 请求提交的,但事实并非如此。

正在使用 AJAX 请求提交 Stripe 登录表单。

这是考虑到这一点的工作代码:

require 'mechanize'

agent = Mechanize.new
agent.user_agent_alias = 'Mac Safari'
agent.follow_meta_refresh = true

starting_link = 'https://dashboard.stripe.com/login'

page = agent.get(starting_link)
login_form = page.form

login_form.action = 'https://dashboard.stripe.com/ajax/sessions'
login_form.email = email
login_form.password = password

new_page = agent.submit(login_form, login_form.buttons[0])

如您所见,只需将表单的操作 属性 设置为 AJAX url 即可解决您的问题。

但是,一旦您成功登录,就无法使用 mechanize 在站点中导航以抓取日志,因为它不支持 javascript。您可以通过请求仪表板的 url 来检查。您将收到启用 javascript.

的错误消息

此外,Stripe 的仪表板已完全 javascript 供电。它只是发出 AJAX 请求从服务器获取数据,然后将其呈现为 HTML.

这对您有用,因为服务器响应是 JSON。您可以简单地解析它并从日志中获取所需的信息。

经过进一步检查(在 Chrome 开发人员工具中),我发现日志是从 url https://dashboard.stripe.com/ajax/logs?count=5&include%5B%5D=total_count&limit=10&method=not_get

请求的

同样,如果您尝试使用 mechanize 访问此 url,您将 运行 陷入 CSRF 令牌问题,该问题由 Stripe.

CSRF 令牌问题可以使用 mechanize cookie 解决,但不值得付出努力。

我建议使用像 Selenium 这样的浏览器引擎来获取日志数据,因为那样会简单得多。