【未完】GAS×Twitter API v2でツイートを自動削除する方法は、現状存在しない

Google Apps Script

本記事では、Google Apps Script(GAS)を使用して、Twitterのツイートを自動で削除する方法について紹介します。

※6/28現在、v2 ツイート削除のエンドポイントが使えないようです。新しい情報が分かり次第また記事を更新します。

今年3月に発表された新しいAPI(Twitter API v2)について、GASでツイートする記事をあげたところ、本記事をもとにツイートできた!という声をいくつかいただきました(うれしい!!!)。

で、思ったのが、「GASから自動削除する方法もあったらいいな」ということ。Twitter APIでは同じ内容の投稿はできないし、過去ツイを定期的に消したいということもあるはず。

ということで、どのくらい需要があるか分かりませんが、無料ですぐに使えるGoogle Apps Script(GAS)を使って、プログラミング経験のない方でもできるよう、(なるべく)コピペでできるような方法を紹介したいと思います。

v2無料プランではツイート検索ができない!

Twitter API V1.1の無料プランでは、[user_timeline]を用いて以下のようにツイートを取得することができました。

https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=[アカウント名]&count=10

しかし、v2の無料プランではツイートの取得(検索)はできなくなっています。以下はv2の料金プランです。

プラン料金読み取り上限書き込み上限その他制限
Free無料1,500回/月使用できるIDは1つ
Basic100ドル/月
(約13,265円)
10,000回/月1ユーザー:3,000回/月
1アプリ :50,000回/月
使用できるアプリは2つまで
Enterprise非公開非公開非公開非公開
※Enterpriseの価格は応相談

有料プランにすれば検索可能になりますが、月額10,000円超はなかなかですよね。。。

参考:https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-level

じゃあどうするか

今回やろうとしていたのが、指定期間で自分の過去ツイートを取得して、それを削除するというものでした。しかし、検索ができないのでこれを実現することができません。

v2無料プランで使えるエンドポイントは投稿・削除のみです。削除はid指定で1件に対して行います。そこで、GASでツイートした際にツイートIDを控えておき、それをもとに削除するという方針に変更します。

既に投稿したツイートに関してはどうしようもないですが、今後ツイートIDを記録していくことで、期間指定で削除とか、特定の文字を含むツイートは削除などの操作ができるようになります。

事前準備

Twitter APIを使うには、Twitter Developer PlatformでTwitterアプリケーションの作成と、初回認証作業が必要です。以下記事にて解説しています。

以下記事では、Google Apps Script(GAS)を用いてTwitter API v2でツイートする手順を解説しています。ツイート処理では、ツイート後にツイートIDを返すようにしていますので、これをベースに削除処理を作りたいと思います。

ツイート管理用のスプレッドシートを作成

ツイートを管理するために、Googleスプレッドシートを使います。

スプレッドシートの開き方や設定方法についてはこちらをご参照ください。

ツイート内容をスプシに書き込む処理を追加

こちらのソースコードのsendTweet()に、ツイート時にスプレッドシートにツイートを書き込む処理を追加します。

const SHEET_ID = "[スプレッドシートのID]"; // 一番上のほうに記載してください

function sendTweet() {

  var payload = {
    text: 'Test tweet from API!!!!!'
  }

  var service = getService();
  if (service.hasAccess()) {
    var url = `https://api.twitter.com/2/tweets`;
    var response = UrlFetchApp.fetch(url, {
      method: 'POST',
      'contentType': 'application/json',
      headers: {
        Authorization: 'Bearer ' + service.getAccessToken()
      },
      muteHttpExceptions: true,
      payload: JSON.stringify(payload)
    });
    var result = JSON.parse(response.getContentText());
    Logger.log(JSON.stringify(result, null, 2));
    
    // ▼追加
    var sheet = SpreadsheetApp.openById(SHEET_ID).getSheets()[0];
    var lastRow = sheet.getLastRow();
    let now = new Date();
    sheet.getRange(lastRow + 1, 1).setValue(result['data']['id']);
    sheet.getRange(lastRow + 1, 2).setValue(result['data']['text']);
    sheet.getRange(lastRow + 1, 3).setValue(now);
    // ▲追加

  } else {
    var authorizationUrl = service.getAuthorizationUrl();
    Logger.log('Open the following URL and re-run the script: %s', authorizationUrl);
  }
}

