あんまり書くとあれなんですけど、実際にやってみたら意外と簡単に出来てしまったので一応メモ。
自分自身の通信とは言え、やってることはセッションハイジャックと変わらない気がするな。。ドキドキ。
何をしてみたかったか
ログインが必要なサイトやWebサービス、色々あると思います。普通はブラウザからアクセスして見りゃいいんですが、
- とりあえず自動的に何度もアクセスしたい
- 自分のサーバ上にデータを保存したい
等の理由で、ブラウザからではなくサーバから当該サイトに直接アクセスしたいことがあるかも知れません。それが出来るかどうか試してみたかったので実際にやってみました。
どうやるか
前提として、当該サイトへのログイン権限(アカウントとかパスワード)を持っていることとします。(そりゃそうだ。)そもそもHTTPの通信だったらサーバにブラウザごっこをさせればいいので何とでもなりそうな気がしますが、一番簡単なのはcookieをそのまま持って行くことだと思います。
認証があるWebサービスでは、cookieベースで接続が維持されていることが多く、正規の手続きを経てログインしたユーザに対してはセッションID等を含めた、接続の維持に必要な情報がcookieとしてブラウザに保持されます。なので、このcookieを持っていさえすれば、サーバ側は「認証済みで通信してOKなユーザアクセス」として認識してくれるわけですね。
やり方
大きく分けて手順は2つです。cookieを取ってくるところと、それを実際に使ってアクセスするところ。
FireFoxのLive HTTP Headersでcookieを確認する
まずFireFoxをインストールし、アドオンのLive HTTP Headersを入れておきます。ヘッダを見るツールですね。
アドオンを入れた後にFireFoxを再起動すると ツール > Live HTTP Headers が表示されているのでこれを起動しておきます。するとウィンドウが立ち上がって、ここにhttpリクエストとレスポンスのヘッダ情報がプロットされていきます。
で、FireFoxを使って当該サイトにログインすると、Cookie情報が発行されます。Live HTTP Headersを見るとこんな感じでcookieが付いているはず。
※画像はtwitterにmantolとしてログインした時のもの。ちなみにtwitterで試したわけではないので、以下の手順がtwitterでうまくいくかどうかはわかりません。
左下の すべて保存 を押すとログを保存できるので保存しておきましょう。(※)
実際にサーバからアクセスしてみる
cookieを付けてサーバにアクセス出来る方法なら何でもいいと思いますが、ここではwgetにします。以下、参考にしたページ。
- ヘッダー情報を丸ごと指定してwgetで取得
- ダウンロードコマンドwgetのオプション一覧(linux)
- pear HTTP_RequestとHTTP_Request2の速度比較の続き。wgetとfile_get_contentsも検証
ほぼ一つ目のリンクのやり方ですが、--load-cookiesオプションは微妙にうまくいきませんでした。なので愚直に上の(※)で取っておいたcookieやその他のヘッダ情報を以下の感じで並べてアクセスすることにします。Cookieの中にダブルクウォートとかが入ってる場合はエスケープ(\)しないといけません。
wget
--header "Host: ****.com"
--header "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28 GTB7.1"
--header "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
--header "Accept-Language: ja,en-us;q=0.7,en;q=0.3"
--header "Accept-Encoding: gzip,deflate"
--header "Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7"
--header "Keep-Alive: 115"
--header "Connection: keep-alive"
--header "Referer: ****.com"
--header "Cookie: ******"
****.com
exec('wget --header 〜〜〜〜 ');
とか書けばいいですね。これで、ブラウザからログインして見れるページのhtmlをサーバ上で手に入れることが出来ました。スクリプト化すれば自動アクセスもクローリングもスクレイピングもやりたい放題や!!(やらないけど。と言うかすぐサービス側にばれる思う。)