@scoo

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GAS + TwitterWebService 対象ツイートをリツイートする機能が動作しない問題について

解決したいこと

GASを利用し、特定のハッシュタグのツイートを自動リツイートするBOTを作っています。

実行自体はエラーなく終えることができるのですが、肝心のリツイートが行われていない状況です。

このページからコピペする形で作成しました。
https://kabatin.hateblo.jp/entry/2022/02/27/205845#%E3%81%8A%E3%81%BE%E3%81%91

該当するソースコード(参考にしたページの見本です)

// ベアラートークンと認証用インスタンス
var bearerToken = 'ベアラートークン'
var twitter = TwitterWebService.getInstance(
  'Consumer API Key',         // 作成したアプリケーションのConsumer Key
  'Consumer API Secret Key'  // 作成したアプリケーションのConsumer Secret
);
var userID = '9999999999999999999'    // Twitter ユーザID

// 認証周り
function authorize() { twitter.authorize(); }                            // 認証
function reset() { twitter.reset(); }                                    // 認証解除
function authCallback(request) { return twitter.authCallback(request); } // 認証後のコールバック

// シートを取得
var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // 「シート1」はシート名

// 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 main()
{
  var service = twitter.getService();

  var searchWords = pickUpSearchWords();
  for (var i = 0; i < searchWords.length; i++)
  {
    var searchWord = searchWords[i][0];
    var type = searchWords[i][1];
    var lastTweetId = searchWords[i][2];

    var tweetList = findTweets(service, searchWord, lastTweetId);
    if (tweetList == null)
    {
      continue
    }
    
    for (var j = 0; j < tweetList.length; j++) {
      var tweet = tweetList[j];
      if (tweet.id > lastTweetId) {
        lastTweetId = tweet.id;
      }
      if (type == 'いいね') {
        putFavorite (service, tweet);
      } else if (type == 'RT') {
        putRetweet (service, tweet);
      }
    }

    var titleRow = 1;
    var lastTweetIdCol = 3;
    var updateCell = sheetData.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1);
    updateCell.setValue(lastTweetId);
  }
}

// 検索ワードをスプレッドシートから取得する
function pickUpSearchWords()
{
  var titleRow = 1;
  var startRow = 1 + titleRow;
  var startCol = 1;
  var endRow = sheetData.getLastRow() - titleRow;
  var endCol = 3;
  
  return sheetData.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,text,created_at&max_results=20'
  params += '&since_id=' + lastTweetId

  // アクセスURL組み立て
  var url = getPoint + keyWord + params

  var response = service.fetch(url, getOption);
  var result = JSON.parse(response)
  return result.data
}

// いいね
function putFavorite(service, tweet)
{
  targetTweet = { 'tweet_id': tweet.id }
  postOption.payload = JSON.stringify(targetTweet)
  service.fetch('https://api.twitter.com/2/users/' + userID + '/likes', postOption);
}

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

自分で試したこと

ソースコードはコピペさせてもらったものなので、スプレッドシートの入力ミスを疑いましたが参考ページと違いは無いように見えました。
bc6b75c3616a99e0640ff6b48d00c9c7.png

解決したいこと

リツイート機能だけでも動作するようにしたいです。
ご質問をしながら解決方法を探してみますので、わかりましたら報告します。

よろしくお願いします。

0 likes

No Answers yet.

Your answer might help someone💌