ツイート時に取得したresponseには、そのツイートのIDと、ツイート文面が格納されています。それをJSON.parseでGASで扱える形にしてスプレッドシートに転記するという流れです。

ツイートするごとに、このスプレッドシートに追記されていきます。

ツイート削除処理の実装

前項にて、GASからAPI経由で投稿したツイートをIDで管理するようにしました。これを踏まえて、IDをもとにツイートを削除する処理を実装します。

公式ドキュメントの通り、URLにツイートIDを付加してAPI実行する処理を書きました。

function deleteTweet() {

  var service = getService();

  var id = "[ツイートID]";
  var url = "https://api.twitter.com/2/tweets/:";

  let response = UrlFetchApp.fetch(url + id, {
    method: 'POST',
    'contentType': 'application/json',
    headers: {
      Authorization: 'Bearer ' + service.getAccessToken()
    },
    muteHttpExceptions: true,
  });

  let result = JSON.parse(response.getContentText());
  console.log(result)
}

しかし、実行結果が「OAuth2でこのエンドポイント使うのは許可されてないよ」と返ってきました。

調べてみると、以下のスレッドを発見。

「Twitter API v2 では利用できなくなりました」・・・・えぇぇ。。。っていうかこのスレッドの質問者はOAuth1.0で試してだめだったみたいだし、OAuthのバージョンうんぬんじゃなくてエンドポイント自体使えないんじゃん・・・

質問者の「代替策はありますか?」という投稿で終わっていました。最終更新が9日前なので、もしかしたらTwitterDevからまた回答があるかもしれませんが、現状、v2でツイート削除はできないようです。無料版v2でできることってマジで投稿だけじゃん。誠に遺憾です。

結論:6/28現在、v2で削除する方法はない

ということで、6/28現在はTwitter API v2でツイートを自動削除する方法はないという結論に至りました。公式ドキュメントに書いてあるのに、何でできないんだろう?としばらく悩んでしまいました。

たまたまツイッターコミュニティの投稿を発見して、今は利用できないと分かりましたが、使えなくなったなら公式ドキュメントに明記しておいてほしいです。TwitterはスクレイピングもRPAツール利用も禁止なので、完全に詰みです。はやく代替案を教えてほしい・・・。

どうしても、という場合は、v1.1の[statuses/destroy/:id]を代わりに使うしか方法はないかと思います。ネットではまだ動くという投稿を見かけました。(v1.1は非推奨・廃止予定なのでおすすめはしません)

また新しい情報が分かり次第記事を更新したいと思います。

ツイッター自動投稿については、以下記事にて解説していますのであわせてご参照ください。

¥2,860 (2023/10/04 13:55時点 | Amazon調べ)
\楽天ポイント5倍セール!/
楽天市場
chaso

文系出身、数字が苦手な平凡主婦。塾講師、大手企業SE、不動産事務、Webライターを経て現在QAエンジニアとして働いています。機械音痴だけど効率化や自動化をこよなく愛しています!お仕事の依頼・ご相談は問い合わせよりお願いいたします♪

chasoをフォローする

コメント

  1. t より:

    ツイートの削除について”Twitter API v2 では利用できなくなりました”と書いてありますが、英語のやりとりをきちんと読むとブロック機能が使えないだけではないですか?

    • chaso chaso より:

      コメントありがとうございます。
      DELETEはリクエストを200-OKレスポンスで行うことができる、とありますね。
      申し訳ございません、間違った内容を記載してしまいました。
      当記事は数日後に削除させていただきます。
      ご指摘ありがとうございました。

タイトルとURLをコピーしました