我们需要检索对特定时间段内 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>'
我尝试登录其他几个网站并成功。 我还为代理设置了别名并处理了重定向(其他问题中提到的策略)。
有谁知道机械化登录 Stripe 可以进行哪些调整?
非常感谢
简短回答:
我建议使用像Selenium这样的浏览器引擎来获取日志数据,因为这会简单得多。
长答案:
虽然您的mechanize
表单提交代码是正确的,但它假设Stripe
登录表单是使用正常的POST
请求提交的,但事实并非如此。
Stripe
登录表单正在使用AJAX
请求提交。
以下是考虑到这一点的工作代码:
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开发人员工具中),我发现日志是从网址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这样的浏览器引擎来获取日志数据,因为这会简单得多。