TwitterAPIのv1.1とv2.0で比較してみた

2021年11月中旬以降にTwitterDevelopper申請後のAPIのデフォルトがv2.0になっていたので、GASから以下を行った場合のv1.1との違いを書いてみました。

1. アカウントとの連携認証
2. ツイート投稿
3. ツイート取得




##比較対象（[Twitter API Doc](https://developer.twitter.com/en/docs/api-reference-index)）

+ Twitter API - Standard v1.1
+ Twitter API v2: Early Access





##1. アカウントとの連携認証
連携認証部分はv1.1とまるまる一緒で特に問題ありませんでした。

````
//認証用インスタンスの生成
var twitter = TwitterWebService.getInstance(
  '*************************',//Consumer Key
  '**************************************************'//Consumer secret key
);

//アプリを連携認証する
function authorize() {
  twitter.authorize();
}
 
//認証を解除する
function reset() {
  twitter.reset();
}
 
//認証後のコールバック
//ちなみに、これはこの関数名じゃないと通らない～
function authCallback(request) {
  return twitter.authCallback(request);
}
````


##2. ツイートを投稿
単純につぶやくだけの機能です。
endPointUrlもそうですが、payload内の書き方が結構変わっていました。

###v1.1 [POST status/update](https://developer.twitter.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/post-statuses-update)
````v1.0
function postTweet() {
　　　　　  
  var service = twitter.getService();
  var endPointUrl = 'https://api.twitter.com/1.1/statuses/update.json';
　　　　　  
  var response = service.fetch(endPointUrl, {
    method: 'post',
    payload: {
      status: 'Hello world by v1.1.'  //つぶやきたい内容
    }
  });
}
````
###v2.0 [POST /2/tweets](https://developer.twitter.com/en/docs/twitter-api/tweets/manage-tweets/api-reference/post-tweets)
````v2.0
function postTweet() {
　　　　　  
  var service = twitter.getService();
  var endPointUrl = 'https://api.twitter.com/2/tweets';

  var response = service.fetch(endPointUrl, {
    method: 'post',
    contentType:"application/json",    
    payload: JSON.stringify({
      "text":'Hello world by v2.0.'  //つぶやきたい内容
    })
  });
}
````
####違うポイント１：URL
そりゃそうだ

````v1.1
https://api.twitter.com/1.1/statuses/update.json
````
````v2.0
https://api.twitter.com/2/tweets
````
####違うポイント２：payload内
少しだけ構造が違うようです。

````v1.1
    payload: {
      status: 'Hello world by v1.1.'  //つぶやきたい内容
    }
````
````v2.0
    payload: JSON.stringify({
      "text":'Hello world by v2.0.'  //つぶやきたい内容
    })
````

##3. ツイート取得
`#りんご`で検索をした結果の内最新10個を取得する内容です。
ただし、リツイートは検索文字に`-rt`を入れることで除外するようにしてます。

###v1.0 [Standard search API](https://developer.twitter.com/en/docs/twitter-api/v1/tweets/search/api-reference/get-search-tweets)
````v1.0
function getTweet() {
  
  var service  = twitter.getService();

  //クエリはUTF8にする必要があります
  var query="%23りんご -rt";  //検索ワード　#りんご（単純なRTは除外）
  
  //最新10ツイート＆日本語
  var endPointUrl = 'https://api.twitter.com/1.1/search/tweets.json?q='+query+'&result_type=recent&count=10&locale=ja&lang=ja';

  //リクエスト
  var response = service.fetch(endPointUrl, {
    method: 'get',
    headers: {
      'Content-Type': 'application/json',
      'authorization': 'Bearer ' + 'AAAAAAAAAAAAAAAAAAAAA*******************************************************************************************',
    }
  });

  var data = JSON.parse(response.getContentText());

  //ログ出力
  for(var i=0;i<10;i++){
      Logger.log(data["statuses"][i]["text"]);
      Logger.log(data["statuses"][i]["id"]);
  }

  return data["statuses"];
}
````
###v2.0 [GET /2/tweets/search/recent](https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-recent)
````ver2.0
function getTweet() {
  
  var service  = twitter.getService();

  //クエリはUTF8にして入れないとエラーでるから気をつけて！
  var query="(%23りんご -rt) lang:ja";  //検索ワード　#りんご（単純なRTは除外）
  
  //最新10ツイート（日本語の設定の仕方は分からなかった…）
  var endPointUrl = 'https://api.twitter.com/2/tweets/search/recent?query='+query+'&max_results=10&tweet.fields=id,text';

  
  //リクエスト
  var response = service.fetch(endPointUrl, {
    method: 'get',
    contentType:　"application/json",
    headers: {
      'authorization': 'Bearer ' +  'AAAAAAAAAAAAAAAAAA*********************************************************************************',
    }
  });

  var targets = JSON.parse(response.getContentText());

  //ログ出力
  for(var i=0;i<10;i++){
    Logger.log(data["text"]);
    Logger.log(data["id"]);
  }

  return targets["data"];
}
````

####違うポイント１：URL
v2.0では、URL時点で`recent`か`all`かを選択するそうです。（不確実な情報ですが、無料ではrecentしか使えないらしい）

````v1.1
https://api.twitter.com/1.1/search/tweets.json?
````
````v2.0
https://api.twitter.com/2/tweets/search/recent?
````
####違うポイント２：オプション
v2.0での日本語の選択方法が分からなかったです…無いのかな…？
それと、大きな違いが、レスポンスのJSON形式です。
v1.1ではすべての情報が載ったレスポンスが返ってきますが、v2.0ではレスポンスに乗せる情報を選択できるようになっています。（このコードだと、ツイートIDとツイート内容だけをレスポンスで返すようにしています）

````v1.1
q='+query+'&result_type=recent&count=10&locale=ja&lang=ja
````
````v2.0
query='+query+'&max_results=10&tweet.fields=id,text
````

----------------------

あまりサーバーリクエストに詳しくないため大した説明にはなりませんでしたが、参考になれば幸いです。

p.s.
どうしてもリツイートがうまくいかずに困っているので、どなたかがv2.0のコードで共有してくださることを待ってます…
そしてTwitterDevelopper申請時に申請理由書いたり～待ったり～が無くなり、その場で登録完了できるようにもなりましたね。めちゃくちゃ楽。