2016-11-25 67 views
2

我尝试登录到amazon partnernet,例如, https://partnernet.amazon.de/使用Ruby机械化宝石:使用Ruby登录到amazon partnernet机械化

的Gemfile:

# https://github.com/sparklemotion/mechanize 
gem 'mechanize' 

下面的代码是一个rake任务。它工作在过去,我认为亚马逊改变了页面的HTML,所以这段代码不再有效,例如通过将表单名称=“sign_in”的提交按钮更改为图像类型=输入。

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 = "[email protected]" 
     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

回答

2

所以..我调试的代码,现在预期该版本的工作:

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 

正如你可以看到你自己这是非常丑陋的,因为我试图直接进入深层链接,这将重定向到登录页面。在那里我登录并再次尝试去仪表板。这一次它工作。为什么丑陋?因为如果我尝试直接进入登录页面,代码不起作用,我不知何故需要重定向。任何想法为什么?理解这一点会很有趣......