自分でタグ付けできないのでどうなのかと思っていたはてなブックマークであるが、気がつけば登録したブックマークももうすぐ1500。
タグ付けできない部分は、検索機能である程度カバー。 お気に入り機能のおかげで旬のネタ収集もできる。 なんだかんだいっても、さすが「はてな」という感じ。
日々登録しているブックマークを活用したいということで RSS を利用して、nDiki に表示してみることにした。 出勤前のちょっとした時間で Perl スクリプトとしてささっと実装。
という形で実現。
という手ぬきであっさり実装。
5カ月ほど前にはてなブックマーク上の最新ブックマークを nDiki のサイドバーに表示するようにしてみた。
今回は nDiki のキーワード別のページに、はてなブックマークからそのキーワードで検索されたブックマークを表示する機能を追加してみた。
取得する対象RSSが多くなり、さすがに前回みたいにローカルPCで処理して定期的にアップロードという形では無駄が多すぎるのでちゃんとサーバ上で処理するようにした。
URI::Fetch + Cache::FileCache + XML::RSS を用いて実装。 キャッシュ期間は1日に設定。キーワードページを最初にアクセスした際にははてなブックマークからのフィード取得があるので、ちょっと時間がかかるが2度目のアクセス以降キャッシュを使っている間はそれほど余計な時間はかからないはず。
自分のWeb日記とブックマークの組み合わせだと当然扱うネタが近いので、きちんと関連する情報が表示されるはずだ。 他の検索サーバのRSSフィードを利用する事も考えてはいるけど、しばらくはこれでいいかな。
一昨日社内メイン Wiki のレイアウトを変更してサイドバーを設けたので、徐々に増えてきた社内 Blog の ヘッドラインをそこに表示することにした。
最初は Plagger を使ってみようと思ったのだが、依存 CPAN モジュールが多くて CPAN.pm を使ってもなかなかインストールが終わらない。
ということで今回は Plagger を見送って、XML::RSS でちょちょっと aggregator を自作して済ますことにした。
基本的には nDiki 用に書いた「はてなブックマーク上の最新ブックマークを表示するためのコード(2005年5月16日)」をちょっと修正して利用。 HTML フラグメントを生成するかわりに、JavaScript Include 用 JavaScript ファイルを生成するように変更した。
これで社内 Blog が読まれる回数も増えるかな。
公式の Flash 版 Twitter badge をこのページのサイドバーに表示していたが、以下の点でちょっと不満だった。
「自分の過去のステータスを一覧的にサイドバーに表示する」のがしたいことなのだが、ちょっとマッチしない。 ということで Twitter から RSS フィードを取ってきて、サイドバーに表示することにした。
使ったモジュールは URI::Fetch + XML::RSS + Date::Parse。 それとユーティリティとして WiKicker::HTML と WiKicker::URI。
と簡単に実装してみた。機能的には概ね満足。
2週間ほど前にtwitterfeed で Flickr に写真をアップロードしたら自動的に Twitter にタイトルと URL をポストするようにしたのだが、これだと写ツみたいに画像そのものはポストされず今一歩なので、写真自体を自動的に Twitter アイコンにアップロードするようにしてみた。
流れは以下:
例えば今日 VQ1005 で撮影して Flickr にアップロードした写真を自動的に加工させたものがコレ。
なんか偽中継のような嘘臭さがあるけれど、まあだいたいアップロードした写真は自分が実際にその場にいたのだから、あながちでもないんじゃないか。
半年ぐらい前に Skype for Linux で Twitter への書き込みを自動的に Skype ムードメッセージに設定するスクリプト(記事)を作って cron で 10分毎に更新するようにした。
Windows BOX 上 Skype を使っている時も同様にできるように、Skype4COM を使うバージョンも書いてみた。 D-Bus ではなく Skype4COM を使うようにすることと、Skype4COM にはシフト JIS の文字列を渡すようにすること以外はほとんど同じ。
Skype4COM の DLL を登録し、Skype が起動している状態で以下の Perl スクリプトを実行。
#!/usr/bin/perl use strict; use warnings; use Win32::OLE; use URI::Fetch; use XML::RSS; use Date::Parse; use Encode; my $id = '自分の Twitter ID'; my $time = time; my $fetch_response = URI::Fetch->fetch( "http://twitter.com/statuses/user_timeline/$id.rss?dummy=$time") or die URI::Fetch->errstr; my $rss = XML::RSS->new; $rss->parse($fetch_response->content); die 'no items' if @{$rss->{items}} == 0; my $item = $rss->{items}->[0]; my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(str2time($item->{pubDate})); my $title = $item->{title}; my $mood = sprintf("$title [%02d/%02d %02d:%02d]", $mon + 1, $mday, $hour, $min); $mood = Encode::encode('shiftjis', $mood); my $skype = Win32::OLE->new('Skype4COM.Skype'); $skype->Client->Start unless $skype->Client->IsRunning; my $profile = $skype->CurrentUserProfile; $profile->{MoodText} = $mood;
インストール済みだった ActivePerl 5.8.8.822 で動作を確認(ちなみに現時点での最新は ActivePerl 5.10.0.1003)。なお URI::Fetch、XML::RSS、Date::Parse(TimeDate) は標準では入っていないので PPM パッケージでインストール。
タスク スケジューラで10分毎に上記のスクリプトを wperl.exe で実行するように設定。 これで Windows 上でもさえずりをムードメッセージに設定できるようになった。
リンクを複数のソーシャルメディアでシェアする仕組みを持ってなくて、そういう時は個別に投稿している。でも公開範囲とか細かく設定したい時以外はサクッと一発で終わらせた方がクールだ。あと今までほとんど Twitter ではリンクのブックマーク的シェアしていなかったんだけれど、まあ今後はちょっとしてもいいかなと。
ということで仕組み作り。はてなブックマークから Twitter 連携・外部サイト連携するのが国内的王道かな。でも他の人のリンク踏むとブックマーク先に飛んだりブックマークエントリーページに飛んだりっていう体験があってちょっとそういうの嫌だったりする。
代替案としては Facebook を一次投稿先にして IFTTT で他へ流す方法が思いついた。IFTTT 的に quick trigger になるのでタイムラグが無いのが良い。そのかわり非公開以外のリンク投稿について全て trigger してしまうようなのでちょっと怖い。URL・ページタイトル・コメントを IFTTT 側で分けて取れるのでいいんだけどね。
あとは Buffer を一次投稿先にして直接あるいは IFTTT で流す案も検討した。時間をばらしたい人はいいけどそうでない場合はあまり良くない。あとページタイトルは取得してくれない。
ということでやはりリンクの共有としては、はてなブックマークが便利なんだなぁ。PC からでも Android 端末からでもいけるし。なので一次投稿先ははてなブックマークに決定。全体公開ものをここにブックマークしているので、垂れ流れていくのも問題なし。ただ前述した点があるので、実際の連携にははてなブックマークの機能を使わないで、フィードを IFTTT に読ませて撒くことにした。
ただ IFTTT、はてなブックマークにつけたコメント部分をフィードから読みとれない。ということでちょこちょこっと Perl でフィルタを書いた。
#!/usr/bin/perl use warnings; use strict; use CGI; use LWP::UserAgent; use XML::RSS; my $ua = LWP::UserAgent->new; my $response = $ua->get('http://b.hatena.ne.jp/はてなID/rss'); my $rss = XML::RSS->new; $rss->parse($response->content); foreach my $item (@{$rss->{items}}) { my $description = $item->{description}; $item->{title} = $description if defined $description; } my $query = CGI->new; print $query->header('application/xml; charset=utf-8'); print $rss->as_string;
サーバに XML::RSS が入ってたのでそれを使った感じ。IFTTT からは15分に1回ぐらいのアクセスのはずなので、まあこんなもんで。エラー処理も端折り。
はてなブックマークにつけたコメントは IFTTT でエントリのタイトルとしてとれるようになるので、それを使うように。Facebook に投げる場合はページのタイトルは Facebook が自前で取得してくれるので使わないので、フィードではタイトルを上書きしてしまって問題ない。
ページのタイトルを取得しないソーシャルメディア向け(Twitter とか)には
foreach my $item (@{$rss->{items}}) { my $description = $item->{description}; $item->{title} = '“' . $item->{title} . '”'; $item->{title} = $description . ' / ' . $item->{title} if defined $description; }
と、タイトルとコメントをはてなブックマーク書式っぽくしてタイトルに設定してあげる。あとは IFTTT でいい感じに流してもらうと。
Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。