プログラム上からwebへコンタクトを取る

某所で書いたモノを修正しつつ転載。




話題を振っていただいたので、
素人なりに調べた結果を纏めておきたいと思います。

まずwebの動作について。
各ブラウザ(IEFirefoxOperaSleipnirChrome、、、)を使って利用するサービスの殆どは
クライアント⇔サーバーのやりとりを「HTTPリクエスト」というものを使って行います。
その中でもよく使う命令が "GET"と"POST" です。
両方ともサーバーに対してリクエストを送るのですが
違いとして、クライアントからデータを送信するか否かの差があります。


GETはサーバーに対してページのリクエストをするだけです。
(yahooやgoogleの、ページを表示するだけの場合)
POSTはデータをリクエストと一緒にサーバーに送ります。
(サービスにログインしたりする場合)



例として某サービス(以下ほげ)へのログイン時の流れをなぞります。


まず最初に http://www.hoge.jp/ へアクセスすると、
ブラウザ(クライアンント)はサーバーへGETメッセージを送ります。


するとサーバーは "ログインしてない人からのアクセス" と解釈して
ログインページ(HTML)をブラウザに返します。


ブラウザは受け取ったページを表示します。
ログインに必要な情報を入力してログインボタンを押すと
サーバーへPOSTメッセージを送ります。
(ちなみに、ほげにログインする時のPOSTメッセージは
 mail=*****&password=***&x=0&y=0&cookiesave=1&chkSSLLogin=on
 というデータをサーバーへ送信しています。)


サーバーはPOSTで送られてきたデータ元にログイン処理をして、
ログイン済みのページをブラウザに返します。




と、こんな感じでログインまでの流れがあるのですが、
これから先も面倒な話が待っています。
それがCookieの問題です。


Cookieとは、今回の検証に限って言うと
「ログイン済を証明するために必要なデータ」
みたいなもんです。
(通常はもっと汎用目的に使えます。)


↑でPOSTを送った後、サーバーからは
ログイン済ページと共にCookieを返してきます。


これ以降、ほげにアクセスする時は
このCookieをメッセージに書いておかないと
"ログインしてない人からのアクセス" と判断されて
再びログインページに飛ばされてしまいます。
(ちなみにCookieはただの文字列なので、
 プログラム内ではString型の変数にでも入れておいて使い回せばOKです)



後はリファラという "直前に見ていたURLが載っている項目" があるのですが
これを見て、正規のアクセス方法かどうかをチェックする所も
サイトによっては有ったり無かったり。
(某画像投稿サイトはチェックしているので、
 リファラが正規のものでないと不正アクセスのエラーが返ってきます)




とまぁ駆け足でベースになる部分を書いたのですが、
ブラウザ上で行われるここら辺の流れを
プログラム上からシミュレートできれば
ブラウザ上の作業もプログラムから制御できるはずです。


ページを表示するのにどんなメッセージが送信されているかは
パケットキャプチャツールなどで確認。


プログラム上からどうやってメッセージを発行するかは
各言語のSocketライブラリや、urlopen等の関数を参照。


ページの解析は
サーバーから返ってきたHTMLを正規表現なりで逐次解析。


その他細々した所まで自分で面倒を見なければいけないので
結構面倒なのですが
一度理解してしまえば融通が利きそうな分野の知識なので
興味がある方は是非簡単なプログラムから挑戦してみて下さい。
(入門としては、googleのロゴを保存するプログラムとかどうでしょうか?)





素人が素人に向けて書いたので、
言い回し/表現が変な所が多々あります。
ごめんなさい・・・。


不明な点、間違い等ございましたら
ご指摘お願い致します。