LoginSignup
3

More than 3 years have passed since last update.

ある時点より昔のツイートを消す

Posted at

黒歴史を消したいのに、黒歴史クリーナーが最新の3200件しか対応していない。
最新のツイートは消したくないし、消したいツイートは3200件より昔という状況だったのでしぶしぶ書く。

スレッド処理してないので時間かかります。まぁどうせ実行して放置するのでいいかなと思って。
早くやりたいなら年月ごとに1スレッド作って配列をスライスして渡せばいいんじゃないかな(適当)

twitterのアカウント設定からデータの一括DLを要求すると圧縮ファイルがあるので、その中の"tweet.js"を使います。
ファイル先頭が
window.YTD.tweet = [ { 又は
window.YTD.tweet.partN = [ { ...
となってるので、変数名を消して
[ { ...
にします。

ツイート数が多い場合はファイルが"tweet.js", "tweet-part1.js", "tweet-part2.js", ... になってるようです。(1ファイル上限100MBっぽい)それぞれのファイルに対してスクリプトを実行するか、メモリに余裕があれば一気に全部読み込んでください。

ツイート削除APIはリミットがかかってないようなので、スリープは挟まなくていいようです。ただしあまりにも多くのスレッドを生成して削除するとDoS攻撃まがいになるのでエラー返されるかも。のんびりバックグラウンドで実行させるのがいいでしょう。

destroy_tweets.py
#!/usr/bin/env python3

from datetime import datetime
import sys
import json
import tweepy

# https://developer.twitter.com/apps
key = ""
secret_key = ""
token = ""
secret_token = ""

auth = tweepy.OAuthHandler(key, secret_key)
auth.set_access_token(token, secret_token)
api = tweepy.API(auth)

with open('tweet.js', encoding='utf_8') as f:
  tweetsjson = json.load(f)
  for tweet in tweetsjson: # 2018年4月1日以前のツイートを消したい場合
    if datetime.timestamp(datetime(2018, 4, 1, 0, 0, 0)) > ((int(tweet['id']) >> 22) + 1288834974657) / 1000:
      try:
        api.destroy_status(int(tweet['id']))
      except:
        print(tweet['id'], file=sys.stderr)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3