Hatena::ブログ(Diary)

minorio のプログラミング・メモ

RSS2

2007-10-17

[][][] Twitter_AS2_2.0 の改造(やりたいことのリスト) 21:46

  1. ブラウザのリロードできちんと最新の発言が表示されるようにする
  2. 3秒ごとに過去の発言へと遡って表示して行くようにする
  3. 時刻の表示を日本時間に変換する

まず1つ目。

FireFoxLive HTTP headers で確認すると、こうなっている。

http://www.twitter.com/statuses/user_timeline/8440992.json

GET /statuses/user_timeline/8440992.json HTTP/1.1
Host: www.twitter.com
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; ja-JP-mac; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: __utma=43838368.401563204.1178289831.1192520917.1192545078.5; __utmv=43838368.Logged%20In; __utmz=43838368.1192520917.4.2.utmccn=(referral)|utmcsr=d.hatena.ne.jp|utmcct=/minorio/|utmcmd=referral; _twitter_session=c5b25ff71d67fb16f8aaa2ff2a07236f
If-None-Match: "2792b7b3bb8b94415cf41a12193e647d"

HTTP/1.x 304 Not Modified
Date: Wed, 17 Oct 2007 13:10:42 GMT
Server: hi
Connection: close
Etag: "2792b7b3bb8b94415cf41a12193e647d"
Expires: Wed, 17 Oct 2007 13:15:42 GMT
Cache-Control: private, max-age=0, must-revalidate, max-age=300
Set-Cookie: _twitter_session=c5b25ff71d67fb16f8aaa2ff2a07236f; domain=.twitter.com; path=/

