2016-07-30 2 views
1

У меня есть этот скрипт php, который загружает mp3-файл на веб-сайт от имени пользователя. Он хорошо работает, но я хочу, чтобы записать его в Python:Преобразование запроса POST от PHP к Python

$id = $argv[1]; 
$file = $argv[2]; 
$course = $argv[3]; 
$audio_column_number = $argv[4]; 



if(!file_exists($file)) { 
    die(); 
} 

$curlFile = new CURLFile($argv[2]); 
$curlFile->setPostFilename(basename($argv[2])); 
$curlFile->setMimeType("audio/mpeg"); 

$post = array(
    'thing_id' => $id, 
    'cell_id' => $audio_column_number, 
    'cell_type' => 'column', 
    'csrfmiddlewaretoken' => '2N829n66bh5Alhbc463wYtoqpyosyON', 
    'f' => $curlFile, 
); 

$curl = curl_init("http://www.memrise.com/ajax/thing/cell/upload_file/"); 
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_REFERER => $course, 
    CURLOPT_USERAGENT => "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0", 
    CURLOPT_COOKIE => "Cookie:__uvt=; __utmt=6; csrftoken=2N829n66bh5Alhbc463wYtoqpyosyON; sessionid=zj8suxtx841zlwrn10o6x3suzdjw9wpt; __utma=216705802.691983187.1416840006.1429942996.1430039373.8; __utmb=216705802.4.10.1440411307; __utmc=216705802; __utmz=216705802.1416840006.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); uvts=2Mnc8QsWzuuv8GVh", 
    CURLOPT_POST => true, 
    CURLOPT_POSTFIELDS => $post, 
    CURLOPT_TIMEOUT => 60, 
)); 
$res = curl_exec($curl); 

Я пытаюсь преобразовать его в питон. Это кажется довольно простым, хотя. Вот что я пробовал:

import requests 
import sys 

files = {'f': ('f.mp3', open(sys.argv[2], 'rb'), 'audio/mp3')} 
form_data = { 
    "thing_id": sys.argv[1], 
    "cell_id": sys.argv[4], 
    "cell_type": "column", 
    "csrfmiddlewaretoken": "2N829n66bh5Alhbc463wYtoqpyosyON"} 
cookies = { 
    "__uvt":"", 
    "__utmt":"6", 
    "csrftoken":"2N829n66bh5Alhbc463wYtoqpyosyON", 
    "sessionid":"zj8suxtx841zlwrn10o6x3suzdjw9wpt", 
    "__utma":"216705802.691983187.1416840006.1429942996.1430039373.8", 
    "__utmb":"216705802.4.10.1440411307", 
    "__utmc":"216705802", 
    "__utmz":"216705802.1416840006.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)", 
    "uvts":"2Mnc8QsWzuuv8GVh"} 
headers = { 
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0", 
    "referer": sys.argv[3]} 
url = "http://www.memrise.com/ajax/thing/cell/upload_file/" 

r = requests.post(url, files=files, cookies=cookies, headers=headers, timeout=60) 
print(r.text) 

против того, что я ожидал, в то время как PHP скрипт работает отлично, эквивалентный код Python не делает. Сервер отклоняет его и отправляет 403. У меня нет большого опыта работы с PHP, но я старался понять PHP-скрипт. Мне интересно, сможет ли кто-нибудь найти то, что делает скрипт PHP, что не работает сценарий Python. Если это поможет, я использовал это инструменты для разработчиков Chrome, чтобы увидеть пример того, что запрос пост делает на веб-сайте, когда я загрузить файл там:

