我有一个类似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/signed-exchange;v=b3';
$headers[] = 'accept-Language: de-DE,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
,表示security check
。
当然,我为命令行和PHP cURL请求使用了相同的IP。
为什么呢?命令行cURL是否与PHP cURL相同?
或者我的PHP脚本有什么问题吗?
更新
我很幸运地发现了以下内容:我在Mac上使用Coda作为代码编辑器。它具有内置的PHP渲染引擎。与我的PHP脚本一起使用,结果是预期的。这与我在命令行中得到的结果相同。
更新2
我做了Jannes Botis
的回答。然后,我在Coda代码编辑器应用程序中运行PHP脚本(输出预期结果),并以MAMP作为本地主机(始终被视为自动请求)。
我发现用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/signed-exchange;v=b3
accept-Language: de-DE,en;q=0.7
Authority: www.example.com
但是,还是一样:一个正在工作,另一个被认为是自动请求。