0

Twのレシピ

tw (http://shokai.github.com/tw)の活用方法を紹介します。
うまく使うとプログラムを書かなくてもtwitter botを作ったりできる。

前:ターミナルで使うtwitterクライアント作った


基本的なレシピから順に解説していきます。

最新版にアップデート

ここに書いてあるレシピは、今日リリースした最新版(v0.3.1)でしか動かない物が含まれるので
最新版をインストールしなおしておいてください。
gem install tw
リクエストを並列化して速くなったりもしたし。


zshのコマンド補完を使う

@glidenoteさんがすごい勢いで作ってくれました。
ターミナルで使うtwitterクライアントtwが便利なのでzsh補完関数を作った – Glide Note – グライドノート


UNIX pipeをつかう

コマンドを実行して、アカウントを@shokai_logに切り替えつつ結果をtweetする
% echo "現在の時刻 `date`" | tw --pipe --user=shokai_log


出力フォーマットをカスタマイズ

% tw --format=json
JSON出力される。他のプログラムに渡す時に使える。


自分でフォーマットを決められる
% tw --format="@#{user} #{text}"
user, text, time, id, urlの5つが使える。


Twだけでtwitter botを作る

プログラムを書かずに簡単なbotを起動可能。
–stream, –silent, –format, –pipeを組み合わせる


crontabでbot

0 15 * * * echo "3時です。おやつです。" | tw --pipe --user=shokai_log
3時のおやつを教えてくれる。


shokaiで検索して、即「はい」とリプライするbot

% tw --silent --stream:filter=shokai --format="@#{user} はい" | tw --pipe
grepや–format=json、ワンライナーも活用しよう。


重い処理が終わったら、自分にDMを送る

% make build && echo "buildできたぞー" | tw --pipe --dm:to=shokai --user=shokai_log


ハッシュタグを読み上げる

% tw --silent --stream:filter=tag1,tag2,tag3 --format="#{text}" | xargs -n1 say
動画は3つ同時に見れないけど、読み上げなら3つぐらい同時に実況を把握できて便利
Macのsayコマンドに日本語を喋らせる方法はMac/Linuxに喋らせるに書いた。


現在位置をtweetする

% echo "イマココ `whereami -map`" | tw --pipe
gem wifi_locationでインストールできるwhereamiコマンドを使った。


iTermを使う

command+クリックでURLをブラウザで開けるのが便利



もっと色々やりたい人へ

Twを部品として使うと良いです。
twitter botのプログラム書いてみると、大部分が認証だったり、oauth tokenをgitにcommitしてしまったりして大変あほくさい。
そういう面倒な部分をTwにまかせてしまえば捗ります。


アカウント設定ファイルを直接使う

$HOME/.tw.yml に保存されている
これを直接読んで、別のtwitterアプリで使っても良い。
削除してもtwコマンド毎に自動再生成される安心設計


Twitter gemの認証管理フロントエンドとして使う

twはtwitter gemのラッパーで、アカウント管理機能もあるので、twで認証してからTwitter gemを使えば楽になる
例: アイコンアップロード
認証だけTwを使っている。


Tw::ClientのAPIを使う

Twコマンドが使っている内部API(Tw::Client)が使える。
例1: mentionを読んだりtweetしたりする例

例2: dfをツイートする

1

ターミナルで使うtwitterクライアント作った

1年以上前に作ってずっと使ってた奴を、少し直してrubygemにした。

くわしい使い方はhttp://shokai.github.com/twに書いた。

何か要望あればtwittergithubのissueかblogのコメントでください。

※活用方法をTwのレシピに書きました


インストール

特別なライブラリは使っていないのでMacならすぐインストールできるはず
gem install tw
tw --help



機能

すぐ使えるように名前が短い、インストール・セットアップが楽
表示がカラフル
複数のユーザやリストをマージして表示できる
DM読み書き
public timelineの検索
user stream、filter stream読める。なんかよく切断されるので自動再接続するようにしといた
複数アカウント使える
UNIX pipeからもtweetできる


作った経緯

フルスクリーンのターミナルでプログラミングしてる途中で、たまにtwitterが見たいのだがブラウザを開くと集中力が切れてしまう。
そこでターミナルのままtwitterを見たくなった。
tやtermtterでもいいんだけど複数のlistをまとめて見るのが面倒だった。
俺はlistが見たい。
tw @shokai/arr @shokai/masuilab @shokai/homu @ahokai @shokai_log
のように複数のlistとユーザのtweetをマージしてぱっと見て、すぐ作業に戻るというのをやりたかった。
terminalだと履歴にコマンドがたまるので、ctrl+rしてtwで検索すぐ実行できる。

あとbotにしゃべらせるのにも使いたかった。小さなbotに毎回twitterの機能をつけるのが面倒なので、
echo 'hoge' | tw --user=shokai_log --pipe
で、ユーザを一時的にbotに切り替えつつUNIX pipeでtweetできる。pipeの場合は140文字以上だったら複数回に分けてtweetするようにした。

streamはむかし音声読上げさせたら面白かった(3つのイベントのハッシュタグを同時に把握できた)のでそのうち使いそうだから実装した。

手元だけでなくサーバーにインストールして使うことも想定しているので、インストール・セットアップ・アカウント追加が楽だと良い。
twitterのアプリ毎に10万アカウントしか使えないようになってるけど、一応自分でoauthのアプリ登録してconsumer_keyとsecretを設定ファイルで入れ替えるのも簡単なようにしておいた。
(そもそもそんなに使う人がいるとも思えないけど)


args_parser

複数アカウント使い分けつつもわかりやすいコマンド体系にするためにargs_parserを作った。


json出力モードがあればbot作るのに汎用的に使える物になるかも。

0

HerokuでSinatra+Memcached使う

Memcached使ってみたかった。なんかキャッシュしなきゃならんので
ブラウザ <---> Heroku <---(cache)---> Twitter
なものを作った。

できたもの http://twiticon.herokuapp.com/

twitterのユーザーアイコンをHTMLに簡単に貼れるやつ。ソースコードはここ

こういうHTMLでアイコンがでる。
<img src="http://twiticon.herokuapp.com/shokai">


小さいのや大きいのも貼れる。

テキストや http://twiticon.herokuapp.com/shokai.txt
JSONでも取得できる http://twiticon.herokuapp.com/shokai.json


使い方は http://twiticon.herokuapp.com に詳しく書いてある。


Twitterのアイコン

ここにAPIがある
GET users/profile_image/:screen_name | Twitter Developers
ユーザーが新しいアイコンをアップロードする毎にURLが変わる。
例えば今の俺のアイコンは https://si0.twimg.com/profile_images/2328443341/tmp_normal.png になってる。


Memcached

ふつうのSQL DBみたいにHDDにデータは保存しないけど、メモリ上で高速に動作する。
あとExpireする期限を決めれる。今回は保存したアイコンURLは12時間で消滅するようにした。
12時間1秒経過すると、再度Twitter APIを使ってURLを取りに行く。


Herokuでmemcached使う

Memcache | Heroku Dev Centerにドキュメントがある。
Herokuのmemcachedはユーザー名とパスワードによる認証があって、SASLというプロトコルを使っているので対応しているgemじゃないと使えない。
dalliというpure rubyのgemが推奨されている。

いつも使ってるCで書かれてるmemcached gemはSASLサポートしてるって記述があるんだけど、使い方がドキュメントに書いてないし面倒臭くなってdalliに落ち着いた。


Herokuにmemcached addon追加した。無料だけどクレジットカード番号登録しないと使わせてもらえない。
% heroku create --stack cedar
% heroku addons:add memcache:5mb


パスワードとかは
% heroku config
で見れる。
MEMCACHE_PASSWORD, MEMCACHE_SERVERS, MEMCACHE_USERNAMEがそれ。
これがHerokuで動かしてるアプリの環境変数に入るので、ENV[‘MEMCACHE_SERVERS’]とかで取り出す。


dalliでMemcached使う

認証なし
require 'rubygems'
require 'dalli'
cache = Dalli::Client.new 'localhost:11211'

Heroku用
cache = Dalli::Client.new ENV['MEMCACHE_SERVERS'], {:username => ENV['MEMCACHE_USERNAME'], :password => ENV['MEMCACHE_PASSWORD']}


で、あとはcacheにset/getすればよい。
# cache 1 hour
cache.set('icon_shokai', 'https://si0.twimg.com/profile_images/2328443341/tmp_normal.png', 3600)

# get icon
puts cache.get('icon_shokai')


ちなみにHerokuのmemcachedは自分のローカル環境からも接続できる。
addons:add memcachedしたらすぐに起動するので、手元で開発してるプログラムで
cache = Dalli::Client.new 'xxxxx.ec2.northscale.net', {:username => '123456heroku.com', :password => 'asdf122345hujiko'}
とか書いても動かせる。太平洋横断してるから遅いけど。


ローカル開発環境にMemcachedをインストール

homebrewやapt-getでインストールできる。
% brew install memcached
% memcached -vv -p 11211
これでlocalhost:11211で起動する。


SinatraでMemcachedを使う

ふつうに上に書いたのを組み合わせてredirectするだけなのでgithub見ればわかると思う。
https://github.com/shokai/twiticon


controllerでは
redirect icon user, size
とだけ書いて、iconって関数は適当にキャッシュもしてくれるように書かれている


あと開発時はローカルのlocalhost:11211のmemcachedを見て欲しいので、環境変数が無かったらconfig.ymlから同じ値を探すようにしたらはかどった。


感想

memcache無料の5MBぐらいだと、tmp_cache gem使ったほうが設定もいらないし楽なのでは・・・

0

twitterのlistに自分を追加できない件

自分が作ったリストに自分を追加できない(昔はできた)

API使ったら追加できた。rubygemsのtwitterを使った場合

Twitter.list_add_member("test", "shokai")


ここに置いた
https://github.com/shokai/twitter-api-console/blob/master/cmds/add_list.rb


こんな感じで使えるはず
git clone git://github.com/shokai/twitter-api-console.git
cd twitter-api-console
gem install bundler
bundle install
cp sample.config.yml config.yml
ruby auth.rb
# oauthで認証される
ruby cmds/add_list.rb "shokai" "test"

0

sfc_ikiteru

@sfc_ikiteruというtwitter botができた。1時間ごとにSFCの状況をtweetする。

ソースはここにあるhttps://github.com/shokai/twitter_sfc_ikiteru


あといつのまにかSFC.死ぬ.jpがymrlによって作られていた。こっちの方が詳細がわかりやすい。


gem sfc_ikiteruは、pingをeventmachineで並列化したので監視対象のサーバーを増やしても大丈夫になった。
今こんな感じ

% sfc_ikiteru
sfc_ikiteru => 生存率 80%
web.sfc.keio.ac.jp => 正常です
ccz01.sfc.keio.ac.jp => 正常です
ccz02.sfc.keio.ac.jp => 正常です
mail.sfc.keio.ac.jp => 正常です
gw2.sfc.keio.ac.jp => 正常です
keio.gw.sinet.ad.jp => 正常です
shonan.sfc.wide.ad.jp => 正常です
masui.sfc.keio.ac.jp => 正常です
www.mag.keio.ac.jp => 応答なし
cpu0.mag.keio.ac.jp => 応答なし