search
LoginSignup
3
Help us understand the problem. What are the problem?

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
What you can do with signing up
3
Help us understand the problem. What are the problem?