lovetestterをちょっと直した
先日作った、Twitterの片想い片想われをチェックするツール「lovetestter」をちょっと直した。
修正点
処理の流れについて以前書いた("仕組み"のところ)けど、それを直した。
従来は、フォローとフォロワーのプロフィール一覧を全部取得して、JavaScript側で分析して結果表示していた。でもそれだと、両想いの人(結果として表示しない人)のプロフィールも取得している。しかも両想いの人は当然フォローにもフォロワーにも含まれてるわけで、かなり無駄な通信となっていた。まずこれをなんとかしたい。
それから、特に何もチェックしていなかったので、フォローやフォロワーが大量の人でも使うことができ、ものすごい負荷となってしまう可能性があった。
というわけで、新しい仕組みは以下の通り。
- 最初の画面(スタートボタンが置いてあるところ)は単なるhtml。
- スタートボタンも単なるリンクで、そのリンク先にはRubyで書いたCGI(oauth_start.cgi)がある。
- そのCGIでTwitterのOAuthの初期処理を行い、セッションにリクエストトークンを保存して、認証ページのURLにリダイレクトする。
- Twitterからのコールバック先も、Rubyで書いたCGI(oauth_callback.cgi)になっている。
- そのCGIでは、セッションにアクセストークンを保存して、result.htmlにリダイレクトする。
- result.htmlではjQueryによるajaxで、Rubyで書いたCGIを呼び出す。
- まず、profile.cgiを呼び出す。このCGIでは、TwitterのAPIのaccount/verify_credentialsを呼んで、ログインしたユーザー自身のプロフィールを取得し、jsonで返す。
- result.htmlはjsonを受け取り、そのユーザーのフォローとフォロワーの人数を確認。どちらかが5000を超えていたら、多すぎるので停止。5000以下の場合だけ次へ進む。
- つぎに、relations.cgiを呼び出す。このCGIでは、TwitterのAPIのfriends/idsとfollowers/idsを呼んで、フォローとフォロワーのIDだけを一覧で取得し、jsonで返す。
- result.htmlはjsonを受け取り、分析し、片想いと片想われのIDを割り出す。
- つぎに、users.cgiを呼び出す。このCGIでは、TwitterのAPIのusers/lookupを呼んで、渡されたIDのユーザーのプロフィールを取得し、jsonで返す。
- users/lookupの仕様上、一度に100ユーザーまでしか取得できないので、片想い片想われのユーザーのIDを100個ずつに分けて何度もこのCGIを呼ぶ。
- result.htmlはjsonを受け取り、画面に一覧表示。
- 一覧の中の「フォローする」「フォロー解除」のボタンでは、それぞれfollow.cgiとunfollow.cgiをjQueryのajaxで呼んでいる。
- そのCGIではセッションから取り出した情報を使ってTwitterのAPIを呼んで、フォローの操作をしている。
ポイントは以下。
- profile.cgiでログインユーザーのフォローとフォロワー数をチェックし、5000を超えていたら停止させることにした。
- relations.cgiではフォローとフォロワーのIDだけを取り、プロフィールは取らないようにした。
- users.cgiで指定したIDのプロフィールだけを取ることで、片想い片想われが判明したあとで必要なユーザーのプロフィールだけを取るようにした。
という感じで、負荷対策と高速化がある程度実現しました。5000を超えている人には悪いけど、許してください。上限を5000にしたのは、friends/idsとfollowers/idsの仕様が5000が上限だからそれに合わせたという理由です。
また、従来は画面に「お待ちください...」としか表示してなかったけど、今回からは何度もリクエストを発行することになったので、その進捗がわかるように状態を表示するようにした。これで体感的に速度が向上したような気がする。