我尝试登录亚马逊合作伙伴网,例如https://partnernet.amazon.de/使用 Ruby Mechanize gem:
gem 文件:
# https://github.com/sparklemotion/mechanize
gem 'mechanize'
下面的代码是一个 rake 任务。它在过去有效,我认为亚马逊更改了页面 html,因此此代码不再有效,例如通过将表单 name="sign_in"的提交按钮更改为 image type=input。
desc "Cron Task for Email Notifications"
task :email_amazon_stats => :environment do
puts "Start: Fetch and send Amazon Sales from yesterday (#{Time.now})"
# login to Amazon Partnernet
a = Mechanize.new
a.user_agent_alias = 'Mac Safari'
a.follow_meta_refresh = true
a.redirect_ok = true
a.get('https://partnernet.amazon.de/') do |page|
# Submit the login form
page.form_with(:name => 'sign_in') do |f|
username_field = f.field_with(:id => "username")
username_field.value = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9efbf3fff7f2defbe6fff3eef2fbb0fdf1f3" rel="noreferrer noopener nofollow">[email protected]</a>"
password_field = f.field_with(:id => "password")
password_field.value = "somepassword"
end.submit
start_date = Time.now - 1.day
end_date = Time.now
my_page2 = a.get("https://partnernet.amazon.de/gp/associates/network/reports/report.html?ie=UTF8&deviceType=all&endDay=#{(end_date.strftime('%d').to_i).to_s}&endMonth=#{((end_date.strftime('%m').to_i)-1).to_s}&endYear=#{end_date.strftime('%Y').to_i.to_s}&periodType=exact&preSelectedPeriod=monthToDate&program=all&reportType=earningsReport&startDay=#{start_date.strftime('%d').to_i.to_s}&startMonth=#{((start_date.strftime('%m').to_i)-1).to_s}&startYear=#{start_date.strftime('%Y').to_s}")
form = my_page2.form_with(:name => 'htmlReport')
button = form.button_with(:name => 'submit.download_XML')
xml = a.submit(form, button)
# ASIN="3423347570"
# Binding="paperback"
# Category="14"
# Date="December 01, 2015"
# DeviceType="BROWSER"
# EDate="1448928000"
# Earnings="0,65"
# LinkType="asn"
# Price="9,25"
# Qty="1"
# Rate="7,03"
# Revenue="9,25"
# Seller="Amazon.de"
# Tag="yx-21"
# Title="Kopf schlägt Kapital: Die ganz andere Art, ein Unternehmen zu gründen Von der Lust, ein Entrepreneur zu sein (dtv Sachbuch)"/>
doc = Nokogiri::XML(xml.body)
@sales = []
doc.xpath("//Item").each do |item|
@sales << {
:sale_itemasin => item['ASIN'],
:sale_itemname => item['Title'].truncate(80),
:sale_date => Time.at(item['EDate'].to_i).strftime("%Y-%m-%d %H:%M:%S").to_s,
:sale_amount => '%.2f' % item['Revenue'].gsub(',','.').to_f,
:sale_commission => '%.2f' % item['Earnings'].gsub(',','.').to_f
}
end
earnings = 0
@sales.each do |s|
earnings += s[:sale_commission].to_f
end
@total_commission = '%.2f' % earnings
end
ReportsMailer.daily_dashboard(@total_commission,@sales).deliver
puts "Done: Fetch and send Amazon Sales from yesterday (#{Time.now})"
end
有人可以帮我吗?
--
我寻找类似的问题如何重组提交,但到目前为止没有任何效果。登录没有发生。 (是的,PWD 是正确的:-) )
类似的问题,但没有解决上面的问题:Cannot Login to Amazon with Ruby Mechanize
最佳答案
所以..我调试了代码,这个版本现在可以按预期工作:
desc "Cron Task for Email Notifications"
task :email_amazon_stats => :environment do
puts "Start: Fetch and send Amazon Sales from yesterday (#{Time.now})"
agent = Mechanize.new
agent.cookie_jar.clear!
agent.user_agent_alias = 'Mac Firefox'
agent.follow_meta_refresh = true
agent.redirect_ok = true
dashboard_url = "https://partnernet.amazon.de/gp/associates/network/reports/report.html?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&tag=&reportType=earningsReport&program=all&deviceType=all&periodType=preSelected&preSelectedPeriod=yesterday&startDay=1&startMonth=11&startYear=2016&endDay=2&endMonth=11&endYear=2016&submit.display.x=87&submit.display.y=16&submit.display=Auf+der+Seite+anzeigen"
agent.get(dashboard_url)
form = agent.page.form_with(:name => 'sign_in')
form.username = ENV['AZON_PARTNER_USR']
form.password = ENV['AZON_PARTNER_KEY']
form.submit
dashboard = agent.get(dashboard_url)
form2 = dashboard.form_with(:name => 'htmlReport')
button = form2.button_with(:name => 'submit.download_XML')
xml = agent.submit(form2, button)
doc = Nokogiri::XML(xml.body)
@sales = []
doc.xpath("//Item").each do |item|
@sales << {
:sale_itemasin => item['ASIN'],
:sale_itemname => item['Title'].truncate(80),
:sale_date => Time.at(item['EDate'].to_i).strftime("%Y-%m-%d %H:%M:%S").to_s,
:sale_amount => '%.2f' % item['Revenue'].gsub(',','.').to_f,
:sale_commission => '%.2f' % item['Earnings'].gsub(',','.').to_f
}
end
earnings = 0
@sales.each do |s|
earnings += s[:sale_commission].to_f
end
@total_commission = '%.2f' % earnings
ReportsMailer.daily_dashboard(@total_commission,@sales).deliver
puts "Done: Fetch and send Amazon Sales from yesterday (#{Time.now})"
end
正如您所见,这非常难看,因为我尝试直接转到深层链接,这会将我重定向到登录页面。我在那里登录并再次尝试进入仪表板。这次成功了。为什么丑?因为如果我尝试直接进入登录页面,代码将不起作用,我不知何故需要此重定向。知道为什么吗?了解这一点会很有趣......
关于ruby-on-rails - 使用 Ruby Mechanize 登录亚马逊合作伙伴网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40804750/