将POST请求从PHP转换为Python

DrewSSP

我有这个php脚本,可以代表用户将mp3文件上传到网站。它工作正常,但我想用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 );

我正在尝试将其转换为python。不过,这似乎很简单。这是我尝试过的:

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脚本方面付出了巨大的努力。我想知道是否有人可以找到Python脚本无法完成的PHP脚本在做什么。如果有帮助,我使用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_143688012353890=base_domain=.www.memrise.com; csrftoken=MxIto89I10jvWe45lt5xBJ8xnQkWayh3; fbsr_143688012353890=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进行了一些更改。

感谢您的时间。

DrewSSP

我解决了问题。尽管声明了许多变量,但并不是所有变量都得到了正确使用。此问题已解决,方法是更改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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将POST请求从PHP转换为Python

来自分类Dev

转换简单的Python请求将POST转换为Rust reqwest

来自分类Dev

将Python POST文件转换为PHP

来自分类Dev

将 PHP Curl 查询转换为 Python 请求

来自分类Dev

将POST请求从Java转换为Python-无法POST数据

来自分类Dev

将cURL请求转换为PHP

来自分类Dev

将 CURL 请求转换为 PHP CURL

来自分类Dev

将 PHP cURL 请求转换为 Ruby

来自分类Dev

将 cURL 请求转换为 PHP

来自分类Dev

将cURL请求转换为Ruby post请求

来自分类Dev

将cURL请求转换为Ruby post请求

来自分类Dev

为什么我的 PHP Curl POST 请求将数据数组转换为字符串?

来自分类Dev

使用数组参数将 POST cURL PHP 请求转换为 cURL 命令行

来自分类Dev

将curl转换为python请求

来自分类Dev

将基本的CURL转换为Python的请求

来自分类Dev

将Geoserver cURL转换为python请求

来自分类Dev

将curl调用转换为python请求

来自分类Dev

将curl转换为python请求

来自分类Dev

将curl请求转换为python

来自分类Dev

将Geoserver cURL转换为python请求

来自分类Dev

将cURL转换为Python请求

来自分类Dev

将curl调用转换为python请求

来自分类Dev

Python 请求将列表转换为字典

来自分类Dev

将PHP转换为Python

来自分类Dev

将 curl post 请求转换为 python-requests 不起作用

来自分类Dev

PHP将POST图像转换为PNG

来自分类Dev

PHP:将$ _POST转换为变量?

来自分类Dev

PHP:将$ _POST转换为变量?

来自分类Dev

将带有参数数组的PHP curl POST请求转换为Python代码