Hubot+TwitterStreaming APIでUser streamsを監視して、指定したキーワードがあったら自動でtwitterのお気に入りに登録する


作ったもの
[twitter-auto-fav](https://github.com/ykyk1218/twitter-auto-fav)

記事後半で解説っぽいことを書いてます。


## 実行方法

最初にgit cloneをしてソースコードを取得します

### ローカルで実行する

package.jsonがあるディレクトリに移動をして下記コマンドを実行

```
npm install
```

これで必要なパッケージがnode_modulesディレクトリ以下にインストールされます。


下記内容のシェルスクリプトを準備して実行

```local_run.sh
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](https://hubot.github.com)

## Hubotのインストール
この辺はいろいろなところで紹介されていますので、割愛します。

[slackと連携するhubotを3分でインストール](http://bitwave.showcase-tv.com/slackと連携するhubotを3分でインストール/)

[HubotでSlackのボットを作成する](https://www.seeds-std.co.jp/seedsblog/2125.html)

古い記事を見ると微妙にコマンド違ったりするので、はまります(^^;)

## Adapterの作成
Hubotはadapterを使って様々なツールに対応をすることができます。slack用のadapterを使えば、slack用のbotを作成でき、skype用のadapterを使えばskype用のbotが作成できます。

今回はtwitter用のbotを作成したいので、twitter用のadapterを使います。hubotをインストールするとデフォルトでtwitter用のadapterも用意されるのですが、これが今回作成をしようとした要件を満たしてくれないので、このtwitter用のadapterを使って機能拡張したオリジナルのadapterを作成します。

今回作りたいものは

- 特定のキーワードが含まれたツイートを見つけた場合に該当のツイートをお気に入りに登録する
- 特定のキーワードの検索対象は自分のタイムラインからのみに限定

です。

### 作業の流れ
1. <hubotインストールフォルダ>/node_modules/hubot-twitterをコピー
2. <コピーしたフォルダ>/src/twiiter.coffee→twitter-ext.coffeeにリネーム
3. twitter-ext.coffeeに必要な機能を追加
4. 作成したadapterをnpmパッケージとして公開

### twitte-ext.coffeeへの機能追加

特に大したことはしてないです。TwitterUserStream APIを使って自分のタイムラインから取得できるようにメソッドを追加します。

```twitter-ext.coffee

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モジュールを使って実行します。

```twitter-auto-fav.coffee
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
```


## 参考にした記事
[hubot adapterの作り方](http://akiomik.hatenablog.jp/entry/2014/02/12/052703)


[hubot-twitter-userstreamをリリースしました](http://hoo89.hatenablog.com/entry/2014/08/08/180202)