#python #python-requests
Вопрос:
Я получаю код статуса 419 страниц с истекшим сроком действия при использовании запросов на этом сайте. Я собрал информацию для заголовков и данных, отслеживая вкладку «Сеть» консоли разработчика. Как я могу использовать модуль запросов Python для успешного входа в систему?
import requests url = 'https://rates.itgtrans.com/login' headers = { 'authority': 'rates.itgtrans.com', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'origin': 'https://rates.itgtrans.com', 'content-type': 'application/x-www-form-urlencoded', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36', 'accept': 'text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'sec-fetch-site': 'same-origin', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'referer': 'https://rates.itgtrans.com/login', 'accept-language': 'en-US,en;q=0.9', 'cookie': 'XSRF-TOKEN=eyJpdiI6IkEzbi9JQkVwbWloZTM1UVdSdVJtK0E9PSIsInZhbHVlIjoiM1pxQVYxajhPcWdlZ1NlYlVMSUlyQzFISVpPNjNrMVB0UmNYMXZGa0crSmYycURoem1vR0FzRUMrNjB2bXFPbCs4U3ZyeGM4ZVNLZ1NjRGVmditUMldNUUNmYmVzeTY2WS85VC93a1c0M0JUMk1Jek00TTNLVnlPb2VVRXpiN0ciLCJtYWMiOiJkNjQyMTMwMGRmZmQ4YTg0ZTNhZDgzODQ5M2NiMmE2ODdlYjRlOTIyMWE5Yjg4YzEyMTBjNTI2ODQxY2YxMzNkIiwidGFnIjoiIn0=; draymaster_session=eyJpdiI6Im9vUDZabmlYSTY0a1lSNGdYZzZHT0E9PSIsInZhbHVlIjoiMGVVcSs2T3RheGhMeDNVVFJUQjRmb212TkoySVY5eWFjeVNHT1lGWE9sRHdtR3JTa0REZFhMTzNJeisyTjNOZ1hrQnNscWY0dXBheFFaRFhIdDAvUlFMOFdvTFdaOXBoejcwb2ZDNFNMdDZ6MUFxT2dHU3hlNVkxZmpiTnd2Z0QiLCJtYWMiOiIwN2RmZTc1ZDUzYzViYTgzYWU1MjFjNjIxZjYzMzY3MDE0YjI4MDhkMWMwMTVkYmYxYWM2MzQ0ODM1YzRkNDY1IiwidGFnIjoiIn0=' } data = { '_token': 'o8jJ4tR3PHkuz5TR2kuoHwBAdHd5RczFx2rlul1C', 'email': '****', 'password': '****', 'button': '' } with requests.Session() as s: cookies = s.cookies p = s.post(url='https://rates.itgtrans.com/login', data=data, headers=headers, cookies=cookies) print(p)
Комментарии:
1. если вы используете
Session()
, то вам не нужно устанавливать вручнуюcookies
, потомуSession()
что вы должны делать это автоматически. Но будет лучше, если вы сначала получите главную страницу, чтобы получить свежие файлы cookie с сервера. Некоторые файлы cookie действительны только короткое время, и вам необходимо получить свежие значения с сервера. То же самое может быть и с_token
— сервер может хранить его в базе данных в течение короткого времени и проверять в базе данных, если он все еще действителен.2. Я только что проверил и убедился, что файлы cookie и токен для ПОЛУЧЕНИЯ совпадают с СООБЩЕНИЕМ. Так что это должно быть что-то другое.
3. ты проверял
p.text
? Это показываетPage Expired
, и это может быть проблемой, потому что он может использовать истекший_token
срок действия . И когда я запускаю GET, я получаю HTML, который всегда отличается_token
, потому что страница генерирует новый токен для каждого запроса, и он может быть действителен всего несколько минут — все по соображениям безопасности.
Ответ №1:
Что касается меня, то вся проблема в том, что вы всегда используете одно и то же _token
.
Сервер для каждого пользователя должен генерировать новый токен uniq, который действителен всего несколько минут — все по соображениям безопасности (чтобы хакер не мог получить его и использовать через более длительное время).
Кстати: пошел я запускаю ваш код и получаю страницу со статусом 419
и отображением p.text
, затем я вижу HTML с текстом Page Expired
, который может подтвердить, что вы используете токен с истекшим сроком действия.
Вы должны всегда GET
посещать эту страницу и искать новый токен в HTML
lt;input name="_token" type="hidden" value="Xz0pJ0djGVnfaRMuXNDGMdBmZRbc55Ql2Q2CTPit"/gt;
и используйте это значение в POST
У меня нет учетной записи на этой странице, но, используя новый токен, lt;input name="_token"gt;
я получаю статус 200
вместо 419
.
import requests from bs4 import BeautifulSoup url = 'https://rates.itgtrans.com/login' headers = { 'authority': 'rates.itgtrans.com', 'cache-control': 'max-age=0', 'origin': 'https://rates.itgtrans.com', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36', 'accept': 'text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'referer': 'https://rates.itgtrans.com/login', 'accept-language': 'en-US,en;q=0.9', } data = { '_token': '-empty-', 'email': '****', 'password': '****', 'button': '' } with requests.Session() as s: # --- first GET page --- response = s.get(url='https://rates.itgtrans.com/login', headers=headers) #print(response.text) # --- search fresh token in HTML --- soup = BeautifulSoup(response.text) token = soup.find('input', {'name': "_token"})['value'] print('token:', token) # --- run POST with new token --- data['_token'] = token response = s.post(url='https://rates.itgtrans.com/login', data=data, headers=headers) #print(response.text) print('status_code:', response.status_code)
кстати:
Я получаю 200
, даже если не пользуюсь headers
.
Потому что код использует Session
, поэтому мне не нужно копировать файлы cookie из GET
в POST
, потому Session
что они автоматически копируются.
Комментарии:
1. Спасибо. Ранее я просматривал токен на вкладке «Сеть» после входа в систему. Я думал, что это то же самое. Но ваш код работал идеально, так что в конце концов в этом и была проблема.