はてなブックマークへの追加を自動的にpinboardやdeliciousにも登録する


概要

はてなブックマークへブックマークを追加すると、自動的にpinboardやdeliciousにも登録されるようにします

追記

この記事は、はてなブックマークの外部連携サービス機能に含まれるWebhook機能を用いた事例の紹介でしたが、この機能は2018年末に終了しました。よって、この記事の内容はもう有効ではありません。

必要なもの

  • 何らかのWebサーバ
  • perl動作環境
  • Net::Delicious
  • Config::Pit

インストール

  • 何らかのWebサーバを用意します。
  • Net::Delicious, Config::Pitをインストールします。
  • hatena2pinboard.pl https://gist.github.com/mrmt/4564284 をcgi scriptとして設置します。
hatena2pinboard.pl
#!/usr/bin/perl
# from http://d.hatena.ne.jp/amachang/20090603/1244025898
use utf8;
use strict;
use warnings;
use CGI;
use Net::Delicious;
use Config::Pit;

use constant {
    PINBOARD_ENDPOINT => 'https://api.pinboard.in/v1/',
};

my $config = pit_get('hatena2pinboard',
             require => {
                 hatena_webhook_key => 'xxx',
                 pinboard_username => 'xxx',
                 pinboard_password => 'xxx',
         });
die 'pit_get failed.' unless %$config;

my $req = CGI->new;
$req->charset('utf-8');
print CGI::header('text/plain');

if($req->param('key') eq $config->{hatena_webhook_key}){
    if($req->param('status') eq 'add'){
        my $url = $req->param('url');
        my $title = $req->param('title');
        my $comment = $req->param('comment');
        post_pinboard($url, $title, $comment);
    }
}
print 'ok';
exit;

################################################################
sub post_pinboard{
    my $url = shift;
    my $title = shift;
    my $comment = shift;

    my $pinboard = Net::Delicious->new({
        user => $config->{pinboard_username},
        pswd => $config->{pinboard_password},
        endpoint => PINBOARD_ENDPOINT
    });
    $pinboard->add_post({
        url => $url,
        description => $title,
        extended => $comment,
        replace => 0,
    });
}

__END__

hatena2pinboard 側の個人設定

  • 以下の使い捨てスクリプトset_pitを用意
  • hatena_webhook_key に適当なキー文字列を、pinboard_usernameにはpinboard.inのユーザ名、pinboard_passwordにはpinboard.inのパスワードを記入
  • 実行
  • ~/.pit というディレクトリが出来ます。このディレクトリをWebサーバの実行ユーザのホームディレクトリにコピーします。
set_pit
#!/usr/bin/perl
use strict;
use warnings;
use Config::Pit;

Config::Pit::set('hatena2pinboard',
         data => {
             hatena_webhook_key => 'mogemoge',
             pinboard_username => 'yourname',
             pinboard_password => 'foobar'
         });

はてなブックマーク側の個人設定

  • はてなブックマークの「設定」から「外部サイト連携」のタブを選びます
  • 「Web Hook(開発者さま向け, 3つまで登録できます)」の項目にて、「イベント通知を受け取るURL」にはhatena2pinboard.plを設置したurl, 「キー」には、先ほど決めてset_pitで設定したキー文字列を記入します。

ほか

  • この例では, はてなブックマークのWeb Hookを受けてブックマーク登録する対象がpinboard.inですが、pinboard.inのAPIはdelicious互換らしく、そもそも使っているライブラリもNet::Deliciousですので、APIのエントリポイントをdeliciousのものに書き換えてやれば、deliciousに対しても動くと思います。