FirefoxやChromium(またはGoogle Chrome)には、ブラウザが送信したリクエストをcURLのコマンドライン形式でコピーできる機能があります。これを利用することで、シェルスクリプトとcURLを使って、リクエストの自動化も容易に実現できます。
cURL形式でコピー
ブラウザの開発者ツールには、送信したHTTPリクエストを一覧表示できるNetworkタブがあります。各リクエストを右クリックすると「Copy as cURL」というのがあります。これは文字通り、ブラウザが送信したリクエスストをcURLの形式でコピーできます。
例えば i-beam.org にアクセスしたときのGETリクエストを、cURLでコピーすると以下のようになります。リクエストヘッダのパラメータは -H
オプションで渡されます。このリクエストはアクセスするページだけでなく、ユーザエージェントなども設定されます。
curl 'http://i-beam.org/' -H 'Host: i-beam.org' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'Connection: keep-alive' -H 'If-Modified-Since: Sun, 28 Feb 2016 11:54:45 GMT' -H 'Cache-Control: max-age=0'
Basic認証の自動化
Basic認証が設定されているページは、認証情報をリクエストヘッダの Authorization
に設定します。cURLでもリクエストヘッダを設定することで、Basic認証に成功できます。Basic認証が求められるページは、こちらなどからどうぞ。ブラウザ認証後のページを開き、そのリクエストをcURL形式して実行すると、ターミナルからもBasic認証できるのが確認できます。
ブラウザのセッションにログイン
HTTPはステートレスなプロトコルです。Webサイトのログイン状態を維持するには、セッションがサーバで記憶され、セッションIDがブラウザのクッキーで記憶されます。ブラウザはリクエストヘッダにセッションIDを付与することで、サーバはセッションの照会を行います(参考)。cURLを使ったリクエストも、ブラウザが取得したセッションが残っている限り、セッションIDでログイン情報を利用できます1。
ログイン時に確認できるページを、cURLでも取得してみます。まずはQiitaログイン後、ルートディレクトリ(/
)にアクセスするときのリクエストをコピーします。そして次のようにパイプで繋いで必要な情報をgrepします。すると、Qiitaの未読通知数を取得できます。
curl 'http://qiita.com/' -H ...... | grep -o 'initial_unread_count":[[:digit:]]*' | grep -o '[[:digit:]]*'
副作用のないページに対しては、容易にcURLで取得できました。しかしデータ更新など副作用のあるリクエストは、まともなサイトではCSRF対策されているので一筋縄にはcURLはできないです。こういったサイトに対してリクエストを自動化するときは、PhantomJSなどを使うのをおすすめします。