2016-05-31 9 views
3

何か変なことが起きているのですが、その理由を知りたいと思います。File_get_contents、curl not working

このURLを

http://api.promasters.net.br/cotacao/v1/valores?moedas=USD&alt=json、ブラウザではうまく動作しますが、私はPHPでコンテンツ取得しようとしたとき:var_dump(...) = string(0) ""で、

echo file_get_contents('http://api.promasters.net.br/cotacao/v1/valores?moedas=USD&alt=json'); 

印刷何をので、私は少しさらに行き、使用:

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

これはサーバーまたは自分のPCでこれを使用していますか?これらの関数のPHPモジュールが有効に設定されていない可能性があります。これは実際には空白で発生します。 –

+0

あなたはただの成功を前提としています。 'echo'はあなたが失敗したときに返す真偽値を表示しません。代わりに 'var_dump'を使用してください。 –

+0

Nop、それは外部サーバー上にあり、私は 'echo file_get_contents( 'http://stackoverflow.com/questions/37548007/file-get-contents-curl-not-working?noredirect=1#comment62584729_37548007' ); 'それは働きました – Miguel

答えて

2

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'); 
+0

本当にありがとう。好奇心の外に、デフォルトの 'user_agent'とは何ですか?なぜコンソールとpython 3.xで' curl'を使っていたのですか? – Miguel

+0

私は* php curlやfile_get_contentsにはありません。私は 'var_dump($ _ SERVER)'と 'HTTP_USER_AGENT'しか設定されていないテストページを作成しました。私は手動でエージェントを自分の答えと同じように設定すると、期待どおりに表示されました。コンソールからcurlを実行すると、エージェントは 'curl/7.35 'として設定されます。0'私の場合 –

+0

ありがとうございますが、 'console curl/python 3.x'が動作するのは奇妙です。理由を知りたいありがとうございます:) – Miguel

1

のようなものに設定することで、これを偽の私は、同じ動作を経験することができます。

CLIを使用してURLを取得するCurlが私に役立ちました。

私はその後getallheadersを使用してファイルへのすべてのリクエストヘッダをダンプ別のスクリプトにfile_get_contents呼び出しでスクリプトを書いた:私は、カールを検査

array (
    'Host' => 'localhost', 
) 

:ファイルの

<?php 
file_put_contents('/tmp/request_headers.txt', var_export(getallheaders(),true)); 

が出力リクエストヘッダー、

$ curl -v URL 

addi一度に1つずつ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); 

これは私に有用な応答を与えました。

+0

ありがとうございます、ターミナルで、ユーザーエージェントを指定せずにPythonを使って 'curl -v http://api.promasters.net.br/cotacao/v1/valores?moedas = USD&alt = json'としたアイデアはありますか? – Miguel

+0

CLI curlがユーザエージェントヘッダーを渡します。 – Progrock