最後のところで、5分間(300sec)の寿命のクッキーをセットしている。5分待たずにリロードするとその時点でまた5分のクッキーがセットされるのでいつまでたっても更新されないのかなと考えて5分以上待ってからリロードしてみたが、それでも 304 Not Modified が返って来た。(^_^;

クッキーを無効にして試したところ、最新の内容が取得できた。そのときの HTTP ヘッダーはこうなっていた。セッション ID が変更されているみたいだ。

http://www.twitter.com/statuses/user_timeline/8440992.json

GET /statuses/user_timeline/8440992.json HTTP/1.1
Host: www.twitter.com
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; ja-JP-mac; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
If-None-Match: "2792b7b3bb8b94415cf41a12193e647d"

HTTP/1.x 200 OK
Date: Wed, 17 Oct 2007 13:23:38 GMT
Server: hi
Status: 200 OK
X-Runtime: 0.27348
Etag: "2aae6ece7679ae4c48423a13ad21f577"
Cache-Control: private, max-age=0, must-revalidate, max-age=300
Content-Type: application/json; charset=utf-8
Content-Length: 13269
Set-Cookie: _twitter_session=267fad0f080c517dda1ad06446c52651; domain=.twitter.com; path=/
Via: 1.1 louie.twitter.com
Expires: Wed, 17 Oct 2007 13:28:38 GMT
Connection: close

さらに、もう一度クッキーを有効にして試してみた。すると、セッション ID が以前のものに戻り、取得された内容も古いものに逆戻りしてしまった!

http://www.twitter.com/statuses/user_timeline/8440992.json

GET /statuses/user_timeline/8440992.json HTTP/1.1
Host: www.twitter.com
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; ja-JP-mac; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: __utma=43838368.401563204.1178289831.1192520917.1192545078.5; __utmv=43838368.Logged%20In; __utmz=43838368.1192520917.4.2.utmccn=(referral)|utmcsr=d.hatena.ne.jp|utmcct=/minorio/|utmcmd=referral; _twitter_session=c5b25ff71d67fb16f8aaa2ff2a07236f
If-None-Match: "2aae6ece7679ae4c48423a13ad21f577"

HTTP/1.x 200 OK
Date: Wed, 17 Oct 2007 13:27:29 GMT
Server: hi
Status: 200 OK
X-Runtime: 0.04170
Etag: "2792b7b3bb8b94415cf41a12193e647d"
Cache-Control: private, max-age=0, must-revalidate, max-age=300
Content-Type: application/json; charset=utf-8
Content-Length: 13261
Set-Cookie: _twitter_session=c5b25ff71d67fb16f8aaa2ff2a07236f; domain=.twitter.com; path=/
Via: 1.1 alkonost.twitter.com
Expires: Wed, 17 Oct 2007 13:32:29 GMT
Connection: close

ブラウザを一旦終了してから再び試してみると、場合によっては最新のものが表示されるし、古いままのときもある。セッション ID が変わっていても 304 Not Modified となって古い情報しか取得できない場合もあるため、クッキーのせいと断定することはできない。(>_<)

では、JSON API を叩くときに、count=20 や since=(現在より1分前の時刻)のようなオプションをつけたらどうだろうか?

http://www.twitter.com/statuses/user_timeline/8440992.json?count=20

GET /statuses/user_timeline/8440992.json?count=20 HTTP/1.1
Host: www.twitter.com
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; ja-JP-mac; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: __utmz=43838368.1192520917.4.2.utmccn=(referral)|utmcsr=d.hatena.ne.jp|utmcct=/minorio/|utmcmd=referral; __utmv=43838368.Logged%20In; __utma=43838368.401563204.1178289831.1192520917.1192545078.5; _twitter_session=1165a27283cc3fa71c8304976eca860a

HTTP/1.x 200 OK
Date: Wed, 17 Oct 2007 14:10:36 GMT
Server: hi
Status: 200 OK
X-Runtime: 1.25959
Etag: "0346352e6101019a58a572c236decac1"
Cache-Control: private, max-age=0, must-revalidate, max-age=300
Content-Type: application/json; charset=utf-8
Content-Length: 13063
Set-Cookie: _twitter_session=1165a27283cc3fa71c8304976eca860a; domain=.twitter.com; path=/
Via: 1.1 sphinx.twitter.com
Expires: Wed, 17 Oct 2007 14:15:36 GMT
Connection: close

count=20 を付けてみたらセッション ID が同じでもちゃんと最新の情報を取って来れてる感じ。

http://www.twitter.com/statuses/user_timeline/8440992.json?count=20

GET /statuses/user_timeline/8440992.json?count=20 HTTP/1.1
Host: www.twitter.com
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; ja-JP-mac; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: __utmz=43838368.1192520917.4.2.utmccn=(referral)|utmcsr=d.hatena.ne.jp|utmcct=/minorio/|utmcmd=referral; __utmv=43838368.Logged%20In; __utma=43838368.401563204.1178289831.1192545078.1192630496.6; _twitter_session=1165a27283cc3fa71c8304976eca860a; __utmb=43838368; __utmc=43838368
If-None-Match: "0346352e6101019a58a572c236decac1"

HTTP/1.x 200 OK
Date: Wed, 17 Oct 2007 14:17:13 GMT
Server: hi
Status: 200 OK
X-Runtime: 0.35251
Etag: "0bc005fde766a7b4c96fdcc12ac58574"
Cache-Control: private, max-age=0, must-revalidate, max-age=300
Content-Type: application/json; charset=utf-8
Content-Length: 12837
Set-Cookie: _twitter_session=1165a27283cc3fa71c8304976eca860a; domain=.twitter.com; path=/
Via: 1.1 alkonost.twitter.com
Expires: Wed, 17 Oct 2007 14:22:13 GMT
Connection: close

うむ。このやり方(count=20 を付けるだけだが)だと Twitterrific よりも早く更新情報をゲットできてるようだ。ひとまずこれで行くことにしよう。(^_^


では、2つ目。

これは for ループで行けそうだけど、「3秒ごとに」の部分がちょっと面倒。というのも、FLASH には setTimeout 関数がなく、setInterval でやらなきゃいけないようなのだ。

が、検索してみると Flash8 になって setTimeout() 関数が追加されたという情報があった(参考:setTimeoutが便利です。)。スバラシす!

さっそくやってみる。と、ここで問題発生。

画面にテキストが表示されるのはループを抜けたあとになるようで、3秒ごとにメッセージが変わるのではなく、最後のメッセージのみが表示されるという結果に終わった。(>_<、

タイムライン上でループさせたらいいかも知れない。その場合、ループのカウンターをグローバル変数として保持する必要がある。グローバル変数は、どうやら _global.variableName = value; のように書くらしい。

グローバル変数twitter JSON API から取得したオブジェクトを格納して、順に表示させたらうまく行ったが、その後いじってるうちに動かなくなってしまった。ん〜明日見直そう。

トラックバック - http://d.hatena.ne.jp/minorio/20071017/1192625170