【Twitter API v2&GAS】リツイート数が一定以上のツイートをリツイートする方法

2022年09月18日

今回は、Twitter API v2とGoogle Apps Script(GAS)を使って、リツイート数が一定以上のツイートに制限してリツイートする方法を解説します。


Twitterを使っていて自動でリツイートできたら良いなぁと思い、調べてみたらTwitterにもAPIが提供されていることを知りました。さらに、Google Apps Script(GAS)とスプレッドシートを使って、あるキーワードが含まれているツイートをリツイートする方法を解説している記事が多くヒットしました。

コードを書いている中で、リツイートされている数が一定以上のツイートをリツイートできたら良いなぁと思い、調べてみてもわからなく、試行錯誤したらできたので紹介します。(この記事にたどり着けるのか分かりませんが...)

本記事ではAPIを使って自動化する部分については、他の人の記事で詳しく説明されているので省略することにし、検索したツイートのリツイート数が一定以上だったらリツイートするコードの例に特化したいと思います。
(プログラマではないので私が書いた部分のコードは見にくいかもしれません...)

はじめに、GASからリツイートできるように設定します。

私が参考にした記事は下記です。非常に詳しく説明されているので素人の私でもできました。

などです。

さて、この記事の本題です。


方法としては、検索結果にリツイート数を要求するようにします。

アクセスURLに指定した条件に対して、検索結果が返ってきます。

下記の通り、ツイート検索する際のアクセスURLにpublic_metricsを追加することで、

検索してヒットしたツイート結果にリツイート数が追加されます。


// ツイートを検索する
function findTweets(service, searchWord, lastTweetId)
{
  // API URL
  var getPoint = 'https://api.twitter.com/2/tweets/search/recent?query='
   // 検索キーワードとパラメータ
   var keyWord = encodeURIComponent(searchWord)
   var params = '&tweet.fields=author_id,id,lang,public_metrics,text,created_at&max_results=10'
   params += '&since_id=' + lastTweetId
   // アクセスURL組み立て
   var url = getPoint + keyWord + params
   var response = service.fetch(url, getOption);
   var result = JSON.parse(response)

  console.log(result)
  return result.data

}

console.log(result)をretunの前に書くと検索結果を見ることができます。

見方は、GASを実行後、表示タブ > ログ をクリックし、ポップアップウィンドウの「Apps Script ダッシュボード」をクリックします。このダッシュボードでは実行するごとにリアルタイムで実行結果が反映されます。

実行した関数のタイムラインをクリックすると下記のように検索結果が表示されます。

このとき、public_metrics: [Onject]があれば、要求通りとなります。

なぜ、pubric_metricsを要求したかと言いますと、この中にリツイート数のデータが格納されているからです。


【検索結果】(内容は省略しています。)

