ツイート全部けしたくなったが、黒歴史クリーナーなどでは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)
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時間かかってしまうのであきらめた。