[PHP]file_get_contents()でユーザエージェントを偽装する

Read More

最近では同一のURLをたたいても、アクセスしてきたユーザエージェントの情報によって最適なページを切り替えて表示させているサイトが多い。

こんなときfile_get_contents()を使ってweb上にあるモバイルページやスマホページを取得するにはどうしたらよいか。


■file_get_contents()でユーザエージェントを偽装する
stream_context_create()を利用してやることで、file_get_contents()でアクセスするときのヘッダー情報を書き換えることができる。
これによりユーザエージェントを指定したものに偽装することができる。

注意)
file_get_contents()を使ってwebページを取得するにはphp.iniのallow_url_fopenディレクティブがOnになっている必要がある

ソースコード
$options = array(
  'http' => array(
    'method' => 'GET',
    'header' => 'User-Agent: DoCoMo/2.0 P903i(c100;TB;W24H12)',
  ),
);
$context = stream_context_create($options);
$url = 'http://xirasaya.com/';
$contents = file_get_contents($url, false, $context);
print $contents;


上記の例ではURLに対しユーザエージェントの上ではドコモのモバイルとしてアクセスしていることになる。


またこれ以外の方法としてcURL関数を使っても、同じようにユーザエージェントを偽装してwebページを取得することができる。


■cURL関数でユーザエージェントを偽装する
cURL関数で指定できるオプションの中に、stream_context_create()でやったのと同じように、別のユーザエージェントを指定することができる。

※cURL関数はphp.iniの拡張モジュールphp_curl.dllが有効になっている必要がある

ソースコード
$ch   = curl_init();
$options = array(
  CURLOPT_URL => 'http://xirasaya.com/',
  CURLOPT_HEADER => false,
  CURLOPT_NOBODY => false,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_USERAGENT => 'User-Agent: DoCoMo/2.0 P903i(c100;TB;W24H12)',
);
curl_setopt_array($ch, $options);
$contents = curl_exec($ch);
print $contents;


上記の例もfile_get_contents()と同じ内容が帰ってくる。



file_get_contens()もcURL関数もそれぞれphp.iniの設定に左右されるのでサーバの状況に応じて使い分けたい。

それぞれの設定が有効になっているかどうかを調べるにはphpinfo()やextension_loaded()、ini_get()などを使えばよい。




Comments(2)

1    2013/01/11 (金) 16:42 ID:XXXXXXXXX
最近はレスポンシブデザインという概念が出てるらしいですよ。
どんなPCやスマホのブラウザでも見られるサイトを目指すとか…

ぐぐってみた所、出力するHTMLを1つだけ持ってて
CSS3の機能を利用して画面の横幅を確認。
→○○px未満ならスマホ用のCSSを適用
→○○px以上ならPC用のCSSを適用

ところがHTMLの仕様として、
スマホだからPC用として書かれた箇所は「display:none;」指定しても、
画像を読み込まれる事には変わりないし、
画面の幅に関係ない=でかい画像を読み込む為ファイルサイズが常に膨大となる。
読み込むCSSだって増えるし、判別処理だって増えてしまう。
しかもIE8や9はCSS3の対応が甘い為に切り捨てる事になってしまう。


…概念は素晴らしいけど、欠点も多いので様子見という所ですね。
暫くの間はユーザエージェントを利用するのが正解だと思います。

2  シラサヤ  2013/01/12 (土) 04:08 ID:XXXXXXXXX
概念はわかるけどね。
使い回しができるならそれに越したことないもんな。
凝ったことせずに安くあげたいのならいいかもねー