2013-06-28 35 views
8

私はfile_get_contentsをPHPで使用しています。以下のコードでは、最初のURLはうまく動作しますが、2番目のコードは機能しません。一部のURLではfile_get_contentsが動作しません


$URL = "http://test6473.blogspot.com"; 
$domain = file_get_contents($URL); 
print_r($domain); 


$add_url= "http://adfoc.us/1575051"; 
$add_domain = file_get_contents($add_url); 
echo $add_domain; 

2番目の理由がうまくいかない理由についてのご意見はありますか?

+1

2番目のURLは実際に何をエコーし​​ていますか?または、エラーメッセージが表示されますか? –

+1

「働いていない」とはどういう意味ですか? –

+0

ブラウザで両方のURLを開いてください。どちらもHTMLページを返します。 – Parixit

答えて

8

URL:ここに

は前にこのをしてきた人です。スクリプトからのリクエストが見つかった場合、ページの内容を無効にするだけです。

ブラウザのリクエストと同様のリクエストを行う必要があります。だから私は次のコードを使用して2番目のURLコンテンツを取得しています。 Webサーバーごとに異なる場合があります。彼らは異なる点検を保つかもしれないので。

なぜ、あなたは次のコードを使用しようとしないのですか?あなたが幸運なら、これはあなたのために働くかもしれません!

function getUrlContent($url) { 
    fopen("cookies.txt", "w"); 
    $parts = parse_url($url); 
    $host = $parts['host']; 
    $ch = curl_init(); 
    $header = array('GET /1575051 HTTP/1.1', 
     "Host: {$host}", 
     'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Language:en-US,en;q=0.8', 
     'Cache-Control:max-age=0', 
     'Connection:keep-alive', 
     'Host:adfoc.us', 
     'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36', 
    ); 

    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
    curl_setopt($ch, CURLOPT_COOKIESESSION, true); 

    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
    $result = curl_exec($ch); 
    curl_close($ch); 
    return $result; 
} 

$url = "http://adfoc.us/1575051"; 
$html = getUrlContent($url); 

ガイダンスはありがとうございます。

+0

また、get_contentsファイルがセッションを開始しない、または一般にcurl/browserによって行われるクッキーを設定しないことを言いたいと思います。 – Parixit

+0

それは 'cookies.txt'ファイルがそこにある必要がありますか? –

+0

@hnn呼びたいURLがブラウザ内のクッキーを保持している場合のみ必要です。 – Parixit

1

第2のURLのように見えますが、時には遅すぎる、リダイレクトする可能性があります。 カールを使用してより大きなタイムアウトを設定しようとします。 はまた、第2部位のブロックが認識されないブラウザからアクセスするように残念なことに、それが見えます

error_reporting(-1); 
ini_set('display_errors','On'); 
2

のエラーをオンにします。でも動作しませんコマンドラインからカールを使用して:

curl -I http://adfoc.us/1575051 

ができます:

HTTP/1.1 200 OK 
Server: cloudflare-nginx 
Date: Fri, 28 Jun 2013 12:15:40 GMT 
Content-Type: text/html 
Connection: keep-alive 
X-Powered-By: PHP/5.5.0 
Set-Cookie: __cfduid=d7cd1bf18c136a288cc2b36065a3b31f01372421740; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.adfoc.us 
CF-RAY: 85a4dc6829e06d0 

ドキュメントがありませんが。状態200を返すので、返された文字列をboolean === falseにチェックして失敗したかどうかを確認すると、実際に動作したかのように表示されます。

あなたのリクエストを受け入れるためのURLを取得するためにユーザーエージェント(もしかすると他のもの)を偽装する必要がある場合は、カールライブラリを使って飛び込み、さまざまな組み合わせを試してみてください。最初にカールコマンドラインで動作するものを試してみることは、これを調べる際の開発時間を短縮する良い方法になります。リクエストがブラウザまたは任意のスクリプトから来る彼らのサーバかどうかをチェックするため、のfile_get_contentsによって取得されていない

php curl: how can i emulate a get request exactly like a web browser?

+0

お返事ありがとうございます。私は別の答えのURLを与えてみました。しかし、それでも動作しません。 :( – Parixit

+1

残念ながら、すべてのWebサイトが異なっています - ウェブサイトが受け入れる前にさまざまな異なるhttpヘッダーを試す必要があるかもしれません。あるいは、うまく動作しないかもしれません...あるいは、あなたはさらに、残念ながら、試行錯誤はあなたがここでできることのすべてです。この種のものはますます難しくなっています。( – fquinner

関連する問題