Twitter Streaming API Aggregation ライブラリ Agharta 作った話
近年、若者のメンション離れが問題視されている。明示的なメンションはせずに、ある人を指す俗称などで話しかける、いわゆる「空リプ」は社会現象となり、タイムラインに蔓延している。この状況では、フォローが増えれば増えるほどコミュニケーションを円滑に進めることが難しくなり、増え過ぎたフォローと速くなりすぎたタイムラインを前に「SNS疲れ」を表明する人も
通知特化型Twitterアプリ「29hours」をつくってHerokuで動かしているお話 - 準二級.jp
june29 さんの 29hours に対抗し、Twitter Streaming API Aggregation ライブラリ Agharta を作った話をします。ところで Aggregation って言われてもピンと来ませんね。色々と良い感じに加工してログに出力したり通知したりします。便利ですね。
Ruby 初心者以上を想定してます。設定は Ruby の DSL で書きます。
Agharta は RubyGems で提供されてます。
下記のコマンドでインストールすることが出来ます。
$ (sudo) gem install agharta
Agharta は主に以下の機能があります。
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
に保存されます。
下記のコマンドで対話式でアカウントの設定をすることが出来ます。
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
残念ながら対話式に設定をするコマンドは用意されてません。
直接 $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 アプリに飛ぶことが出来ます。
残念ながら対話式に設定をするコマンドは用意されてません。
直接 $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
}
}
Agharta には agharta
コマンドの Zsh 用の補完関数が用意されています。
_agharta を $fpath の通ったディレクトリに配置することで補完が効くようになります。
Agharta は以前自作し使用していた creepy が使いづらく設定も分かりにくかったことからより使いやすい形で書き直したものです。
通知や保存先については自分が欲しいものだけ書きました。が、例えば Boxcar への通知や、MongoDB へ保存、Twitter for iPhone 用のリンカ設定などのコードもすぐ書けるようになっています。あるいは Fluentd への保存機能があるので、Fluentd 側で好きに再加工/再利用することも出来ます。
ソースコードは Github で公開してるので、自分の欲しい機能を追加して Pull Request するなり煮るなり焼くなりコードを読んであまりの美しさに惚れ惚れするなりあまりの汚さに鼻で笑うなり好きにご利用ください。
因みに(このままじゃ)Heroku では動かないのでこのライブラリに興味を示すであろう方々なら持ってるであろう自宅サーバなりさくら VPS なりで動かしてください。
Ruby 製の同系統のアプリケーションです。
Heroku で動きます。
通知特化型Twitterアプリ「29hours」をつくってHerokuで動かしているお話 - 準二級.jp
Python 製の同系統アプリケーションです。