デバッグ{ data:
                     [ { created_at: '2022-09-*****',
                          text: 'あああああ',
                          lang: 'ja',
                          id: '000000000000',
                          public_metrics: [Object],
                          author_id: '00000000' },


Twitter API v2のマニュアルを見ますと、public_metricsはツイートのなんらかのアクションの回数を扱っているようです。

この中にリツイート回数であるretweet_countがあります。このデータの型はintegerなので整数値です。

したがって、プログラムでは変数.data.public_metrics.retweet_countを使ってリツイート数を制限できます。

使用例

var tweetList = findTweets(省略);
var tweet = tweetList[0];
//日本語かつ、リツイート数が0でなければリツイート
if (( "ja" == tweet.lang ) && ( tweet.public_metrics.retweet_count  >  0 )) {
    //Retweet処理
}


上記の閾値0を別の数値にすることでリツイート数の制限値を変えることができます。
ちなみに、アクセスURLにlangを追加することで、ツイートの言語を要求することができます。
「ja」が日本語で、「en」が英語です。もちろんその他の言語もあります。

以上、「リツイート数が一定以上のツイートをリツイートする方法」でした。
アクセスURLに設定できる要求パラメータとして、
attachments
author_id
context_annotations
conversation_id,created_at
entities
geo
id
in_reply_to_user_id
lang
non_public_metrics
organic_metrics
possibly_sensitive
promoted_metrics
public_metrics
referenced_tweets
reply_settings
source
text
withheld
など、まだまだ多くの情報があり、Twitter APIのマニュアルをもっと詳しく見ることで、さらに複雑なことができそうですね。

【全文】

参考までにプログラムを載せておきます。

ほとんどのプログラムは上記の参考記事の通りです。

//【設定】-----------------------------------------------------------------------------------------------
//認証用の各種変数
var apikey = 'あなたのAPI KEY';
var apisecret='あなたのAPI SECRET KEY';
var tokenurl = "https://api.twitter.com/oauth/access_token";
var reqtoken = "https://api.twitter.com/oauth/request_token";
var authurl = "https://api.twitter.com/oauth/authorize";
var endpoint2 = "https://api.twitter.com/2/tweets"; //v2のツイートするエンドポイント
var appname = "アプリの名前"; //Developer Platformで作成したアプリ
var userID = '0000000000000000' // Twitter ユーザID(番号)

//【認証関連】-------------------------------------------------------------------------------------------
//認証用インスタンスの生成
var twitter = TwitterWebService.getInstance(
    apikey,    //API Key
    apisecret    //API secret key
);

//アプリを連携認証する
function authorize() {
     twitter.authorize();
}

//認証を解除する
function reset() {
     twitter.reset();
}

//認証後のコールバック
function authCallback(request) {
     return twitter.authCallback(request);
}

//【 自動リツイート】----------------------------------------------------------------
var sheetData2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート2");
// 「シート2」はシート名

// APIコール時のオプション(GET)
const getOption = {
    method: 'get',
    contentType: 'application/json',
    muteHttpExceptions: true,
    //headers: { Authorization: 'Bearer ' + bearerToken }
}

// APIコール時のオプション(POST)
const postOption = {
    method: 'post',
    contentType: 'application/json',
    muteHttpExceptions: true,
    //headers: { Authorization: 'Bearer ' + bearerToken },
}

function RetweetMain(){
  var service = twitter.getService();
  var searchWords = pickUpSearchWords();
  for (var i = 0; i < searchWords.length; i++){
    var searchWord = searchWords[i][0];
    var lastTweetId = searchWords[i][2];
    var tweetList = findTweets(service, searchWord, lastTweetId);
    if (tweetList == null){
      continue
    }

    //最大リツイート数を3以下に制限
    var MaxRetweetCount = 3;
    if(MaxRetweetCount > tweetList.length){
      MaxRetweetCount = tweetList.length;
    }
    var j = 0;
    var num = 0;
    while(j < tweetList.length){
       var tweet = tweetList[j];
        if (tweet.id > lastTweetId) {
          lastTweetId = tweet.id;
         }
         //日本語かつ、リツイート数が0でなければリツイート
        if (( "ja" == tweet.lang ) && ( tweet.public_metrics.retweet_count > 0 )) {
           putRetweet (service, tweet);
           num++;
        }
        if(num >= MaxRetweetCount){
           j = tweetList.length;
         }
         j++;
       }
       var titleRow = 1;
       var lastTweetIdCol = 3;
       var updateCell = sheetData2.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1);
       updateCell.setValue(lastTweetId);
     }
}

// 検索ワードをスプレッドシートから取得する
function pickUpSearchWords(){
   var titleRow = 1;
   var startRow = 1 + titleRow;
   var startCol = 1;
   var endRow = sheetData2.getLastRow() - titleRow;
   var endCol = 3;return sheetData2.getRange(startRow, startCol, endRow, endCol).getValues();
}

// ツイートを検索する
function findTweets(service, searchWord, lastTweetId){
   // API URL
   var getPoint = 'https://api.twitter.com/2/tweets/search/recent?query='
   // 検索キーワードとパラメータ
   var keyWord = encodeURIComponent(searchWord)
   var params = '&tweet.fields=author_id,id,lang,public_metrics,text,created_at&max_results=10'
   params += '&since_id=' + lastTweetId

  // アクセスURL組み立て
   var url = getPoint + keyWord + params
   var response = service.fetch(url, getOption);
   var result = JSON.parse(response)console.log(result)return result.data
}

// リツイート
function putRetweet(service, tweet){
  targetTweet = { 'tweet_id': tweet.id }
  postOption.payload = JSON.stringify(targetTweet)
  var result = JSON.parse(service.fetch('https://api.twitter.com/2/users/' + userID + '/retweets', postOption));
  //結果
  console.log(result)
}

無料でホームページを作成しよう! このサイトはWebnodeで作成されました。 あなたも無料で自分で作成してみませんか? さあ、はじめよう