File_get_contents,卷曲不起作用

时间:2016-05-31 14:06:19

标签: php api curl

有些奇怪的事情正在发生,我想知道原因。

在这个网址: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)

并且工作了。为什么会这样?发生了什么事?

2 个答案:

答案 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);

这给了我一个有用的回应。