Python Запрашивает логин: у меня ошибка 403, но запрос выглядит правильно - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь войти в www.zalando.it, используя библиотеку запросов, но каждый раз, когда я пытаюсь опубликовать свои данные, я получаю ошибку 403. Я видел на вкладке сети от Zalando и вход в систему вызова и то же самое. Это просто фиктивные данные, вы можете протестировать создание тестовой учетной записи.

Вот код для функции входа в систему:

import requests
import pickle
import json

session = requests.session()
headers1 = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
r = session.get('https://www.zalando.it/', headers = headers1)
cookies = r.cookies

url = 'https://www.zalando.it/api/reef/login'   
payload = {'username': "email@email.it", 'password': "password", 'wnaMode': "shop"}
headers = {
    'x-xsrf-token': cookies['frsx'],
    #'_abck': str(cookies['_abck']),
    'usercentrics_enabled' : 'true',
    'Connection': 'keep-alive',
    'Content-Type':'application/json; charset=utf-8',
    'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36",
    'origin':'https://www.zalando.it',
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Credentials': 'true',
    'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE,OPTIONS',
    'Access-Control-Allow-Headers': 'Origin,X-Requested-With,Content-Type,Accept,content-type,application/json',
    'sec-fetch-mode': 'no-cors',
    'sec-fetch-site': 'same-origin',
    'accept': '*/*',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7',
    'dpr': '1.3125',
    'referer': 'https://www.zalando.it/uomo-home/',
    'viewport-width': '1464'
    }
x = session.post(url, data = json.dumps(payload), headers = headers, cookies = cookies)
print(x) #error 403
print(x.text) #page that show 403

Ответы [ 2 ]

3 голосов
/ 26 апреля 2020

Для первоначального запроса он должен выглядеть как фактический запрос браузера, после этого заголовки необходимо изменить так, чтобы он выглядел как xhr (Ajax) . Кроме того, есть некоторые заголовки ответа, которые необходимо добавить к будущим запросам к серверу, а также файлы cookie, такие как идентификатор клиента и токен xsrf .

. Вот пример кода, который в настоящее время работает:

import requests

# first load the home page
home_page_link = "https://www.zalando.it/"
login_api_schema = "https://www.zalando.it/api/reef/login/schema"
login_api_post = "https://www.zalando.it/api/reef/login"

headers = {
    'Host': 'www.zalando.it',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Accept-Encoding': 'gzip, deflate',
    'DNT': '1',
    'Connection' : 'close',
    'Upgrade-Insecure-Requests': '1'
}


if __name__ == '__main__':

    with requests.Session() as s:
        s.headers.update(headers)

        r = s.get(home_page_link)

        # fetch these cookies: frsx, Zalando-Client-Id
        cookie_dict = s.cookies.get_dict()
        # update the headers
        # remove this header for the xhr requests
        del s.headers['Upgrade-Insecure-Requests']
        # these 2 are taken from some response cookies
        s.headers['x-xsrf-token'] = cookie_dict['frsx']
        s.headers['x-zalando-client-id'] = cookie_dict['Zalando-Client-Id']
        # i didn't pay attention to where these came from
        # just saw them and manually added them
        s.headers['x-zalando-render-page-uri'] = '/'
        s.headers['x-zalando-request-uri'] = '/'
        # this is sent as a response header and is needed to 
        # track future requests/responses
        s.headers['x-flow-id'] = r.headers['X-Flow-Id']
        # only accept json data from xhr requests
        s.headers['Accept'] = 'application/json'

        # when clicking the login button this request is sent 
        # i didn't test without this request
        r = s.get(login_api_schema)

        # add an origin header
        s.headers['Origin'] = 'https://www.zalando.it'
        # finally log in, this should return a 201 response with a cookie
        login_data = {"username":"email@email.it","password":"password","wnaMode":"modal"}
        r = s.post(login_api_post, json=login_data)
        print(r.status_code)
        print(r.headers)
1 голос
/ 25 апреля 2020

Ну, мне кажется, что этот веб-сайт защищен Akamai (выглядит как Akamai Bot Manager ).

Видите, что Server: AkamaiGHost в заголовках ответа /api/reef/login, когда Вы получаете ответ 403?
Кроме того, посмотрите на запросы, отправленные во время законного сеанса браузера: много запросов отправлено на /static/{some unique ID}, некоторые из них sensor_data, включая ваш пользовательский агент и некоторые другие " gibberi sh ".

Похоже, что приведенное выше описание подходит к этому:

BMP SDK собирает поведенческие данные, когда пользователь взаимодействует с приложением. Эти поведенческие данные, также известные как данные датчиков, включают характеристики устройства, ориентацию устройства, данные акселерометра, события касания и т. Д. c. Ссылка: BMP SDK

Кроме того, этот ответ подтверждает , что некоторые файлы cookie, установленные этим сайтом, действительно принадлежат Akamai Bot Manager.

Ну, я не уверен, есть ли простой способ обойти это. В конце концов, это продукт, разработанный специально для этой цели - блокируйте веб-ботов, как у вас.

...