ブログの更新通知をつぶやくTwitterのボットを作るいくつかの方法
おととい、Plaggerを使って、ブログの更新通知をつぶやくTwitterのボットを作りました。
この記事の最後の方で紹介してます。 -> CSS Nite in FUKUIの広報サポーターになりました - あと味
敷居が高いようで意外と簡単なので、作り方を紹介します。非プログラマでもできる方法があるので、今回みたいにイベントを主催するような方はこのTips使うと便利かもしれないですよ。
作るボットの定義
ブログの更新通知をするボットなので、以下の仕様で作ります。
- ブログが更新された時に
- 「任意の文字列 + ブログ記事のタイトル + ブログ記事のリンク」をつぶやく
ボットがTwitterでつぶやくまでは以下のような流れになります。
- フィードを取得
- フィードのデータを加工
- Twitterに出力
方法1 : Yahoo!Pipesとtwitterfeedの組み合わせで作る
難易度 | 低 |
臨機応変度 | 低 |
サービス依存度 | 高 |
一番簡単なのがこの方法。特に非プログラマ向けです。
twitterfeedだけでもほぼ解決しますが、今回は作るボットの定義に書いたとおり、データの加工をしたいと思うので、Yahoo!Pipesも組み合わせます。
Yahoo!Pipesとtwitterfeedについての詳しいことは以下のサイトなどが参考になりそう。
この方法では以下のような流れでボットがつぶやきます。
- Yahoo!PipesのFetchFeedモジュールでブログのフィードを取得
- Yahoo!PipesのRegexpモジュールでフィードのデータを加工
- twitterfeedでTwitterに出力
これだけでは厳しいと思うので、詳細説明。
- Yahoo!PipesのFetchFeedモジュールを画面内にドラッグして、フィードのURLを指定する
- FetchFeedモジュールをPipeOutputにつなげて、出力されるデータの確認をし、ブログのタイトルらしき値を見つける(画面一番下)
- Regexモジュールを画面内にドラッグして、FetchFeedとPipeOutputの間に挟む
- 正規表現でデータを置換し、PipeOutputで確認する(例では^を[ブログを更新しました]に置換)
- 置換した箇所が、「任意の文字列 + ブログ記事のタイトル」になれば保存する
- 作ったPipesをPublishしてフィードを公開する
- twitterfeedで出力先のTwitterアカウントとPipesのフィードを指定し、加工したブログ記事のタイトルとリンクが出力されるようにする
正規表現が厳しいってのはあるかもしれませんが、よろしければこれを機に「はじめての正規表現」とか読んでいただけるとうれしいです。
Yahoo!Pipesは非プログラマがプログラミングに親しむための最適なツールだと思います。出てから結構立ちますが、未だにこれはすげぇ!と感激するサービスです。
この方法は簡単ではあるものの、どちらかのサービスが終了した時点で破綻する点がデメリットです。Yahoo!Pipesがうまく使えれば使えるほど、フィードを絡めた様々なボットが作れます。Pipesに慣れ親しむと、ウェブの次なる楽しみが垣間見えるはずです。
で、物足りなくなると次のPlaggerに。
方法2 : Plaggerで作る
難易度 | 中 |
臨機応変度 | 高 |
サービス依存度 | 中 |
これは俺自身よくわかっていないので、ちょこっとしか説明できません。本当、わかってない。今回のボットは勉強がてらPlaggerを使いました。
やることはYahoo!Pipesと同じです。やり方はいくつもあります。
Plaggerについては以下のサイトなどが参考になりそう。
この方法では以下のような流れでボットがつぶやきます。
邪道です。はい。
おそらく、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で実装しようかなと思っています。