はてブの最近の人気エントリーのTwitter用botを作ってみました

  • 2008年1月23日 20:39
  • perl

はてブのホットエントリーのエントリを定期的にポストしてくれるbotを作成してみました。

http://twitter.com/hotentry

ホットエントリのbotは、すでに「hatebu」というbotがいて僕もFollowしていたのですが、「一気に当該サイトに飛んでしまうんじゃなくて、はてブのコメント読みたいよね」な話を会社でしていて、「だったらコメントページに飛んでくれるbotを作ってみる?」な流れになり、Perlの勉強がてら一気に作ってみました。

Perlをまともに書いたのは6,7年ぶりで、CPANのモジュールをまともに使ってコード書いたのは初めてでした。簡易掲示板みたいなものをゴリゴリと書いてたのが懐かしい。。。

ホットエントリのRSSをcronで定期巡回して以前に取得したデータとの差分をTwitterにPostするだけ、な簡単なコードですが、いざ書いてみると詰まることが相当多かったです。以下、備忘録として詰まった点をまとめておきます。

差分の取り方に悩んだ

最初は宮川さんの「RSS をメールで送信する」を参考にしようと思っていました。メールで送信する箇所だけをPostするのに変更するだけだから簡単だろう、、と思ってたら、はてブのRSSってDublin Core の日付属性"dc:date"が入っていないんですね。。なので、宮川さんの方式だと使えないことに。

便利なモジュールもありそうだと思いつつも、なかなか辿り着かなかったのでPostしたURLのリストのヒストリーデータを保持させておいて、定期的に取得する新着データと比較することで差分を取得するようにしておきました。ただ、作り終えてからxmldiffなるものを発見したので、こっちの方が便利かな、とも思います。

サブルーチンに複数の配列がうまく渡らない

次に差分を取得するためのサブルーチンを書こうとしたのですが、サブルーチンに複数の配列がうまく渡らない。。よく調べてみるとリファレンスを渡すことで回避できるそうで。配列が1つにまとまって渡されるとか、普段JavaScript書いてばっかの頭だと予想だにしない仕様でした。これPerl屋さんって面倒とか思わないのでしょうか??

コメントページのURLをそのままPostするとダメ

はてブのコメントページのURLは http://b.hatena.ne.jp/entry/{$url}な形式になるわけですが、このURLをそのままPostすると、Twitterの表示時にTinyURLの変換に失敗することがありました。実際はGigazineあたりでよく出ていたのですが、{$url}がクエリストリングの形のURL(http://xxx.com?a=b)の場合、「?」以降がTinyURL化されずに残ってしまい、存在しないURLが生成されてしまうことがありました。

TinyURLのサイトで変換すると正常に変換できるので、どうもTwitter側のURL抽出アルゴリズムにバグがある模様。なので、Twitter側からTinyURLに変換されるとマズいので、BotがPostする段階でTinyURL化させておいて、そのURLをPostすることにしました。TinyURL化はTinyURL APIなるものがあるので、これをHTTP::Liteで叩いています。

なんとか完成

と、面倒なことをかいくぐって何とか動くものができました。叩かれるのを覚悟でソースも晒しておきます。RSS取得で差分を好きなようにPostするから基本的には使い回しが効くかとは思います。

hotentry.pl

関連広告

Trackbacks:0

TrackBack URL for this entry
http://blog.katsuma.tv/mt-tb.cgi/114
Listed below are links to weblogs that reference
はてブの最近の人気エントリーのTwitter用botを作ってみました from blog.katsuma.tv

Home > perl > はてブの最近の人気エントリーのTwitter用botを作ってみました

Search
Feeds

Return to page top