Найти - Пользователи
Полная версия: Как в отправить "multipart/form-data" в requests
Начало » Web » Как в отправить "multipart/form-data" в requests
1
agryn
Хочу для одного форума настроить автоматический постинг.
Вот что проснифил в отправляемом браузером сообщении (без заголовеов):
-----------------------------37827316415720266761686078786
Content-Disposition: form-data; name="editId"
-----------------------------37827316415720266761686078786
Content-Disposition: form-data; name="parentid"
0
-----------------------------37827316415720266761686078786
Content-Disposition: form-data; name="topicid"
1822066
-----------------------------37827316415720266761686078786
Content-Disposition: form-data; name="userId"
16856
-----------------------------37827316415720266761686078786
Content-Disposition: form-data; name="title"
0
-----------------------------37827316415720266761686078786
Content-Disposition: form-data; name="message"
 *[s2_246.gif]* 
-----------------------------37827316415720266761686078786--
Данные отправляются с помощю “multipart/form-data”
Сам текст какой нужен я сгенерирую но как “ето” запаковать в “multipart/form-data” (конкретно в requests)
odnochlen
http://www.google.com/search?q=python+%22requests%22+multipart+post

http://stackoverflow.com/questions/12385179/how-to-send-a-multipart-form-data-with-requests-in-python

Вообще, конечно, по-дурацки сделано. Надо было это указать явно.
agryn
Спасибо за ссылку
odnochlen
http://stackoverflow.com/questions/12385179/how-to-send-a-multipart-form-data-with-requests-in-python
Очень приятно, так как этот вопрос на stackoverflow тоже я задал.
Правда пока не дошли руки попробовать.
agryn
Когда формирую запрос таким способом
tt = secondby_bot.post(urlbase[:-1] + topicidlink, files=dict(editId='', parentid='0', topicid=topicid, userId=userid, title='0', message='*[s2_246.gif]* '))
то при снифинге вижу такое:
Content-Type: multipart/form-data; boundary=cb17d41241624beabee5e3cb002e5e62....--cb17d41241624beabee5
  e3cb002e5e62..Content-Disposition: form-data; name="topicid"; filename="topicid"..Content-Type: application/octet-stream....1822066..--cb17d41241624beabee5e3cb002e5e62..Conten
  t-Disposition: form-data; name="editId"; filename="editId"..Content-Type: application/octet-stream......--cb17d41241624beabee5e3cb002e5e62..Content-Disposition: form-data; nam
  e="parentid"; filename="parentid"..Content-Type: application/octet-stream....0..--cb17d41241624beabee5e3cb002e5e62..Content-Disposition: form-data; name="message"; filename="m
  essage"..Content-Type: application/octet-stream....*[s2_246.gif]* ..--cb17d41241624beabee5e3cb002e5e62..Content-Disposition: form-data; name="title"; filename="title"..Content
  -Type: application/octet-stream....0..--cb17d41241624beabee5e3cb002e5e62..Content-Disposition: form-data; name="userId"; filename="userId"..Content-Type: application/octet-str
  eam....16856..--cb17d41241624beabee5e3cb002e5e62
тоесть вопрос открыт
На stackoverflow.com также подсказки не дали.
omatic
agryn, решили как-то вопрос? Тоже столкнулся с передачей multipart/form-data в requests и нигде немогу найти примера как правильно передать. Может у Вас найдутся заготовки?

P.S. для себя решил задачку таким способом: в data добавил словарь с данными для отправки в формы, и вставил пустой атрибут files, тогда отправляются multipart/form-data:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
def main():
	postdata = {
		"TopicTitle" : 'test',
		"TopicDesc" : 'test',
		"Post" : 'test'
	}
	headers = {
		'User-Agent' : 'Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0',
		'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
		'Accept-Language' : 'en-US,en;q=0.5',
		'Accept-Encoding' : 'gzip, deflate'
	}
	s = requests.Session()
	q = s.post('http://forum.com/index.php?', headers=headers, data=postdata, files={'':''})
if __name__ == '__main__':
    main()
Master_Sergius
Посмотрите на VirusTotal, там есть Public API с приемом файлов в multipart/form-data encoding. При этом надо пересылать токен. Вот так Я решил задачу через requests:

 #-*- coding: utf-8 -*-
import requests
file_scan_url = "https://www.virustotal.com/vtapi/v2/file/scan"
apikey = "--- ENTER YOUR API KEY ---"
def scan_files(scan_url):
     files = [('file', ('sample.txt', open('sample.txt', 'rb'))),
               ('file', ('sample2.txt', open('sample2.txt', 'rb')))]
     return requests.post(scan_url, data={'apikey':apikey}, files=files)

Это тестовый уродливый скриптик, далее уже всё пристроено как надо. Но, вот что с pdb получаем:
 (Pdb) resp = scan_files(file_scan_url)
(Pdb) resp
<Response [200]>
(Pdb) resp.text
u'{"scan_id": "27d2315007c22348f8296eea3e2c9398d113c6101382198bc72e5eff9d890754-1470328055", "sha1": "d35926bd15d15309464d773d258d2deb3de664d6", "resource": "27d2315007c22348f8296eea3e2c9398d113c6101382198bc72e5eff9d890754", "response_code": 1, "sha256": "27d2315007c22348f8296eea3e2c9398d113c6101382198bc72e5eff9d890754", "permalink": "https://www.virustotal.com/file/27d2315007c22348f8296eea3e2c9398d113c6101382198bc72e5eff9d890754/analysis/1470328055/", "md5": "7b9ea15294d153f42e30adff30cf503e", "verbose_msg": "Scan request successfully queued, come back later for the report"}'

Может быть, это вам как-то поможет. П.С. в каждом тупле первый элемент ‘file’ - ибо именно так называется нужное поле для приема тем сервисом (см. документацию).
Ах, ещё прикол - VirusTotal таки принимает по одному файлу за раз, поэтому оно приняло как раз последний файл. Но, всё же, оно прошло.

п.с. напомните пожалуйста, почему на форуме всегда первая строка кода сдвигается вправо на один символ и как сделать пробелы между строками
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB