syuichi-tsuji
3/15/2013 - 6:30 PM

Twitter Streaming API Aggregation ライブラリ Agharta 作った話

Twitter Streaming API Aggregation ライブラリ Agharta 作った話

Twitter Streaming API Aggregation ライブラリ Agharta 作った話

近年、若者のメンション離れが問題視されている。明示的なメンションはせずに、ある人を指す俗称などで話しかける、いわゆる「空リプ」は社会現象となり、タイムラインに蔓延している。この状況では、フォローが増えれば増えるほどコミュニケーションを円滑に進めることが難しくなり、増え過ぎたフォローと速くなりすぎたタイムラインを前に「SNS疲れ」を表明する人も

通知特化型Twitterアプリ「29hours」をつくってHerokuで動かしているお話 - 準二級.jp

概要

june29 さんの 29hours に対抗し、Twitter Streaming API Aggregation ライブラリ Agharta を作った話をします。ところで Aggregation って言われてもピンと来ませんね。色々と良い感じに加工してログに出力したり通知したりします。便利ですね。

想定ユーザ

Ruby 初心者以上を想定してます。設定は Ruby の DSL で書きます。

Agharta

インストール

Agharta は RubyGems で提供されてます。
下記のコマンドでインストールすることが出来ます。

$ (sudo) gem install agharta

概要

Agharta は主に以下の機能があります。

  • コマンドラインでのアカウント設定/レシピの編集
  • 複数 Twitter アカウントの設定
  • 接続する Streaming API(user.json, filter.json, sample.json)の設定
  • キーワード条件の設定
  • ユーザーの条件の設定
  • イベントの条件の設定
  • ログ出力先の設定(ファイル / 標準出力)
  • 保存先の設定(fluentd)
  • 通知先の設定(im.kayac.com, Prowl)

Agharta では「Streaming API を受け取ってそれをどうするか?」の設定のことをレシピと呼びます。

コマンド

下記コマンドが用意されています。

agharta execute example/stream.rb  # サンプルレシピを実行
agharta cat example/stream.rb      # サンプルレシピを表示
agharta user:add                   # 新規アカウントを認証をし $AGHARTA_HOME/config.yml に追加
agharta user:default               # デフォルトアカウントを変更
agharta user:list                  # アカウント一覧を表示
agharta edit stream.rb             # $AGHARTA_HOME/recipes/stream.rb を編集
agharta cat stream.rb              # $AGHARTA_HOME/recipes/stream.rb を表示
agharta execute stream.rb          # $AGHARTA_HOME/recipes/stream.rb レシピを実行
agharta console                    # レシピコンテキストで REPL を起動

レシピ/設定/ログの保存場所

レシピ/設定/ログはデフォルトで $HOME/.agharta 以下に保存/検索されます。
保存場所は $HOME/.zshrc などで AGHARTA_HOME 環境変数を指定することで変更出来ます。

export AGHARTA_HOME=$HOME/Documents/Agharta

レシピファイルは $AGHARTA_HOME/recipes に、
設定は $AGHARTA_HOME/config.yml に、
ツイートやイベントなどのログは $AGHARTA_HOME/data に、
レシピの動作ログは $AGHARTA_HOME/logs に保存されます。

Twitter に接続するための設定

下記のコマンドで対話式でアカウントの設定をすることが出来ます。

agharta user:add

自分の Consumer が必要です。

$AGHARTA_HOME/config.yml を直接編集することも可能です。

---
:twitter:
  :default: :mitukiii
  :mitukiii:
    :consumer_key: YOUR_CONSUMER_KEY
    :consumer_secret: YOUR_CONSUMER_SECRET
    :oauth_token: YOUR_OAUTH_TOKEN
    :oauth_token_secret: YOUR_OAUTH_TOKEN_SECRET
    :id: 60032150

im.kayac.com に通知するための設定

残念ながら対話式に設定をするコマンドは用意されてません。
直接 $AGHARTA_HOME/config.yml を編集あるいはレシピに直接設定してください。

---
:twitter:
  # Twitter の設定(省略)
:im_kayac:
  :username: YOUR_USERNAME
  :password: YOUR_PASSWORD
  :secret_key: YOUR_SECRET_KEY
  :linker: :tweetbot

handler 設定として Tweetbot のリンカが用意されています。
linker: :tweetbot と指定することで通知から直接 Tweetbot アプリに飛ぶことが出来ます。

Prowl に通知するための設定

残念ながら対話式に設定をするコマンドは用意されてません。
直接 $AGHARTA_HOME/config.yml を編集あるいはレシピに直接設定してください。

---
:twitter:
  # Twitter の設定(省略)
:prowl:
  :apikey: YOUR_APIKEY
  :linker: :tweetbot

url 設定として Tweetbot のリンカが用意されています。
linker: :tweetbot と指定することで通知から直接 Tweetbot アプリに飛ぶことが出来ます。

レシピファイルのサンプル

下記は実際に gem 内に含まれるレシピのサンプルの一部です。

# ユーザーストリームを受け取る
stream {
  # デフォルト指定のアカウントを使う
  credentials :default

  user {
    # 全てのユーザを対象とする
    all!
    # 全てのユーザのツイートを標準出力に表示
    log $stdout
    # 全てのユーザのツイートをログに保存
    log 'stream.user.log'
  }

  event {
    # 全てのイベントを対象とする
    all!
    # 全てのイベントを標準出力に表示
    log $stdout
    # 全てのイベントをログに保存
    log 'stream.event.log'
  }
}

agharta execute example/stream.rb

というコマンドでこのレシピを実際に実行することが出来ます。
フォローしてるユーザのツイートとイベントが標準出力にズラッと出ます。

その他に何が出来るか?

下記は Agharta で出来る事を(ほぼ)全て書いたレシピのサンプルです。

# ユーザーストリームを受け取る
stream {
  # アカウント設定
  # mitukiii アカウントを使用(config.yml 内で default 指定で省略可)
  credentials :mitukiii

  # アカウント設定は直接こう書くことも出来る
  # set :consumer_key, …
  # set :consumer_secret, …
  # set :oauth_token, …
  # set :oauth_token_secret, …

  # フォローしてるユーザの全てのリプライを受け取る
  replies_all

  # プッシュ/ロギングするキーワード設定
  keyword {
    # 自分のツイートを無視する
    ignore_self!
    # mitukiii, たけしまさんというツイートにマッチ
    include 'mitukiii', 'たけしまさん'
    # RT/QT の場合は無視する
    exclude /^.*(RT|QT):? @[\w]+.*$/i
    # マッチしたツイートを im.kayac.com に通知
    notify :im_kayac
    # マッチしたツイートを prowl に通知
    notify :prowl
  }

  # 全てのツイートを Fluent に保存/出力/ロギング
  user {
    # 全てのツイートを対象にする
    all!
    # localhost:24224 で動いてる fluentd に timeline というタグで投げる
    store :fluentd, 'timeline', :host => 'localhost', :port => 24224
  }

  # @TENGA_PR のツイートをプッシュ/ロギング
  user {
    # @TENGA_PR のツイートにマッチ
    include 'TENGA_PR'
    # マッチしたツイートを im.kayac.com に通知
    notify :im_kayac
    # マッチしたツイートを prowl に通知
    notify :prowl
  }

  # イベントをプッシュ/ロギング
  event {
    # リプライ、リツイート、DM、ふぁぼ、フォローにマッチ
    on :reply, :retweet, :direct_message, :favorite, :follow
    # マッチしたイベントを im.kayac.com に通知
    notify :im_kayac
    # マッチしたツイートを prowl に通知
    notify :prowl
  }
}

Zsh の補完

Agharta には agharta コマンドの Zsh 用の補完関数が用意されています。
_agharta を $fpath の通ったディレクトリに配置することで補完が効くようになります。

まとめ

Agharta は以前自作し使用していた creepy が使いづらく設定も分かりにくかったことからより使いやすい形で書き直したものです。

通知や保存先については自分が欲しいものだけ書きました。が、例えば Boxcar への通知や、MongoDB へ保存、Twitter for iPhone 用のリンカ設定などのコードもすぐ書けるようになっています。あるいは Fluentd への保存機能があるので、Fluentd 側で好きに再加工/再利用することも出来ます。

ソースコードは Github で公開してるので、自分の欲しい機能を追加して Pull Request するなり煮るなり焼くなりコードを読んであまりの美しさに惚れ惚れするなりあまりの汚さに鼻で笑うなり好きにご利用ください。

因みに(このままじゃ)Heroku では動かないのでこのライブラリに興味を示すであろう方々なら持ってるであろう自宅サーバなりさくら VPS なりで動かしてください。

mitukiii/agharta · GitHub

関連あるかもリンク

Ruby 製の同系統のアプリケーションです。
Heroku で動きます。

通知特化型Twitterアプリ「29hours」をつくってHerokuで動かしているお話 - 準二級.jp

Python 製の同系統アプリケーションです。

Boxcarを置き換えるふぁぼ通知システムを作りました | non log