Twitterの片想い片想われをチェックするWebアプリ「lovetestter」を作った

以下のリンクからどうぞ。

今回のは長く使いそうだから、けっこう頑張って、できるだけ本格的に見えるようにした。


これはなに?

Twitterアカウントのフォローとフォロワーを分析して、片想いと片想われのユーザーを抽出する。結果一覧にはいろいろな情報が表示されている。それを見ながらワンクリックでフォローしたり解除したりできる。

片想い片想われってなに?

  • 片想いは、自分がフォローしているけど、相手は自分のことをフォローしてない状態。
  • 片想われは、自分はフォローしてないけど、相手は自分のことをフォローしている状態。

lovetestterを使えば、そういう状態になってるユーザーを一覧表示して、整理できるというわけ。別に相互フォロー主義とかとは関係ないつもり。

使い方

  1. lovetestterを開く。
  2. 真ん中のスタートボタンを押す。
  3. Twitterのサイトに飛ばされるので、そこでアクセスを許可する。
  4. lovetestterに戻ってきて集計がはじまる。
  5. 集計が終わったら一覧が表示される。
  6. おわり。あとは好きにしていい。
あとでもう一度やりたいとき

ブラウザを閉じてないなら、result.htmlのページをリロードするだけでOK。

ブラウザを閉じちゃったなら、もう一回認証からやり直す。トップページでスタートボタンを押すところから。本システムはOAuth情報は明示的には保存してないので、ブラウザを閉じたら(セッションを切ったら)認証は忘れるようになってる。別にOAuthの認証はボタンをクリックするだけなので、そんな面倒じゃないからいいでしょ。

以下、技術的な話

とりあえず使ってみたい人は、以下は読まなくて良いのでまず使ってみてください。

動作環境

動作環境として調べたのは以下。

このうちIE8では、一応動いたけど、表示がちょっとだけさみしい感じだった。CSSが一部適用されてないのと、日付がNaNになっちゃってる。どうせ誰もIE使ってないだろうからいいよね。それ以外では問題なく動いた。

作った理由

自分のアカウントはあんまり細かいフォロー管理とかはしてないでいつもテキトーなんだけど、複数あるbotのアカウントの方ではちょっと管理してたりとかする。似たようなWebサービスをいくつか試してみたけど、自分的にもっと見やすいのが欲しかったので、今回自分で作ってみた。

仕組み

先日、OAuthの勉強としてiPhoneの小ワザをポストするbotを作ったけど、今回はその続きで、ブラウザで動くタイプとして作った。Twitterにアプリを申請するときに、Browserを選ぶ。

  • 最初の画面(スタートボタンが置いてあるところ)は単なるhtml。
  • スタートボタンも単なるリンクで、そのリンク先にはRubyで書いたCGI(oauth_start.cgi)がある。
  • そのCGITwitterのOAuthの初期処理を行い、セッションにリクエストークンを保存して、認証ページのURLにリダイレクトする。
  • Twitterからのコールバック先も、Rubyで書いたCGI(oauth_callback.cgi)になっている。
  • そのCGIでは、セッションにアクセストークンを保存して、result.htmlにリダイレクトする。
  • result.htmlではjQueryによるajaxで、Rubyで書いたCGI(relations.cgi)を呼び出す。
  • そのCGIは、セッションから取り出した情報を使ってTwitterAPIを呼んで、フォローとフォロワーの一覧を取得し、jsonで返す。
  • result.htmlはjsonを受け取り、集計をして、画面に一覧表示。
  • 一覧の中の「フォローする」「フォロー解除」のボタンでは、それぞれfollow.cgiとunfollow.cgijQueryajaxで呼んでいる。
  • そのCGIではセッションから取り出した情報を使ってTwitterAPIを呼んで、フォローの操作をしている。

こんな感じ。サーバー側で動いてるRubyCGIは、ほとんどその辺にあったサンプルのままで動いた。gemで入れたTwitterモジュールをほぼ呼んでるだけ。超便利。

今回の大事なことは全部result.htmlの中でJavaScriptで書いている。ソースみたければどうぞ。

2010-9-20追記

その後、上記の処理を書き直した。新しい処理の流れについては lovetestterをちょっと直した - 今日覚えたこと を参照。追記ここまで。

ハマったところ

  • Twitterにアプリを申請するときのコールバックURLと、OAuth認証時に指定するコールバックURLは一致していないとダメ。
  • gemのTwitterモジュールは古いAPIを呼んでいるので、URLにAPIバージョンが入ってない。
    • バージョンが入ってないと、APIの利用制限になりやすいので困る。
    • 自分でムリヤリ直した(gemで入ったbase.rbのperform_xxxx関数のところのURLに"/1"を追加した)。
  • フォローやフォロワーを取得するAPI(friends/followers)は100件しか取れない。
    • page=2とかを渡すやり方も廃止されていた。
    • 最初のリクエストで、cursor=-1を渡すと、レスポンスにnext_cursorという値が含まれてるので、次からそれを渡して、複数ページを取得する。
    • この-1を渡すのを知らなくて、無指定でもいいと思ってた。無指定と-1を渡すのでは取得するデータの形式が違う。-1重要だった。
    • next_cursor=0だと最後のページらしいので、それまでループしてリストにため込んだ。

メンドイからコードは書かないけど、ググったら普通に解決できたことばかり。そんなに激しくはハマらなかった。

OAuthとセッションの話

上には、保存してないからブラウザを閉じたら次回は認証やり直しって書いたけど、CGIでセッション管理をしてるので、一応セッションの情報としてディスクには書き出している。これ(Rubycgi/sessionモジュールが保存するファイル)って何かのタイミングで勝手に消えるの?どうせブラウザを閉じたらもう不要だから消したいんだけど。

lovetestterという名前

もちろんラブテスターが由来。Amazonラブテスター普通に買えるのね、知らなかった。