e-tipsmemo

ごった煮

pythonでツイート全部消す

ツイート全部けしたくなったが、黒歴史クリーナーなどでは3200件までとか、
削除前後にメッセージを出す機能とかあって、いろいろと面倒なので、
pythonにやらせる。

ツイートを全部ダウンロード

こればっかりは手動で行う。
2,3日待って、自身のツイートがすべて記録されているTweet.jsというものを手に入れる。

Tokenを得る(アプリ申請が通ればこの手順は不要)

アプリ申請をしてTokenを得てもいいけど申請が厳しく、通らなかったときに、英語のメールの返信を怠るとそのアカウントではアプリが作れなくなる。
なのでほかのアカウントでもう一度アプリ申請するか、
既存のクライアントのConsumer_keyとConsumer_Secretでoauth認証するとtoken_key token_secretを得られる。
PythonでTwitterアカウントのAccess Tokenの取得を半自動化する[OAuth認証] - Qiita

tweet.jsを少し書き換える

tweet.jsはなぜか知らんが以下のようなフォーマットになっている
jsonぽいがjsonではない

window.YTD.tweet.part0 = [
    {
        "tweet" : {
                    .....
        },
        "tweet" : {
                    .....
        },
        "tweet" : {
                    .....
        },
        .....
    }
]
  • window.YTD.tweet.part0 =の部分を"tweets" :に書き換える。
  • 全体を{}で囲う
{
"tweets": [
    {
        "tweet" : {
                    .....
        },
        "tweet" : {
                    .....
        },
        "tweet" : {
                    .....
        },
        .....
    }
]
}

ツイートidを抽出する

tweet.jsは人によってはとても巨大で、
openからのjson.loadしたら固まってしまう。
なのでちょっとずつ読み込んでいきながら、jsonのparseをしてもらう。
pythonのijsonを使う。
ijsonでjsonを少しずつ読み込む - Qiita

import ijson
import time

with open("./tweet.js", "r") as file_obj:
    ijson_generator = ijson.items(file_obj, "tweets.item")

    for value in ijson_generator:
        # print(value["tweet"]["full_text"])
        print(value["tweet"]["id_str"])
        time.sleep(1)

1秒ごとにtweet.jsのtweetからidを表示する。

tweepyを使う

削除する前に取得したトークンでtweepyが使えるか簡単に検証

import ijson
import time
import tweepy

CONSUMER_KEY = "**************"
CONSUMER_SECRET = "***********"
ACCESS_TOKEN = "*************"
ACCESS_SECRET = "**************"

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)

api = tweepy.API(auth)

api.update_status("test") #tweet

これでツイートができればOK

tweet.jsをもとにツイートを消す

あとはこのプログラムと最初に編集したtweetjsをつかってツイートを消す。

import ijson
import time
import tweepy

CONSUMER_KEY = "**************"
CONSUMER_SECRET = "***********"
ACCESS_TOKEN = "*************"
ACCESS_SECRET = "**************"

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)

api = tweepy.API(auth)
delete_count = 0

with open("./tweet.js", "r") as file_obj:
    ijson_generator = ijson.items(file_obj, "tweets.item")

    for value in ijson_generator:

        print(value["tweet"]["full_text"])
        status_id = value["tweet"]["id_str"]

        try:
            api.destroy_status(status_id)
            delete_count += 1
            time.sleep(100/1000)
        except:
            print(status_id, 'deletion failed.')

    print(delete_count, 'tweets deleted.')

0.1秒待ってるのは、あまりにも高速に連続でAPIを使用しすぎて、おこられたらこまるので適当なwaitを入れている。
本当は1秒ぐらい待ちたかったが、ツイートが60000件あるので、全ツイートを消すのに16時間かかってしまうのであきらめた。

感想

ツイートを消すためだけにpythonを書いた
全ツイートを消すのに5時間かける価値があるのかはわからない。
アカウントを消すのが一番早い気がしなくもないが、昔とったアカウントだとなんかもったいない