Как на Python воспроизвести данный запрос?
Мне нужно для бота подделать запрос на Python, можете помочь? Он идёт POST на URL сайта.
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="_token"
TdeyybaFPhaR1k7pr5FGJpKS7cU0725Nc7Jh0ybD
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="form-uuid"
24847050-cac4-11eb-a4ee-1d06efa0bce0
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="id"
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="product_id"
296482
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="package_id"
74526282
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="subregion_id"
3295578
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="storage_type_id"
3
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="links[1]"
gh
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="backups[1]"
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="photos[1][]"; filename=""
Content-Type: application/octet-stream
-----------------------------20867129232840302252522427412
Content-Disposition: form-data; name="backups[0]"
-----------------------------20867129232840302252522427412--
Ответы (2 шт):
Автор решения: Georgiy
→ Ссылка
Можешь попробовать воспроизвести через requests:
requests POST Multiple Multipart-Encoded Files
А если не получилось, то попробуй эту библиотеку:
И еще есть третий способ отправить запрос, сгенерировать его самому и отправить POST запросом (я тогда не знал про requests_toolbelt, поэтому делюсь своим велосипедом):
import string
from random import sample
import requests
def webkit_gen():
return "WebKitFormBoundary"+''.join(sample(string.ascii_letters+string.digits, 16))
def payload(webkit, attr):
text = f'''------{webkit}
Content-Disposition: form-data; name="foo"
{attr}
------{webkit}
Content-Disposition: form-data; name="ItemFoo"
submit
------{webkit}--'''
return text
s = requests.Session()
webkit = webkit_gen()
text = payload(webkit, "bar").encode('utf-8')
s.headers.update({"Content-Type":f"multipart/form-data; boundary=----{webkit}"})
r = s.post("https://httpbin.org/post", data=text)
s.close()
Автор решения: gil9red
→ Ссылка
Этот формат называется multipart/form-data и чтобы requests данные отправил в нем нужно заполнять их в параметре files
Пример:
import requests
data = {
'_token': '123',
'package_id': 74526282,
'links[1]': 'gh',
}
rs = requests.post('https://httpbin.org/post', files=data)
print(rs.json())
Чтобы проверить работу, можно включить логирование запроса:
# These two lines enable debugging at httplib level (requests->urllib3->http.client)
# You will see the REQUEST, including HEADERS and DATA, and RESPONSE with HEADERS but without DATA.
# The only thing missing will be the response.body which is not logged.
try:
import http.client as http_client
except ImportError:
# Python 2
import httplib as http_client
http_client.HTTPConnection.debuglevel = 1
# You must initialize logging, otherwise you'll not see debug output.
import logging
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True
И код выше отправил данные такого формата, что похоже на то, что в вопросе:
...
send: b'--73ae5aca91f5e13eee442ec51867590c\r\nContent-Disposition: form-data; name="_token"; filename="_token"\r\n\r\n123\r\n--73ae5aca91f5e13eee442ec51867590c\r\nContent-Disposition: form-data; name="package_id"; filename="package_id"\r\n\r\n74526282\r\n--73ae5aca91f5e13eee442ec51867590c\r\nContent-Disposition: form-data; name="links[1]"; filename="links[1]"\r\n\r\ngh\r\n--73ae5aca91f5e13eee442ec51867590c--\r\n'
...