hagino3000's blog

平成アーカイブス (更新停止)

Twitter @Anywhereのハマリ所

in_reply_to_status_idを付加する方法がわかったので記事訂正しました。

Twitter @Anywhereというのはtwitterが出しているJavaScriptライブラリ。OAuth認証も含めてJSだけでタイムラインの取得や投稿ができる。まだ完成度が低くて、バージョンアップしたら改善されているか確認したい点も含めてまとめる。これを書いている時点での最新はversion 1.1.2。

OAuthアクセストークンの寿命が短かい

3時間ぐらいでexpireする気がする。トークンリフレッシュもできない。ずっと起動しっぱなしで使うアプリだと途中で切れて、認証許可画面が出てくる。
アクセストークンをOAuth 1.0aのトークンに変換してexpireしない様にするという技が存在する模様。

Retweet解除ができない

Retweetはできるが、一度Retweetしたものを解除するメソッドが用意されていない。

in_reply_to_status_idがセットできない

致命的なんですけど……。Status.updateメソッドに渡しても無視される。
セットする方法がわかりました
http://d.hatena.ne.jp/hagino_3000/20110125/1295961642

Retweet込みでその人のタイムラインが取得できない

その人のホーム画面を見た時と同じタイムラインの取得ができない。ドキュメントには、Retweet込みのタイムラインが取得できるUser.userTimelineというメソッド書いてあるが実際には存在しない。User.timelineメソッドだと、Retweet無しのその人のタイムラインが取得できる。

誰にRetweetされたかという情報を込みでYour tweets, retweetedが取得できない。

New UIで「Your tweets, retweeted」*1を見ると一覧で誰がRetweetしたかが見れないのと同様、Status毎にStatus.retweetersメソッドを使って取得するしか無い。しかしこれをやると350回/hのAPI制限を軽く突破してしまう。

コールバック関数が呼ばれない時がある

ソースで示すと、次の関数が実行された後にcallback.successとcallback.errorのどちらも実行されない時がある。

// 例:ユーザーのタイムラインを取得する
function(screenName, callback) {
  twttr.anywhere(function(a){a.User.find(screenName, {
      success : function(user){
        user.timeline({
          page : 0,
          count : 100,
          success : callback.success,
          error : callback.error
        });
      },
      error : callback.error
    });});
}

原因はわかっていて、@Anywhereのなんらかのメソッドを呼ぶと次のフローで処理が進む。
1. @Anywhereが生成したiframeにメッセージを送信する
2. @Anywhere用のiframeからtwitter APIを叩く
3. twitter APIの結果をJSON parseする
4. 元のiframeに結果を戻す
5. メソッド呼び出し時に渡したコールバック関数に結果を渡す
この時、2でtwitter APIを叩いた結果がJSON文字列では無くHTMLの時がある。502と503の時は確定。稀に200なのにHTMLを返してくる時があり、3のJSON parseで失敗する。そうなると渡したコールバック関数が呼ばれずに、呼び出し側は延々と待ち続ける事になる。ちゃんとやりたい場合はタイムアウト処理を入れる必要がある。

コールバック関数が渡せないメソッドがある

ふぁぼりメソッドとリツイートメソッドにはコールバック関数が渡せない。成功したのか失敗したのか判断できない。

IEでcreatedAtがそのままDateオブジェクトに変換できない

JSONPのSearch APIIEでもそのままDateオブジェクトに変換できる「Fri, 08 Oct 2010 10:29:30 +0000」だったが、@anywhereでは「Fri Oct 08 03:25:56 +0000 2010」に変更されている。主要なブラウザではそのままDateオブジェクトに変換できるが、IEだけ失敗するので、IEで使う場合はDateオブジェクトに変換する前に文字列操作が必要になる。

プロパティ名の命名規則が統一されていない

camelCaseとsnake_caseが混在しているし一体どういう事なの……

ソースに手が入れられない

@Anywhereではクロスドメインプロキシとなるhtmlファイルをiframeで読み込んで、その中でtwitterAPIを叩いている。そのiframe内部で実行されるjavascriptはこちらから手を入れられない。ソースもやたらと抽象化されていて読みにくい。

httpsで提供されていない

@Anywhereを使うには次の通りのscriptタグを埋め込む必要があるが、このソースがhttpのみで提供されている。元のページがhttpsだと、@Anywhereを使った時点で「安全では無いページ」としてブラウザの警告が出てしまう。

<script src="http://platform.twitter.com/anywhere.js?id=YOUR_API_KEY&v=1" type="text/javascript"></script>

リンク

Welcome to @Anywhere | dev.twitter.com
http://dev.twitter.com/anywhere/begin
@Anywhere documentation
http://platform.twitter.com/js-api.html
Twitter Anywhere Development | Google グループ
http://groups.google.com/group/twitter-dev-anywhere
Anywhere (anywhere) on Twitter
http://twitter.com/#!/anywhere

*1:他の誰かにリツイートされたあなたのポスト