本ドキュメントははてなブックマークにおける Web Hook 機能を解説するものです。主にはてなスタッフがその作成と更新を行っています。
はてなブックマーク Web Hook ははてなブックマーク上でのイベントを他のウェブアプリケーションに HTTP で通知する仕組みです。はてなブックマークにブックマークを投稿した際、自分のブックマークにはてなスターが付与された際、IDコールを受信した場合など各種イベントに合わせて、設定画面で指定した任意の URL に、ブックマーク対象の URL やタイトルなどのデータを HTTP POST します。Web Hook からの HTTP リクエストを受け取るプログラムを用意することで、各イベントに合わせて動作する任意のアプリケーションを開発することができます。
2009年6月3日のリリース時点では、自分のブックマーク投稿イベントのみを扱っていましたが、機能追加により現在以下のイベントに対応しています。
例えば受け取った HTTP リクエスト内容を保存するバックアップアプリケーションや、HTTP リクエストを他のサービスに転送してブックマーク内容を別のサービスに投稿するといったプログラムなどの開発が可能です。
はてなブックマーク Web Hook は以下の手順で利用できます
はてなブックマーク Web Hook は、各イベントに合わせてそのユーザーが設定している URL に HTTP POST でパラメータを送信します。以下のイベントに合わせて通知が行われます。括弧内はそのイベントに伴う status パラメータ (後述) の値です。
上記のイベントのうち、アプリケーションが受信するイベントは設定画面から ON/OFF が可能です。
Web Hook が送信する HTTP POST のパラメータの仕様は以下です。
文字エンコーディングは UTF-8 です。
イベントがブックマーク追加 (status=add) または更新 (status=update) だった場合は、前述のパラメータに加えて以下のパラメータを伴います。
イベントがはてなスター付与 (status=star) だった場合は、前述のパラメータに加えて以下のパラメータを伴います。
はてなブックマーク Web Hook は今後の機能追加により他のイベント通知にも利用する予定です。新しいイベントを追加した際は status パラメータにそのイベントの種類を追加します。アプリケーションを開発するにあたっては、後日追加されるイベントによりアプリケーションが意図しない挙動をしないよう、内部で status のチェックをお願いします。(例えば add / update / delete 以外のステータスだった場合は例外を送出するようにしておく、など)
Web Hook からの HTTP リクエストを受け付けるプログラムはインターネット上に公開する必要があります。そのため公開した URL を知る第三者がプログラムへ HTTP リクエストを送信できてしまいます。
プログラム内で、本人ではない第三者からのリクエストを拒否できるよう、はてなブックマーク Web Hook ではキーを利用できます。Web Hook の設定画面でキーに任意の文字列を設定しておくと、その文字列を HTTP POST の key パラメータの値として送信します。プログラム側では key パラーメータが確かに設定画面で指定したものと一致しているかを調べることで本人確認が可能です。
キーには特定の文字列のハッシュなど万が一第三者に知られた場合でも二次被害のない文字列を利用されることを推奨します。他サービスで利用している同一のパスワード文字列などは利用しないでください。
はてなブックマーク Web Hook からの HTTP POST リクエストを受け取る perl CGI スクリプトの例を以下に記載します。
#!/usr/bin/env perl use strict; use warnings; use CGI qw/-utf8 :standard/; use DateTime::Format::W3CDTF; my $req = CGI->new; # キーの比較 if ($req->param('key') ne 'xxxxxxxxxxx') { die "Authentication failed"; } # ユーザーの情報 my $username = $req->param('username'); # エントリーの情報 my $url = $req->param('url'); my $title = $req->param('title'); my $count = $req->param('count'); # ブックマークの情報 my $status = $req->param('status'); # 'add' or 'update' or 'delete' my $timestamp = DateTime::Format::W3CDTF->parse_datetime($req->param('timestamp')); my $comment = $req->param('comment'); my $is_private = $req->param('is_private'); # 0 or 1 # ここに好きな処理を実装する print header('text/plain'); print 'ok';
プログラム開発が終ったらインターネット上に公開し、URL (と必要ならキー) を
の入力欄に登録してください。
タグはコメントと一緒になっています。タグは perl では以下のコードで分離することができます。
my $comment = "[foo][bar] hogepiyo"; my @tags; while ($comment =~ m!\[([^\:\[\]]+)\]!g) { push @tags, $1; } # @tags にタグが入る
開発したプログラムの動作確認用に、本仕様と同様のクエリパラメータを POST する HTTP クライアントを記述しておくと便利です。はてなブックマーク上でブックマークの追加作業を行わなくてもデバッグできます。てもデバッグできます。