作ったもの
twitter-auto-fav
記事後半で解説っぽいことを書いてます。
実行方法
最初にgit cloneをしてソースコードを取得します
ローカルで実行する
package.jsonがあるディレクトリに移動をして下記コマンドを実行
npm install
これで必要なパッケージがnode_modulesディレクトリ以下にインストールされます。
下記内容のシェルスクリプトを準備して実行
export HUBOT_TWITTER_KEY="consumer key"
export HUBOT_TWITTER_SECRET="consumer secret"
export HUBOT_TWITTER_TOKEN="token"
export HUBOT_TWITTER_TOKEN_SECRET="token secret"
bin/hubot -a twitter-ext -n TwitterMonitor
aオプションでadapterを指定します。nオプションはロボット名を指定できます。特にいらないのですが、とりあえずつけときました。
herokuで実行する
herokuで動かすには環境変数をまず設定します。
$ heroku config:set HUBOT_TWITTER_KEY="value"
$ heroku config:set HUBOT_TWITTER_SECRET="value"
$ heroku config:set HUBOT_TWITTER_TOKEN="value"
$ heroku config:set HUBOT_TWITTER_TOKEN_SECRET="value"
あとはgit push すれば動きます。
Hubotとは
Github社が作成したチャットbotの作成が簡単になるフレームワークです。
チャットを監視して、「特定のキーワードが出現したらほにゃららする」みたいなものがつくれます。
Hubotのインストール
この辺はいろいろなところで紹介されていますので、割愛します。
古い記事を見ると微妙にコマンド違ったりするので、はまります(^^;)
Adapterの作成
Hubotはadapterを使って様々なツールに対応をすることができます。slack用のadapterを使えば、slack用のbotを作成でき、skype用のadapterを使えばskype用のbotが作成できます。
今回はtwitter用のbotを作成したいので、twitter用のadapterを使います。hubotをインストールするとデフォルトでtwitter用のadapterも用意されるのですが、これが今回作成をしようとした要件を満たしてくれないので、このtwitter用のadapterを使って機能拡張したオリジナルのadapterを作成します。
今回作りたいものは
- 特定のキーワードが含まれたツイートを見つけた場合に該当のツイートをお気に入りに登録する
- 特定のキーワードの検索対象は自分のタイムラインからのみに限定
です。
作業の流れ
- /node_modules/hubot-twitterをコピー
- <コピーしたフォルダ>/src/twiiter.coffee→twitter-ext.coffeeにリネーム
- twitter-ext.coffeeに必要な機能を追加
- 作成したadapterをnpmパッケージとして公開
twitte-ext.coffeeへの機能追加
特に大したことはしてないです。TwitterUserStream APIを使って自分のタイムラインから取得できるようにメソッドを追加します。
bot = new TwitterStreaming(options)
(省略)
bot.timeline "", (data, err) ->
self.x +=1
console.log "received #{data.text} from #{data.user.screen_name}"
tmsg = new TextMessage({user: data.user.screen_name, status_id: data.id_str}, data.text)
self.receive tmsg
if err
console.log err
class TwitterStreaming extends EventEmitter
constructor: (options) ->
if options.token? and options.secret? and options.key? and options.tokensecret?
@token = options.token
@secret = options.secret
@key = options.key
@domain = 'stream.twitter.com'
@userdomain = 'userstream.twitter.com'
@tokensecret = options.tokensecret
@consumer = new oauth.OAuth "https://twitter.com/oauth/request_token",
"https://twitter.com/oauth/access_token",
@key,
@secret,
"1.0A",
"",
"HMAC-SHA1"
else
throw new Error("Not enough parameters provided. I need a key, a secret, a token, a secret token")
(省略)
timeline: (track, callback) ->
@post @userdomain, "/1.1/user.json?track=#{track}", '', callback
npmパッケージの公開
こんな既存のソースをちょっといじった用なものを公開するのは気がひけるのですが、公開しておかないとデプロイ時にうまくモジュールをインストールしてくれなかったので、、、
hubot-twitterのpackage.jsonを元にnameとかverisonの内容を変更します。
内容を変更したら公開
$ npm publish
その前にアカウント登録とか必要だったりするのですが、その辺は
http://qiita.com/fnobi/items/f6b1574fb9f4518ed520
この辺を参考にしました。
Hubot本体側にイベント処理を追加
<hubotインストールディレクトリ>/scripts/以下にファイルを追加します。robot.hear〜の部分でキーワードを指定して実際に行いたい処理を追記します。
今回はツイートのお気に入り追加をしたいので、TwitterのAPIをnode.jsのtwitterモジュールを使って実行します。
module.exports = (robot) ->
robot.hear /プログラマー|エンジニア/, (res) ->
# お気に入りに登録する
fav_api_url = "https://api.twitter.com/1.1/favorites/create.json"
tweet_id = res.message.user.status_id
twitter = require('twitter')
client = new twitter(
consumer_key : process.env.HUBOT_TWITTER_KEY
consumer_secret : process.env.HUBOT_TWITTER_SECRET
access_token_key : process.env.HUBOT_TWITTER_TOKEN
access_token_secret: process.env.HUBOT_TWITTER_TOKEN_SECRET
)
client.post fav_api_url, {id: tweet_id}, (data, err) ->
if err
console.log err