Python Requests Login to Login With Amazon to get

2019-08-17 17:00发布

问题:

I am trying to use python requests to receive my access token for the Amazon Advertising API. The procedure is outlined here: https://advertising.amazon.com/API/docs/v2/guides/authorization Here is what I tried

CLIENT_ID = MyClientID
CLIENT_SECRET = MySecret
RETURN_URL = 'https://myreturn.com/my.php'

headers = {
           'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.61 Safari/537.36',
          }

with requests.Session() as s:
    s.headers = headers
    r = s.get('https://www.amazon.com/ap/oa?client_id={}&scope=cpc_advertising:campaign_management&error=access_denied&response_type=code&redirect_uri={}'.format(CLIENT_ID,RETURN_URL),headers=headers)
    soup = BeautifulSoup(html)
    data = {}
    form = soup.find('form', {'name': 'signIn'})
    for field in form.find_all('input'):
        try:
            data[field['name']] = field['value']
        except:
            pass
    data[u'email'] = MY_EMAIL
    data[u'password'] = MY_PASS
    b = s.post('https://www.amazon.com/ap/oa?client_id={}&scope=cpc_advertising:campaign_management&response_type=code&redirect_uri={}',data=data,allow_redirects=True,headers=headers)

i get an error_description=User+not+authenticated&error=access_denied error, what am I doing wrong here?

回答1:

I actually just started down this road as well, and it's a bit tricky because nearly all of the documentation available is for the similarly named Amazon Product Advertising API.

While I don't have an exact answer, I think the immediate issue is that you are posting to the original URL, but Amazon handles the login request at the url: https://www.amazon.com/ap/signin

If you change the url to https://www.amazon.com/ap/signin Amazon will likely hit you with a captcha as their automation detection is pretty strict.

You need to enable cookies to avoid the captcha, but if you have 2FA on you will be hit with that as well. I'll update this in a few minutes when I figure out the best solution for the cookies+2fa.

import requests
from bs4 import BeautifulSoup

client_email = EMAIL
client_pass = POSS
client_id = CLIENT_ID
return_url = RETURN_URL  # I'm not convinced this matters

# I just copied these values from my browser
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-US,en;q=0.5',
'cache-control': 'max-age=0',
'referer': 'https://www.amazon.com/gp/sign-in.html',
'upgrade-insecure-requests': '1'
}
url = 'https://www.amazon.com/ap/oa?client_id=' + client_id + '&scope=cpc_advertising:campaign_management&' \
                                                          'response_type=code&redirect_uri=' + return_url

with requests.session() as s:
response = s.get(url, headers=headers)
cookies = dict(response.cookies)
soup = BeautifulSoup(response.text, 'html.parser')
data = {}
form = soup.find('form', {'name': 'signIn'})
for field in form.find_all('input'):
    try:
        data[field['name']] = field['value']
    except:
        pass

data[u'email'] = client_email
data[u'password'] = client_pass

post_resp = s.post('https://www.amazon.com/ap/signin', data=data, headers=headers, cookies=cookies)

I was able to figure out how to automate this process. Message me for more info.



回答2:

You DON'T NEED Username and Password in your Python Script to authenticate! What you need is CLIENT_ID, SCOPE and REDIRECT_URI and three requests:

  1. Get authorization code:

    GET https://www.amazon.com/ap/oa?client_id={{CLIENT_ID}}&scope={{SCOPE}}&response_type=code&redirect_uri={{REDIRECT_URI}}

This will open the 'Login with Amazon' Consent Page, where you (or your customer) log into your Amazon Seller Central account and grant access to the Console APP with API access rights.

  1. Request tokens

    POST https://api.amazon.com/auth/o2/token

    with headers:

    Content-Type:application/x-www-form-urlencoded

    with body data:

    grant_type:authorization_code
    code:{{AUTH_CODE}}    <----- returned from step 1
    client_id:{{CLIENT_ID}}
    client_secret:{{CLIENT_SECRET}}
    redirect_uri:{{REDIRECT_URI}}
    
  2. Get/Refresh access token (every time it is outdated):

    POST https://api.amazon.com/auth/o2/token

    with headers:

    Content-Type:application/x-www-form-urlencoded
    charset:UTF-8
    

    with body data:

    grant_type:refresh_token
    refresh_token:{{REFRESH_TOKEN}}   <------ returned from step 2
    client_id:{{CLIENT_ID}}
    client_secret:{{CLIENT_SECRET}}
    

  1. With the CLIENT_ID and (fresh) access token you can now request every service from the API. For excample listCampaigns:

    GET https://advertising-api.amazon.com/v2/sp/campaigns

    Headers:

    Content-Type:application/json
    Amazon-Advertising-API-ClientId:{{CLIENT_ID}}
    Amazon-Advertising-API-Scope:{{PROFILE_ID}}
    Authorization:Bearer {{ACCESS_TOKEN}}   <----- returned from step 3