[メモ]アニメーションgifのチェック[php]

おひさしぶりです。

タイトルの通り、チェック対象のファイルがアニメーションgifかそうじゃないかのチェックプログラムを・・・

で、とほほさんのGIFフォーマットの詳細を参考にしてみました。

/**
 * アニメーションGIFかチェック
 *
 * @params string $img_file   画像ファイル(画像ファイルまでのPATH付き)
 * @return bool               true:アニメーションGIF false:それ以外
 */
function checkAnimationGif($img_file) {
    if (!file_exists($img_file)) {
        // ファイルが無い
        return false;
    }
    if (!($fp = fopen($img_file, "rb"))) return false;
    $head = fread($fp, 6);
    if (!preg_match("/^GIF89a/", $head)) {
        // GIF89a 以外
        return false;
    }
    // カウント初期化
    $gce_cnt = 0;
    while (!feof($fp)) {
        if (bin2hex(fread($fp, 1)) != "21") continue;
        switch (bin2hex(fread($fp, 2))) {
            /*
            // 2014-11-06 削除
            case "ff0b": // Application Extension
                fclose($fp);
                return true;
                break;
            */
            case "f904": // Graphic Control Extension
                $gce_cnt++;
                if ($gce_cnt > 1) {
                    fclose($fp);
                    unset($gce_cnt);
                    return true;
                }
                break;
        }
    }
    fclose($fp);
    unset($gce_cnt);
    return false;
}

多分これで、チェックできるはず・・・

追記:2014-11-06
adobeのフォトショップで作成されたgifでApplication Extensionが含まれる通常のgifが作成されていることがわかりましたので
上記のソースを修正しました。

スポンサーリンク

[メモ]twitter REST API による複数画像付きツイートの仕方

久方ぶりです。

今回は、twitterのAPIでツイートに複数の画像を指定する仕方を記述します。

基本的には、次のURLの通り・・・
https://dev.twitter.com/docs/api/multiple-media-extended-entities

で、見に行くの面倒な人用に、簡単に書くと以下の通り

https://upload.twitter.com/1.1/media/upload.json

上記エンドポイントに対して、画像ファイルを1つずつuploadします。
uploadが成功すると

{
	"image": {
		"w": 1546,
		"h": 1024,
		"image_type": "image\/jpeg"
	},
	"media_id": 460938773744717825,
	"media_id_string": "460938773744717825",
	"size": 530963
}

このような、値が返って来ます。
で、返ってきた「media_id」か「media_id_string」を使ってツイートのREST APIをたたきます。

ツイートするためのエンドポイントは以下の通りです。

https://api.twitter.com/1.1/statuses/update.json
※uploadした画像のmedia_idが有効な時間はuploadしてから60分らしいです。
上記のリンク先にそんなことが書かれていた気がします。

で、、画像付きをツイートするには、今まで通りのパラメータに「media_ids」パラメータを追加します。
「media_ids」は先ほどuploadしたときの返り値のmedia_idを最大4つ(2014-06-25現在)まで設定できます。
複数指定のしかたはmedia_idをカンマ区切りで記述すればOKです。

因みに、ツイート時に5つのmedia_idを設定すると次のエラーコードとメッセージがjsonで返ってきました。
code=44
message=media_ids parameter is invalid.

また、画像1枚だけを上記の要領でツイートすると、ツイートはされますが、公式のタイムラインに初期表示として画像が表示されないようです。(2014-06-25現在)
なので、1枚しかないのであれば、今まで通り以下のREST APIを使用するのがいいと思います。

https://api.twitter.com/1.1/statuses/update_with_media.json

以上、ちょっとした覚書でした。

2014-10-31 追記:
アニメーションgifは1枚のみ可能。
アニメーションgif + jpg ×
アニメーションgif + 通常のgif ×

2015-05-21 追加:
エンドポイント /1.1/statuses/update_with_media.jsonが本日使用できなくなったっぽいです。
また、公式のweb表示も1枚のときでも正しくサムネイル表示されるようになっているようです。
※これはいつからなおったのか確認していません・・

スポンサーリンク

[chunk]twitter REST API[api1.1]

連投・・・

土日のREST APIがハングしなかった・・・

今しがた、コンソール叩いてレスポンスヘッダー見てみたら

chunkの文字が見当たらない・・・

ちょっと前までchunkがあったと思っていたんだけど・・・

?もしかして、twitter側でchunkやめたのか??

かなり安定しているんだけど、、chunkのせいだったのか・・・

もう少し様子を見よう・・・

追記(2014-05-20 20:45):そんなことはなかったorz

スポンサーリンク

[愚痴]twitter REST API[orz]

ご無沙汰しております。

表題の件について、ひとつ愚痴を・・・

自分自身のtwitterアカウントのusertimlineを、「REST API」を使用しcronで定期的に取得していたところ・・・

取得が終わらず取得プログラムのプロセスが、ずっと残っているではありませんかorz

この原因を色々調べてみたけど良く分からないo…rz

プログラムにどこまで実行できたのかをlogに出力したところ、「REST API」にリクエストを投げ(file_get_contentsを使用)て返ってこないことがわかりました。

本当に返ってきていないか調べるためにfile_get_contentsではなく、fopenで接続をしてからfreadで1バイトずつ、ファイルに出力したところ・・・jsonデータがファイルに出力されていました。

と言うことは?どういうこと??

feof関数のマニュアル以下抜粋

返り値
ファイルポインタが EOF に達しているかまたはエラー (ソケットタイムアウトを含みます) の場合に TRUE 、 その他の場合に FALSE を返します。

注意
警告
fsockopen() でオープンした接続がサーバーによって閉じられていない場合、feof() はハングします。回避策は以下の例を参照ください。

“オープンした接続がサーバーによって閉じられていない場合、feof() はハングします。”

プロセスが終わらず残っていたのは、ハングしてたからか?というメボシをつけてみた・・・

で、twitterなので、freadで固定バイト数ずつ読み込んで結合し、その文字列がjson_decodeでfalseを返さない場合、while文を抜けるようにしてみたところ上手くこの処理で抜ける場合の「REST API」のリクエストがあった、これで十中八九『EOF』がtwitterのサーバーから送られていないと思われ・・
※上記のwhile文を抜けるもう少し詳しい条件としは、!feof($fp)の場合で、json_decode($str)がfalseではない場合にbreakです。

結局、REST APIのリクエストが届くサーバーが、EOFを返すサーバーと返さないサーバーがあるということで、どうもこの返さないサーバーにあたることが多いのが問題・・・
ていうか、twitterさんeof返しておくれ・・・

スポンサーリンク