Python запрашивает вход в систему с помощью Amazon для получения токена доступа для Amazon Advertising API - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь использовать запросы Python для получения моего токена доступа к Amazon Advertising API.Процедура описана здесь: https://advertising.amazon.com/API/docs/v2/guides/authorization Вот что я пытался

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)

я получаю error_description = Пользователь + не + аутентифицирован & error = access_denied error, что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Вы НЕ НУЖНЫ имя пользователя и пароль в скрипте Python для аутентификации!Вам нужно CLIENT_ID, SCOPE и REDIRECT_URI и три запроса:

  1. Получить код авторизации:

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

Откроется страница согласия «Войти через Amazon», где вы (или ваш клиент) войдете в свою учетную запись Amazon Seller Central и предоставите доступ к Консольному приложению с правами доступа API.

Запрос токенов

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

с заголовками:

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

с данными тела:

grant_type:authorization_code
code:{{AUTH_CODE}}    <----- returned from step 1
client_id:{{CLIENT_ID}}
client_secret:{{CLIENT_SECRET}}
redirect_uri:{{REDIRECT_URI}}

Получить / обновить токен доступа (каждый раз, когда он устарел):

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

с заголовками:

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

с данными тела:

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

С CLIENT_ID и (свежим) токеном доступа вы теперь можете запрашивать каждую услугу у API.Для примера спискаКампании:

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

Заголовки:

Content-Type:application/json
Amazon-Advertising-API-ClientId:{{CLIENT_ID}}
Amazon-Advertising-API-Scope:{{PROFILE_ID}}
Authorization:Bearer {{ACCESS_TOKEN}}   <----- returned from step 3
0 голосов
/ 24 мая 2019

Я на самом деле только начал этот путь, и это немного сложно, потому что почти вся доступная документация относится к одноименному API рекламы продуктов Amazon.

Хотя у меня нет точного ответаЯ думаю, что непосредственная проблема заключается в том, что вы публикуете исходный URL, но Amazon обрабатывает запрос на вход по URL: https://www.amazon.com/ap/signin

Если вы измените URL-адрес на https://www.amazon.com/ap/signin Amazon, скорее всего,ударить вас по капче, так как их автоматическое обнаружение довольно строгое.

Вам нужно включить куки, чтобы избежать капчи, но если у вас есть 2FA на вас, вы также будете поражены этим.Я обновлю это через несколько минут, когда найду лучшее решение для печенья + 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)

Мне удалось выяснить, как автоматизировать этот процесс.Напишите мне для получения дополнительной информации.

...