twitpicがオリジナルサイズの画像にアクセス出来なくなったのでpict3dsをtumblrに対応させた
twitpicが画像を強制リサイズするようになりました。どうやら2012年11月27日の早朝に変更されたらしい。手元のデータだと01:56:36~06:29:31の間。 それが一時的なバグか仕様変更か分からないけど、せっかくなのでとtumblrに対応させる事にしました。
今まではtwitterにだけログインしていれば全サービスを使えたpict3dsだけど、同時にtumblrにもログインする必要が出てきた。 oAuthはそれほど苦労しなかったけど、tumblrのAPIを使う方が面倒だった。ドキュメントが1ページだから楽だけど。
一番頭を悩ませたのは3DSブラウザのタイムアウト。tumblrが遅いのかどうか知らないが、どうしても投稿された画像をtumblrにpostするのに20秒以上かかって 3DSブラウザがタイムアウトしてしまう。処理は正常に行われているからタイムアウトの数秒後にツイートされるんだけど、公開したら連投される事は間違いない。
問題の部分はcurl_exec($ch);で、ここで20秒以上時間がかかっている。 タイムアウトを防ぐには何かを受信させてやればいい。半角スペースでも適当に送信してやれば問題ないだろう。 そう思ったけど、curl_execの実行中に他の事をさせるのがなんとも出来ない。 そこで、一つのコネクションしか貼っていないのにcurl_multi_initを作り、一秒ごとに102バイトの半角スペースを送信する事にした。
$sp=time(); do{ curl_multi_exec($cm,$running); if($sp!=time()){ echo str_repeat(" ",102); $sp=time(); } }while($running);
最初は毎回1バイトの半角スペースを送信していたのだが、3DSブラウザが容量オーバーで落ちたのでリミッターを付けた。102は1024の1/10。
これでタイムアウトはしなくなったのだが、今度はリダイレクトが出来ない。 投稿が完了したらリダイレクトをさせるのだが、既にレスポンスボディを送信しているのでヘッダを送信出来ない。
そこで懐かしのmeta refreshを使いブラウザを再読み込みさせる事に成功。
print '';
試行錯誤したのは楽しかった。