🐋

PHP + Twitter API v2で画像付きツイートする(無料プラン)

2023/05/26に公開

環境

現象/背景

  • 2023/5/20頃から、ブログ投稿に連動したTwitter画像投稿が機能していない

原因

  • Twitter Developer Portal で該当プロジェクトが凍結されていた
    Twitter Developer Portalで凍結されている様子

対策1

新たなプロジェクトを作成し、以下の認証情報を更新した

  • consumerKey
  • consumerSecret
  • accessToken
  • accessTokenSecret

対策1のエラーと原因

  • 認証情報を更新しても以下のエラーがでる
[message] => You currently have access to Twitter API v2 endpoints and limited v1.1 endpoints only. If you need access to this endpoint, you may need a different access level. You can learn more here: https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-leve
[code] => 453
  • 以下のように v1.1でも無料でstatuses/update(ツイート)できるはず
    Twitter API access levels and versions
  • 実際はv1.1でstatuses/updateできない模様。実際にできなかった。参考:Twitter Developers Forums
    “statuses/update”(v1.1 API) endpoint does not work in the Free tier.

対策2

  • API v1.1がだめならAPI v2でツイート
  • いろいろ調べたところ、以下の振る舞いっぽい
v1.1 v2
ツイート -
画像アップロード -
  • よって、v1.1で画像アップロードをして、v2でツイートしなければならない

コード

function tweet($txt,$img=FALSE){

    $consumerKey = "xxxxx";
    $consumerSecret = "xxxxx";
    $accessToken = "xxxxx";
    $accessTokenSecret = "xxxxx";

    $connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
    
    //画像があればアップロード
    if($img){
	// 以下はv1.1で動作
        $media1 = $connection->upload('media/upload', ['media' => $img]);
        $parameters = [
            'text' => $txt,
            'media' => [
                'media_ids' => [
                    $media1->media_id_string
                ]
            ]
        ];
    }else{
        $parameters = ['text' => $txt];
    }

    // これを書くと、以降はv2動作になる
    $connection->setApiVersion('2'); 
    
    // 以下はv2で動作
    $result = $connection->post( 'tweets' , $parameters , true); # jsonにするため、trueをかかないとダメ
}

参考

  • v2のtweetsに渡すパラメータはjson。TwitterOAuthのpostの第3引数をtrueにするとjsonになる。
    abraham comment
  • POST /2/tweets
  • 同じタイミングで使えなくなった人を観測。このタイミングでx corp.が一斉になんかやったのかもしれない。

https://twitter.com/takaya030/status/1659858222185086978

Discussion