заголовки:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding:gzip, deflate 
Accept-Language:en-US,en;q=0.8,fr;q=0.6,en-CA;q=0.4 
Cache-Control:max-age=0 
Connection:keep-alive 
Content-Length:4271 
Content-Type:multipart/form-data; boundary=---- WebKitFormBoundarytv2Kbmk1kUAGBVZ1 
Cookie:i18next=en; sessionid=xrxg3zofonxmfmfvoe38gv56mgdefa71; fbm_143688=base_domain=.www.memrise.com; csrftoken=MxIto89I10jvWe45lt5xBJ8xnQkWayh3; fbsr_143688=YBKZYHGnLaxApGPYElgXzoLMgGpF10HWFPMjE4jAq60.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiJBUUR3R1ZibV82V19xTGdzZHFiTTluZXQ3UVdnTjFQdFhJVHpTLWIyQ3dBRnBfVk9vcWNXb2czRlBBVkl0ekpLSE5FbGNNZ2UxelZSV09tVGstODFvZFFPWmdpOUY4TGpVX3ZvNk1VOVRSTEdMVGVrWlQ3Q0Ezd2VwTjJGa044TVltak5rMEt5R2lNTWIzalRPQmlwcFhjeUZ0cS1ROF9zZWlFUDZSc1dwS0l3ZkRFVkRmNWtRb3p2VWtFQUZnZEt5eklKZkZucGozZ3RieTBZakN3bDE0SzB5ZFdDN1JjR3JyNnJQSHZvSzhLUGpJdnE3Ml9YMThybS1aUmZPSDZQNTZqTFhib3ZlSTJLVXctZGtPQUt1TE5SNmRoVUJ4b0hlZmtPSGI2ZTdJcmdtVjdlNlBVeEJuQTZyY05LdW5tLVBVbDZhQTBDTFhONzF4NEg3OHdCejA1dCIsImlzc3VlZF9hdCI6MTQ2OTg1Mzg5NSwidXNlcl9pZCI6IjUwMzc3MTY3OCJ9; _sp_id.7bc7=06d67edb75b91041.1466936153.142.1469853985.1469803261 
Host:www.memrise.com 
Origin:http://www.memrise.com 
Referer:http://www.memrise.com/course/1160304/idioms-and-sentences/edit/database/2129600/ 
Upgrade-Insecure-Requests:1 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 

Запрос Грузоподъёмность:

------WebKitFormBoundarytv2Kbmk1kUAGBVZ1 
Content-Disposition: form-data; name="thing_id" 

112172106 
------WebKitFormBoundarytv2Kbmk1kUAGBVZ1 
Content-Disposition: form-data; name="cell_id" 

4 
------WebKitFormBoundarytv2Kbmk1kUAGBVZ1 
Content-Disposition: form-data; name="cell_type" 

column 
------WebKitFormBoundarytv2Kbmk1kUAGBVZ1 
Content-Disposition: form-data; name="csrfmiddlewaretoken" 

MxIto89I10jvWe45lt5xBJ8xnQkWayh3 
------WebKitFormBoundarytv2Kbmk1kUAGBVZ1 
Content-Disposition: form-data; name="f"; filename="f.mp3" 
Content-Type: audio/mp3 


------WebKitFormBoundarytv2Kbmk1kUAGBVZ1-- 

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

Спасибо за ваше время.

+0

Почему '$ post' так отличается от' form_data' Я не знаю python, но похоже, что данные для записей должны быть похожими? – ArtisticPhoenix

+0

хорошим синтаксисом в useragent должен быть «User-Agent». Сервер может отклонять запрос из-за этого неправильного синтаксиса. – Artemis

+0

@ArtisiticPhoenix Я подозреваю, что причина в том, что я использую библиотеку запросов. Это рекламирует себя как «HTTP-запросы для людей» и делает очень тяжелый подъем сам по себе. – DrewSSP

ответ

0

Я решил проблему. Хотя многие переменные были объявлены, не все из них были должным образом использованы. Эта проблема была решена путем изменения requests.post(url, files=files, cookies=cookies, headers=headers, timeout=60) на requests.post(url, files=files, cookies=cookies, headers=headers, form=form_data, timeout=60)

Смежные вопросы