lovetestterをちょっと直した

先日作った、Twitterの片想い片想われをチェックするツール「lovetestter」をちょっと直した。

修正点

処理の流れについて以前書いた("仕組み"のところ)けど、それを直した。

従来は、フォローとフォロワーのプロフィール一覧を全部取得して、JavaScript側で分析して結果表示していた。でもそれだと、両想いの人(結果として表示しない人)のプロフィールも取得している。しかも両想いの人は当然フォローにもフォロワーにも含まれてるわけで、かなり無駄な通信となっていた。まずこれをなんとかしたい。

それから、特に何もチェックしていなかったので、フォローやフォロワーが大量の人でも使うことができ、ものすごい負荷となってしまう可能性があった。

というわけで、新しい仕組みは以下の通り。

  • 最初の画面(スタートボタンが置いてあるところ)は単なるhtml。
  • スタートボタンも単なるリンクで、そのリンク先にはRubyで書いたCGI(oauth_start.cgi)がある。
  • そのCGITwitterのOAuthの初期処理を行い、セッションにリクエストークンを保存して、認証ページのURLにリダイレクトする。
  • Twitterからのコールバック先も、Rubyで書いたCGI(oauth_callback.cgi)になっている。
  • そのCGIでは、セッションにアクセストークンを保存して、result.htmlにリダイレクトする。
  • result.htmlではjQueryによるajaxで、Rubyで書いたCGIを呼び出す。
  • まず、profile.cgiを呼び出す。このCGIでは、TwitterAPIのaccount/verify_credentialsを呼んで、ログインしたユーザー自身のプロフィールを取得し、jsonで返す。
  • result.htmlはjsonを受け取り、そのユーザーのフォローとフォロワーの人数を確認。どちらかが5000を超えていたら、多すぎるので停止。5000以下の場合だけ次へ進む。
  • つぎに、relations.cgiを呼び出す。このCGIでは、TwitterAPIのfriends/idsとfollowers/idsを呼んで、フォローとフォロワーのIDだけを一覧で取得し、jsonで返す。
  • result.htmlはjsonを受け取り、分析し、片想いと片想われのIDを割り出す。
  • つぎに、users.cgiを呼び出す。このCGIでは、TwitterAPIのusers/lookupを呼んで、渡されたIDのユーザーのプロフィールを取得し、jsonで返す。
  • users/lookupの仕様上、一度に100ユーザーまでしか取得できないので、片想い片想われのユーザーのIDを100個ずつに分けて何度もこのCGIを呼ぶ。
  • result.htmlはjsonを受け取り、画面に一覧表示。
  • 一覧の中の「フォローする」「フォロー解除」のボタンでは、それぞれfollow.cgiとunfollow.cgijQueryajaxで呼んでいる。
  • そのCGIではセッションから取り出した情報を使ってTwitterAPIを呼んで、フォローの操作をしている。

ポイントは以下。

  • profile.cgiでログインユーザーのフォローとフォロワー数をチェックし、5000を超えていたら停止させることにした。
  • relations.cgiではフォローとフォロワーのIDだけを取り、プロフィールは取らないようにした。
  • users.cgiで指定したIDのプロフィールだけを取ることで、片想い片想われが判明したあとで必要なユーザーのプロフィールだけを取るようにした。

という感じで、負荷対策と高速化がある程度実現しました。5000を超えている人には悪いけど、許してください。上限を5000にしたのは、friends/idsとfollowers/idsの仕様が5000が上限だからそれに合わせたという理由です。

また、従来は画面に「お待ちください...」としか表示してなかったけど、今回からは何度もリクエストを発行することになったので、その進捗がわかるように状態を表示するようにした。これで体感的に速度が向上したような気がする。