あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

ブログの更新通知をつぶやくTwitterのボットを作るいくつかの方法

おととい、Plaggerを使って、ブログの更新通知をつぶやくTwitterのボットを作りました。

この記事の最後の方で紹介してます。 -> CSS Nite in FUKUIの広報サポーターになりました - あと味

敷居が高いようで意外と簡単なので、作り方を紹介します。非プログラマでもできる方法があるので、今回みたいにイベントを主催するような方はこのTips使うと便利かもしれないですよ。

作るボットの定義

ブログの更新通知をするボットなので、以下の仕様で作ります。

  1. ブログが更新された時に
  2. 「任意の文字列 + ブログ記事のタイトル + ブログ記事のリンク」をつぶやく

ボットがTwitterでつぶやくまでは以下のような流れになります。

  1. フィードを取得
  2. フィードのデータを加工
  3. Twitterに出力

方法1 : Yahoo!Pipesとtwitterfeedの組み合わせで作る

難易度
臨機応変度
サービス依存度

一番簡単なのがこの方法。特に非プログラマ向けです。

twitterfeedだけでもほぼ解決しますが、今回は作るボットの定義に書いたとおり、データの加工をしたいと思うので、Yahoo!Pipesも組み合わせます。

Yahoo!Pipesとtwitterfeedについての詳しいことは以下のサイトなどが参考になりそう。

この方法では以下のような流れでボットがつぶやきます。

  1. Yahoo!PipesのFetchFeedモジュールでブログのフィードを取得
  2. Yahoo!PipesのRegexpモジュールでフィードのデータを加工
  3. twitterfeedでTwitterに出力


これだけでは厳しいと思うので、詳細説明。

  1. Yahoo!PipesのFetchFeedモジュールを画面内にドラッグして、フィードのURLを指定する
    f:id:jdg:20090225213443j:image
  2. FetchFeedモジュールをPipeOutputにつなげて、出力されるデータの確認をし、ブログのタイトルらしき値を見つける(画面一番下)
  3. Regexモジュールを画面内にドラッグして、FetchFeedとPipeOutputの間に挟む
  4. 正規表現でデータを置換し、PipeOutputで確認する(例では^を[ブログを更新しました]に置換)
  5. 置換した箇所が、「任意の文字列 + ブログ記事のタイトル」になれば保存する
  6. 作ったPipesをPublishしてフィードを公開する
  7. twitterfeedで出力先のTwitterアカウントとPipesのフィードを指定し、加工したブログ記事のタイトルとリンクが出力されるようにする
    f:id:jdg:20090225213442j:image

正規表現が厳しいってのはあるかもしれませんが、よろしければこれを機に「はじめての正規表現」とか読んでいただけるとうれしいです。

Yahoo!Pipesは非プログラマがプログラミングに親しむための最適なツールだと思います。出てから結構立ちますが、未だにこれはすげぇ!と感激するサービスです。

この方法は簡単ではあるものの、どちらかのサービスが終了した時点で破綻する点がデメリットです。Yahoo!Pipesがうまく使えれば使えるほど、フィードを絡めた様々なボットが作れます。Pipesに慣れ親しむと、ウェブの次なる楽しみが垣間見えるはずです。

で、物足りなくなると次のPlaggerに。

方法2 : Plaggerで作る

難易度
臨機応変度
サービス依存度

これは俺自身よくわかっていないので、ちょこっとしか説明できません。本当、わかってない。今回のボットは勉強がてらPlaggerを使いました。

やることはYahoo!Pipesと同じです。やり方はいくつもあります。

Plaggerについては以下のサイトなどが参考になりそう。

この方法では以下のような流れでボットがつぶやきます。

  1. Subscription::Configでフィードを取得
  2. Publish::Twitterでフィードを加工
  3. Publish::Twitterで出力
  4. cronで定期的に実行

邪道です。はい。

おそらく、Filter::*系のPluginで加工部分が処理できるんだと思いますが、いかんせん仕組みを理解してないもんで、今回はPublish::TwitterのクローンとしてPublish::TwitterBotを作って、取得したフィードの中身の一部を正規表現で置換して出力するようにしました。

邪道ではあるものの、Perlで1から作るより時間的コストが大幅に下がるのでよしとします。

Yahoo!PipesのPipe Outputのようにデータを確認する術として、Data::Dumperを使って値を探しました。Plaggerを理解していれば、こんなことは不要なのだと思います。

一応、YAMLだけさらします。

plugins:
  - module: Subscription::Config
    config:
      feed:
        - http://example.com/rss

  - module: Filter::Rule
    rule:
      module: Deduped
      path: /home/user/read.tmp

  - module: Publish::TwitterBot
    config:
      username: username
      password: password

Plaggerを使うと、表現の幅が大きく広がります。

現に、今回作ったボットでは、受けたreplayを加工してpostするというような機能も追加しました。Yahoo!Pipesではrepliesのフィードを取得することができませんが、Plaggerは認証も通過できるので可能です。

以下のページを参考にしました。
狐の王国 いまさらTwitter repliesなRSSがあることに気づいたのでPlaggerでチェックするようにした

このように臨機応変な対応ができるのはPlaggerの魅力です。かつ、実現方法さえ見つかれば手早く実装できます。

インストールや使い方を探すのに苦労することと、プログラムを触らない場合、すでにあるプラグインに依存してしまうのがデメリットです。

方法3 : 普通にプログラムを書いて作る

難易度
臨機応変度
サービス依存度

結局の所、これが最強ですね。俺はこの方法で作ると理解不足で膨大な時間がかかりますorz...

いきなりここにスケールアップするのは難しいですが、PlaggerのPluginを参考に、どういうモジュールを使えばボットが作れるかの予想ができそうです。(Perlであることが前提ですが)

今回の仕様であれば、XML::FeedとかNet::Twitterあたりでしょうか。Filter::RuleのDedupedの部分はイマイチ理解できてません。

今回作ったボットでは、自動follow返しのプログラムを方法3で実装しようかなと思っています。

まとめ

てな感じで、Twitterのボットが作れるわけですが、2と3はまだまだ及ばないことが多いのであまり参考にならなかったかもしれませんね。

Perlの勉強をするのに、「Plaggerのソース嫁」とよく言われていますが、今回のようにTwitterのボットを作るという動機で、Yahoo!Pipes -> Plagger -> Perl みたいな学習プロセスが具体的で興味もわいて効果的なんじゃないかーと感じます。

さくっとPerlのコードが書けるようになりたいですねー。