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

  • 10
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

作ったもの
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

Hubotのインストール

この辺はいろいろなところで紹介されていますので、割愛します。

slackと連携するhubotを3分でインストール

HubotでSlackのボットを作成する

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

Adapterの作成

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

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

今回作りたいものは

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

です。

作業の流れ

  1. /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の作り方

hubot-twitter-userstreamをリリースしました