我有一个类似于以下的cURL命令:
curl 'https://www.example.com' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36' \
-H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3' \
-H 'accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7' \
-H 'authority: www.example.com'
在我的Mac上像在终端应用程序中执行此命令,结果会得到预期的输出。
(如果您自己测试:如果此输出包含单词Sicherheitsüberprüfung
,则已被地理位置屏蔽,您必须使用德国IP进行测试。)
我将确切的命令转移到了PHP cURL,如下所示:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$headers = array();
$headers[] = 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36';
$headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3';
$headers[] = 'Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7';
$headers[] = 'Authority: www.example.com';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
?>
当我运行这段代码时,我收到了一条消息,说我的请求被识别为自动请求/机器人:它显示
Sicherheitsüberprüfung
,意思是安全检查
。当然,我在命令行和PHP cURL请求中使用的是相同的IP。
为什么会这样?难道命令行cURL和PHP cURL不一样吗?
还是我的PHP脚本有问题?
更新:
我偶然发现了以下内容:我在我的Mac上使用Coda作为代码编辑器。这有一个内置的PHP渲染引擎。使用这个与我的PHP脚本,结果是预期的。这与我在命令行中得到的结果相同。
第二次更新:
我按照
Jannes Botis
在他的答案中建议的做法去做了。然后我在我的Coda代码编辑器应用程序中运行PHP脚本(输出了预期的结果),并在MAMP上作为localhost运行(总是被识别为自动请求)。
我发现使用 MAMP 执行的代码使用了 HTTP/2
,而在 Coda 中执行的代码使用了 HTTP/1.1
。为了解决这个问题,我将以下内容添加到脚本中:
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
现在,两者输出的字符串完全相同:
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
Authority: www.example.com
但是,情况仍然是一样的:一个正在工作,另一个被识别为自动请求。
CURLOPT
常量设置头部信息吗?例如 $headers[CURLOPT_USERAGENT] = 'Mozilla/5.0...',然后使用curl_setopt_array()
函数吗? - code-koboldAccept
、Accept-Language
和Authority
没有常量,是吗? - DavidSicherheitsüberprüfung
,因为它被识别为自动请求。在命令行中执行该命令时,您会得到什么? - David