michimani.net

Twitter API1.1で画像付きツイートしてみる

2016-05-26

だいぶ前にTwitterAPI1.1で画像付きのツイートをする方法について個人のブログに書きましたが、ほとんど反応がなかったのでこちらに書いてみます。

実装環境

まず、以下の条件下での方法ですので、ご確認ください。

OAuth consumers for CakePHPでは基本的に以下のような形でAPIとやりとりします。

<?php
$client = new OAuthClient(
    $ck, // アプリケーションのConsumer key
    $cs // アプリケーションのConsumer secret
);

$client->post(
    $at,    // アプリケーションのaccess token
    $ats,   // アプリケーションのaccess token secret
    $api_url,  // 各種APIのリソースURL
    $params   // 各種APIに必要なパラメータ
);

例えば、普通にツイートするときは次のようになります。

<?php
$client->post(
    $at,    // アプリケーションのaccess token
    $ats,   // アプリケーションのaccess token secret
    'https://api.twitter.com/1.1/statuses/update.json',
    array(
        'status' => 'Tweet内容'
    )
);

画像を1枚添付してツイートする

では、画像を1枚添付する場合は、リソースURLが https://api.twitter.com/1.1/statuses/update_with_media.json ですので、以下のようにします。

<?php
$client->postMultipartFormData(
    $at,    // アプリケーションのaccess token
    $ats,   // アプリケーションのaccess token secret
    'https://api.twitter.com/1.1/statuses/update_with_media.json',
    array(
        'media[]' => '添付する画像へのパス'
    ),
    array(
        'status' => 'Tweet内容'
    ),
);

注意したいのが、普通にツイートする場合と違って、 OAuthClient の post ではなく postMultipartFormData を使うという点です。 ここに気付かなくて大分苦労しました。

※追記 コメント欄にてご指摘いただきました通り、 TwitterAPIの公式リファレンス POST statuses/update_with_media (deprecated) | Twitter Developers では、update_with_mediaのAPIがdeprecated(非推奨)となっていますので、画像1枚の場合も後述する方法を用いたほうが良さそうです。 @riocamposさん、ありがとうございました。

画像を複数枚(最大4枚)添付してツイートする

1枚の画像がこれでいけるなら、複数画像の場合はarray()の中に追加すればいいんじゃないかと思うところですが、残念ながらそれはできません。。 なので、画像を複数添付する場合は、別の方法を使います。

簡単に手順を書くと、

  1. Twitterに画像をアップロードして、その画像固有のIDを取得する
  2. 取得したIDをカンマ(,)で結合する
  3. 通常のツイートのパラメータに、結合した文字列を渡す
となります。

1.Twitterに画像をアップロードして、その画像固有のIDを取得する

では、まず手順1。 画像アップロードのリソースURLは https://upload.twitter.com/1.1/media/upload.json です。

<?php
$res = $client->postMultipartFormData(
    $at,    // アプリケーションのaccess token
    $ats,   // アプリケーションのaccess token secret
    'https://upload.twitter.com/1.1/media/upload.json',
    array(
        'media' => '添付する画像へのパス'
    ),
);

ここで注意したいのは、先程と同様に post ではなく postMultipartFormData を使うという点と、 パラメータの名前が media[] ではなく media であるという点です。

2.取得したIDをカンマ(,)で結合する

正常にアップロードが完了すると、json形式でレスポンスが取れるので、その中からmedia_idを取得します。

<?php
$res_obj = json_decode( $res );
    $media_id = $res_obj->media_id;

これを画像の枚数分繰り返して、取得したmedia_idをカンマ(,)で結合するのが手順2となります。(現状、4枚まで添付可能です。)

3.通常のツイートのパラメータに、結合した文字列を渡す

あとは、一番最初に紹介した普通にツイートする際のパラメータに、結合した文字列を追加するだけです。

<?php
$client->post(
    $at,    // アプリケーションのaccess token
    $ats,   // アプリケーションのaccess token secret
    'https://api.twitter.com/1.1/statuses/update.json',
    array(
        'status' => 'Tweet内容',
        'media_ids' => 'mediaID01,mediaID02,mediaID03'
    )
);

以上が、Twitter API1.1画像付きツイートする方法でした。


comments powered by Disqus