Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

作ったもの
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をリリースしました

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした