記事一覧はこちら

twitpicがオリジナルサイズの画像にアクセス出来なくなったのでpict3dsをtumblrに対応させた

twitpicがオリジナルサイズの画像にアクセス出来なくなったのでpict3dsをtumblrに対応させた

twitpicが画像を強制リサイズするようになりました。どうやら2012年11月27日の早朝に変更されたらしい。手元のデータだと01:56:36~06:29:31の間。 それが一時的なバグか仕様変更か分からないけど、せっかくなのでとtumblrに対応させる事にしました。

今まではtwitterにだけログインしていれば全サービスを使えたpict3dsだけど、同時にtumblrにもログインする必要が出てきた。 oAuthはそれほど苦労しなかったけど、tumblrAPIを使う方が面倒だった。ドキュメントが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 '';

試行錯誤したのは楽しかった。