我正在使用以下脚本发出cURL帖子请求,该脚本会发布到表单处理脚本:
$url = "http://www.example.com/process_script.php";
$referer = "http://www.example.com";
$agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11";
$postdata = array('message' => 'Hello, World!', 'name' => 'Bob');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_exec($ch);
它在某些网址上运行正常。此外,当我将它发布到我的测试脚本(它只输出引用和代理和postdata)时,它的工作正常。
然而,有些服务器给了我这个奇怪的“服务器无法理解你的查询”的错误。它不是403,因为当我删除用户代理选项时,我确实得到了403.用户代理字符串是否有问题?它是直接从我的实际浏览器中提取的。
我需要设置更多选项才能模拟真实的浏览器吗?
答案 0 :(得分:2)
我不确定,但请试一试:
$postdata = array('message' => 'Hello, World!', 'name' => 'Bob');
$postdata = http_build_query($postdata);
这样做的原因是,如果您使用http_build_query()返回的url编码字符串发布表单,则使用enctype application/x-www-form-urlencoded
发布表单。使用数组时,会产生multipart/form-data
。
某些表单可能需要urlencoded
数据,并且不理解(或拒绝处理)以multipart/form-data
编码发送的表单。
关于CURLOPT_POSTFIELDS
:
此参数可以作为urlencoded字符串传递 'para1 = val1& para2 = val2& ...' 或作为字段名称为关键字的数组 和字段数据作为值。如果value是数组,则 Content-Type 标头 将设置为 multipart / form-data 来源: curl_setopt()