🗑️

[ X / Twitter ] 自分の全ツイートを一括で削除手順

2024/03/01に公開1

前提

  • 一括削除したいツイートは自分のツイートであること
  • アカウントのアーカイブを取得してしておくこと(データバックアップの意味も)
  • pythonを動かせる環境であること

twitter apiの仕様変更で、いままでの一括削除ルーツは基本使えなくなった。
でも自分のツイッターアカウントの全投稿を一括で削除したい。
公式ヘルプには「ツイートを一括削除することはできません。複数のツイートを削除する場合は、1つずつ手動で削除してください」とあるが、手動で全ツイート削除する作業は不毛で楽しくない

というわけでAPIで一括削除する方法を模索してできたのでメモっておきます。
流れは、自分の全ツイートのIDを取得し、1件ずつループしてAPIで削除。

step 1: アーカイブ取得

ツイッターの設定画面からアーカイブを申請する
設定とプライバシー → アカウント → データのアーカイブをダウンロード

1日ぐらいしたらアーカイブデータの準備ができる

ダウンロードしたアーカイブは/Your archive.htmlをブラウザで開いて閲覧できる。一括削除で使うファイルは/data/tweets.jsのみです。

(ツイッターアーカイブは静的なコンテンツだけどなかなかのクォーリティで感動した。なによりも広告が挟まらないのでいかにもピュアなインターネット黎明期を想起させて懐かしくなっちゃう)

step 2: developerアカウント取得

次にtwitter APIを叩けるようにdeveloperアカウント作る
https://developer.twitter.com/en/portal/petition/essential/basic-info

有料プランを選択するようなUIだが、下にある「Sign up for Free Account」から無料アカウントも作れる。

無料アカウントの用途(APIを使って何をするか)をフォームに入力して、チェックボックス全部チェックしておく。

  • 無料アカウントのAPIを使って収益化するようなことはしてはいけない
  • 上記またはそのた規約違反の場合はツイッターアカウント停止されてしまう

(そのせいでいままでの一括削除ツールが使えなくなったのかな。。。basic planでも月100ドルとなかなか高額)

フォームに入力するテキストは250文字以上の縛りがあったので、雑にchatGPTに書いてもらって貼り付けた

ダッシュボードに遷移されて、無料アカウントできた(審査などない、フォーム入力すればその場で無料アカウントが発行される)

step 3: 認証設定

作成したばかりの無料アカウントでAPI KEY発行しても、閲覧権限のみ。
今回は一括削除したいので、権限のあるAPI KEY発行できるようにユーザー認証セットアップを行う

User authentication settings => set up

App permissions -> Read and write and Direct message
これがないと削除する権限のないアプリケーションとなります

Type of AppはローカルだけなのでどちらでもOKだけどとりあえずautomateのほうを選択
App Infoも今回あまり関係ないけど(required)のフィールドはとりあえず適当に埋める

  • Callback URI / Redirect URL(required)
    http://localhost:3000/

  • Website URL (required)
    あればよいので、ツイッターのリンクとはgithubのリンクとか
    https://twitter.com/shomtsm

save押して、確認画面のYesも押して

すると「OAuth 2.0 Client ID and Client Secret」が表示される
今回に関しては使わないので「Done」

二度と表示されないClient Secretの最終確認でも「Yes, I saved it」

これでUser authentication set upは準備完了で、各種キーを生成する

step 4: 各種キー発行

Keys and Tokensタブで

  • API Key and Secret
  • Access Token and Secret
    を発行

4つの文字列を控える。あとのpythonプログラムで使う

API_KEY = 'YOUR_API_KEY'
API_SECRET_KEY = 'YOUR_API_SECRET_KEY'
ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN'
ACCESS_TOKEN_SECRET = 'YOUR_ACCESS_TOKEN_SECRET'


生成後の管理画面、アクセストークンの権限がちゃんと「Created with Read, Write, and Direct Messages permissions」であることを確認

これはRead Onlyの場合はstep 3の設定ができてないということ

step 5: pythonプログラム

これで準備完了。やっとプログラムを動かせる

main.py
import json
import requests
from requests_oauthlib import OAuth1

# APIキーとトークンの設定
API_KEY = 'YOUR_API_KEY'
API_SECRET_KEY = 'YOUR_API_SECRET_KEY'
ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN'
ACCESS_TOKEN_SECRET = 'YOUR_ACCESS_TOKEN_SECRET'

# OAuth認証
auth = OAuth1(API_KEY, API_SECRET_KEY, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

# アーカイブデータからツイートIDを抽出する関数
def extract_tweet_ids_from_archive(archive_file_path):
    tweet_ids = []
    with open(archive_file_path, 'r', encoding='utf-8') as file:
        data = file.read()
        data = data.replace('window.YTD.tweets.part0 = ', '')
        tweets_data = json.loads(data)

        for tweet in tweets_data:
            tweet_id = tweet['tweet']['id_str']
            tweet_ids.append(tweet_id)
    return tweet_ids

# ツイートを削除する関数
def delete_tweets(tweet_ids):
    url_delete_tweet = "https://api.twitter.com/1.1/statuses/destroy/"
    for tweet_id in tweet_ids:
        del_response = requests.post(url_delete_tweet + f"{tweet_id}.json", auth=auth)
        if del_response.status_code == 200:
            print(f"Deleted tweet ID: {tweet_id}")
        else:
            print(f"Failed to delete tweet ID: {tweet_id}, Status Code: {del_response.status_code}")

# 実行
archive_file_path = 'tweets-sample.js'  # アーカイブファイルのパスを指定
tweet_ids = extract_tweet_ids_from_archive(archive_file_path)
delete_tweets(tweet_ids)

簡単なpythonプログラムだが、一応リポジトリも乗せておく
https://github.com/shomtsm/twitter-delete-all-my-tweet

  1. API KEYなどを書き換える
API_KEY = 'YOUR_API_KEY'
API_SECRET_KEY = 'YOUR_API_SECRET_KEY'
ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN'
ACCESS_TOKEN_SECRET = 'YOUR_ACCESS_TOKEN_SECRET'
  1. アーカイブファイルのパスを指定する
archive_file_path = 'tweets-sample.js'
  1. プログラム実行
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python app.py

ちゃんとポストが0件になりました🎉

(0件になることは何が嬉しいんだろうね...)

Discussion

でんでん2021でんでん2021

丁度、欲しい情報でした。
ありがとうございます。
手順も分かりやすく、自分でも実現できました。

今は削除ツールが使えないので、本当に助かりました。