有些奇怪的事情正在发生,我想知道原因。
在这个网址:http://api.promasters.net.br/cotacao/v1/valores?moedas=USD&alt=json,它在浏览器中运行良好,但当我尝试使用php检索内容时:
echo file_get_contents('http://api.promasters.net.br/cotacao/v1/valores?moedas=USD&alt=json');
没有打印,var_dump(...) = string(0) ""
,所以我更进一步使用:
function get_page($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, True);
curl_setopt($curl, CURLOPT_URL, $url);
$return = curl_exec($curl);
curl_close($curl);
return $return;
}
echo get_page('http://api.promasters.net.br/cotacao/v1/valores?moedas=USD&alt=json');
也没有打印,所以我尝试了python(3.X):
import requests
print(requests.get('http://api.promasters.net.br/cotacao/v1/valores?moedas=USD&alt=json').text)
并且工作了。为什么会这样?发生了什么事?
答案 0 :(得分:3)
考虑到php curl和file_get_contents
似乎没有在请求标头中设置值,看起来他们正在阻止用户代理或缺少用户代理。
您可以通过将其设置为Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
<?php
function get_page($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, True);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:7.0.1) Gecko/20100101 Firefox/7.0.1');
$return = curl_exec($curl);
curl_close($curl);
return $return;
}
echo get_page('http://api.promasters.net.br/cotacao/v1/valores?moedas=USD&alt=json');
答案 1 :(得分:2)
我经历了同样的行为。
使用CLI Curl获取URL对我有用。
然后我编写了一个脚本,其file_get_contents
调用另一个脚本,使用getallheaders
将所有请求标头转储到文件中:
<?php
file_put_contents('/tmp/request_headers.txt', var_export(getallheaders(),true));
文件输出:
array (
'Host' => 'localhost',
)
然后我检查了卷曲请求标题
$ curl -v URL
并尝试一次添加一个到file_get_contents请求。事实证明需要一个用户代理头。
<?php
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>
"User-Agent: examplebot\r\n"
)
);
$context = stream_context_create($opts);
$response = file_get_contents($url, false , $context);
这给了我一个有用的回应。