Я получаю код состояния с истекшим сроком действия 419 страниц при попытке использовать запросы. Как мне успешно войти в систему?

#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. Спасибо. Ранее я просматривал токен на вкладке «Сеть» после входа в систему. Я думал, что это то же самое. Но ваш код работал идеально, так что в конце концов в этом и была проблема.