我正在使用cuRL从远程服务器获取一些数据......响应采用JSON格式。 这是我的代码:
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($ch, CURLOPT_URL, 'http://www.myaddress.com/mypage.php');
curl_setopt($ch, CURLOPT_POSTFIELDS, array("id" => $id));
$return = curl_exec($ch);
curl_close($ch);
如果我在浏览器中访问该链接,页面加载OK,但如果我通过cuRL访问则返回404错误...
答案 0 :(得分:11)
我可以猜到一些可以从服务器端检查的东西,以显示错误。
1)正如其他答案所述,请务必设置所有必需的标题,您可以查看它们,例如通过萤火虫,如这里所示, https://s30.postimg.cc/qjcbmdye9/facebook_headers.png
或者你可以通过php get_headers函数获取标题。 设置它使用
curl_setopt($ch, CURLOPT_HTTPHEADER, array("HeaderName: HeaderValue"));
2)当您在浏览器中打开页面时(不包括使用post方法提交的表单),它会发出get请求,而不是post,所以如果在服务器端检查$ _GET,那么你的帖子请求将不会被考虑。
3)如果您确定它应该是一个帖子请求(例如,它是一个表单提交),那么以下可能是一个问题:某些表单可以有隐藏字段,这也是在服务器中检查,如果未设置,则可以返回错误。因此,您应该查看表单的源代码并将它们(如果有的话)添加到您的帖子参数中。
4)如果您要提交表单,请务必同时设置提交按钮及其名称和值,因为类似于隐藏字段,也可以进行检查。
5) Cookie也可能是一个问题,因为默认情况下浏览器有它,而curl则没有。要能够设置和读取cookie,请使用此代码
// set cookie
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
// use cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
此处,$cookie_file
Cookie文件的路径。不知道在linux或mac中,但在windows中一定要使用cookie文件的绝对路径。
6)此外,您可以按
设置引用curl_setopt($ch, CURLOPT_REFERER, 'http://www.myaddress.com/mypage.php');
编辑:如果是ajax请求,您可能需要添加标头X-Requested-With
,其值为XMLHttpRequest
答案 1 :(得分:5)
服务器可能会检查HTTP标头,大多数情况都是如此。
因此,请添加浏览器的相同HTTP标头,并使用Firebug验证:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('SomeName: SomeValue'));
答案 2 :(得分:2)
浏览器可能还有其他内容正在发送您的cURL代码。您可以使用其他人建议的任何工具,Firebug,Wireshark,Fiddler等等。
您需要做的是在请求中添加缺少的部分,以便在cURL请求中尽可能地匹配浏览器,直到远程页面以200响应。
我注意到你正在做POST
。在许多情况下,您的浏览器会发生一次GET
请求访问的页面。会话在远程站点上初始化,cookie将以会话ID保存在您的浏览器中。
然后需要提供此cookie以及后续POST
个请求。 PHP cURL有很多选项可以支持Cookie。可能还有其他要求,例如CSRF tokens等等。
同样,逆向工程是关键。