TwitterOAuth(Twitter API)で写真付き投稿

あれ?どうするんだっけ?と本を開いたり、Webを漁ったりと情報集めしていくのがメンドイのでまとめました。ということで、あくまで自分の覚書です!なので説明が多々省かれています!ただ、同じようなニーズをお持ちの方は少なからずいると思うので、適宜参考にしていただければ幸いです。

環境

レンタルサーバー:さくらインターネット
プラットフォーム:Laravel 8
PHP:7.4.15

画像付き投稿のおさらい

比較的定型文的な感じで出来ます。

//0.インスタンス
$twitter =  new TwitterOAuth( 'APIキー',
                              'APIシークレット',
                              'アクセストークン',
                              'アクセストークン シークレット');

//タイムアウト設定変更(※必要あれば)
$twitter->setTimeouts(30, 180);

//1.写真のアップロード
$image = $twitter->upload('media/upload', ['media' => '画像へのフルパス']);

//2.ツイート用のパラメーター設定
$parameters = [
     'status' => 'お試し投稿',
     'media_ids' => implode(',', [ $image->media_id_string ]),
];

//3.Twitter投稿
$ret = $twitter->post('statuses/update', $parameters);

サンプルコードは、大体こんな(↑)感じ
タイムアウト設定は、モバイルユースで電波状況が悪い場合にエラーになりやすかったのでタイムアウトまでの時間を長めに設定。

コードの流れ
【0】TwitterAPIで取得した「APIキー」、「APIシークレット」、「アクセストークン」、「アクセストークンシークレット」でTwitterOAuthのインスタンスを作成
【1】まず写真データをTwitterにアップロード。パスは、写真データへのフルパスを指定。
【2】パラメーターにツイート本文と【1】で取得したメディアIDを格納
【3】パラメーターを渡してツイートする

お決まりのなんだかおかしい・・・

コード自体は非常に簡単な実装ですが。当初タイムアウト設定をいれていなかったので、エラーが発生してツイート出来ない現象が連発。それも家では画像付きツイート出来ていたのが、出先でデバッグしたら同じ画像を使っているにも関わらずエラー連発。
「は?」
と、パニクったものの。冷静にどんなエラーが出ているか確認すると。タイムアウトエラー・・・。
つまり、モバイル環境で試していたので、通信環境次第ではアップロードに時間がかかり、タイムアウトに陥るという現象が発生していた。
ので、上記サンプルのようなタイムアウト設定を入れてやりました。
これで問題解決!テストも散々してエラーもなし!
ということで、一通り完成したところで画像投稿サービスの運用開始!

当初は、問題なくサービス運用出来ていたものの、3日目ぐらいから、エラーがチラホラ。「ん?」。でも、写真投稿できてるものもあるから、タイムアウトかな・・・と思っていたら、その翌日は、全ての投稿がエラー・・・。「あれ?」でも、自分が投稿すると、問題なし。「んんん?」

なんだかおかしいが発生・・・。

たまたま、サーバーにエラーが発生してTwitterに投稿出来なかったであろう画像が残っていたので、それを使って画像付き投稿すると・・・エラー!。キターーーーーーーー!
この画像になにか原因があるのか??と調べてみても、特に不審な点はなし。ブラウザでTwitterから対象の画像をツイートしてみたところ、投稿OKでやはり画像に問題はなし。画像サイズの問題か?と数百キロバイト代に圧縮してツイートしてもやっぱりエラー。
「なんだかおかしい・・・」は継続(涙)
どこでエラーが発生しているかを絞り込むと、どうやら写真のアップロードが出来ていない模様。ということで、なにかエラー情報でもないのかと、upload関数の戻り値をチェックしたところ、nullで何もなし。
こんなときこそ、Google先生だとググるものの・・・。同様の現象で悩んでいる様子のものは見つからない・・・。

TwitterOAuthのupload関数でアップロード出来る写真と出来ない写真が発生する問題を解決する方法はコレ!

Google先生にも頼ることは出来ず、Twitter APIのドキュメントとにらめっこすることまる一日。自分の英語力を疑いながら読みすすめるものの。実装における問題点は見当たらず・・・。
ただ、気になったのは「Using the chunked POST media/upload」。この文言。画像アップロードは、簡易的なアップロード方法で十分とはあるけど・・・。もしかして、画像によっては失敗することもあるのでは・・・と思い。上記サンプルで示したupload関数のコーディングを以下の通り変更。

//1.写真のアップロード
変更前)
$image = $twitter->upload('media/upload', ['media' => '画像へのフルパス']);

変更後)
$twitter->upload('media/upload', ['media' => '画像へのフルパス', 'media_type' => mime_content_type('画像へのフルパス')], true);

パラメーターにメディアタイプを指定し、chunkedフラグをtrueに設定して渡したのは写真データだよと教えてあげるようにしました。

これ以降、約一ヶ月経過してますが、アップロード時のエラーはタイムアウトぐらいで、写真によってアップロード出来たり、出来なくなるような現象は消えました。

良かった(ホッ)


この記事が気に入ったらサポートをしてみませんか?