Как отправить данные формы, используя запросы Python? - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь отправить запрос POST, используя python 3 и библиотеку запросов.Когда я использую почтальон, я получаю ожидаемый результат, поэтому копирую код, сгенерированный почтальоном, и таким образом он работает.

Это код, сгенерированный кодом почтальона:

import requests

payload = "name=\"claveElector\"\r\n\r\nABCDEF01234567H400\r\nname=\"numeroEmision\"\r\n\r\n01\r\nname=\"ocr\"\r\n\r\n4158093946570\r\nname=\"g-recaptcha-response\"\r\n\r\nsome-captcha\r\nname=\"modelo\"\r\n\r\na"

url = "https://listanominal.ine.mx/scpln/resultado.html"

payload = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"claveElector\"\r\n\r\nTPRSJC95010209H400\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"numeroEmision\"\r\n\r\n01\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"ocr\"\r\n\r\n4158093946570\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"g-recaptcha-response\"\r\n\r\nsome-re-captcha\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"modelo\"\r\n\r\na\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"
headers = {
    'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)

Чтобы понять, почему не работает, есть разница, которая существует в обоих результатах.

С кодом почтальона я получил это

Этот код генерируется со следующими данными: That code is generated with the following data

ИтакЯ пытался сделать то же самое, используя свой собственный код, я пытался отправить данные в файловой части и в части данных, но не работает.Читая другие вопросы StackOverflow, они предлагают использовать MultipartEncoder, который является частью библиотеки Requests Toolbelt.

Итак, моя реализация закончилась так:

import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder

clave_elector = "ABCDEF01234567H400"
numero_emision = "01"
ocr = "1234567846570"
modelo = "a"

params = {
    "claveElector": clave_elector,
    "numeroEmision": numero_emision,
    "ocr": ocr,
    "modelo": modelo,
    "g-recaptcha-response": ''
}

data = MultipartEncoder(fields = params)

headers = {
    'Content-type': data.content_type
}
response = requests.post(
    'https://listanominal.ine.mx/scpln/resultado.html',
    data = data,
    headers = headers
)
print(response.text)

С пользовательским кодомЯ получил следующее

Если вы попробуете оба кода, вы увидите, как отличаются результаты.И мне интересен первый, тот, который получен с кодом, сгенерированным Почтальоном.

Я не знаю, почему мой код не работает, что я делаю неправильно?Я пытаюсь сказать, что каким-то образом с моим кодом запрос не отправляется должным образом, поэтому веб-сайт не может его прочитать.

1 Ответ

0 голосов
/ 24 июня 2019

После стольких попыток и ошибок единственный способ, который я нашел для этого, заключался в использовании следующего кода:

from requests import Request, Session

clave_elector = "TPRSJC95010209H400"
numero_emision = "01"
ocr = "4158093946570"
modelo = "a"

data = {
    "claveElector": clave_elector,
    "numeroEmision": numero_emision,
    "ocr": ocr,
    "modelo": modelo,
    "g-recaptcha-response": 'hjkkjgh'
}

request = Request(
    'POST', 
    'https://listanominal.ine.mx/scpln/resultado.html',
    files = {
        'claveElector': (None, data['claveElector']),
        'numeroEmision': (None, data['numeroEmision']),
        'ocr': (None, data['ocr']),
        'modelo': (None, data['modelo']),
        'g-recaptcha-response': (None, 'xxx'),
    }
).prepare()


s = Session()
response = s.send(request)

print(response.text)

Я действительно не знаю, почему это отличалось от того, чем я былпытаюсь сделать, но это работает.Если кто-то может прокомментировать, почему это работает, я буду очень признателен.

...