【PHP】file_get_contents()でヘッダー情報を書き換える


最近では、スマホでインターネットをする人が多くなり同じURLにアクセスしてもモバイルとパソコンが違ったレイアウトで表示されるのは当たり前となってきました。

この間公開したソースコードを表示するツール「凝」ではIphoneとPCを切り替えて取得できるようにしていましたが、file_get_contents()やfile()でただ取得するだけでは切り替えることはできません。

前者は文字列として、後者は配列としてファイルを取得してくれますが、特に理由がない場合僕はfile()を使ってます。

今回のように、ヘッダー情報を送るときはHTTPプロトコルのコンテキストの記述から、stream_context_create()でコンテキストリソースを作成します。stream_context_create()を利用し、file_get_contents()の引数とすることでアクセスするときのヘッダー情報を書き換えることができます。

$ua = "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_0_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A404 Safari/601.1\n";


$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"$ua"
  )
);

$context = stream_context_create($opts);
$url = 'https://';
$contents = file_get_contents($url, false, $context);
print $contents;

上記の例ではIphoneとしてアクセスしています。$uaを書き換えることでUAを変更できます。ボタンなどを付けて分岐してやれば自由に切り替えることができます。

$url = を書き換えることで任意のURLにアクセスできます。
$opts = には、UAの他にも様々な情報を追加できます。

UAやリファラ情報がなくても、情報取得はできますが、稀に情報を取得できない場合もあります。そんな時は取得したいサイトのドメインに書き換えてリファラ情報ものっけてみると取得できたりします。

リファラ
'header' => "Referer: http://hoge/\r\n"

$ops内に入れればリファラを偽装できる。

proxyを通す
$proxy = array(
    "http" => array(
        "proxy" => "proxy.example.com:8080",
        'request_fulluri' => true
    )
);

proxyを通す時のサンプルコード

POST
$options =array(
   'http' =>array(
      'method' => 'POST',
      'content' => $data
   )
);

GETだけでなくPOSTすることもできる。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする