指定した期間のツイートを削除

##黒歴史は無かったことにしたい

世の中にはいろんなツールが既にあるが、
ツイッターの仕様で最新3200件しか削除できないとか、
大量削除は有料とか。
非常に困る。

こちとら2010年から積み上げたゴミのようなつぶやきは優に10万を超える。

探せばQiitaに全ツイートを消すソースもある。
でも全部は困るんだよ。
そもそも全消しするならアカウント作りなおした方が早いだろ…

黒歴史だけ消して最近の真人間な自分は残しておきたいんだ。

そんな人向け。

##手順
1. python3.6環境の構築
2. 黒歴史が詰まったアーカイブの取得
3. アーカイブの中にあるtweet.jsを編集
4. APIキーの取得
5. ソースコードの編集
6. 実行
7. 完了

##1. python3.6環境の構築
もちろん使えるよね？
使えなかったらグーグル先生に聞いてくれ

##2. 黒歴史が詰まったアーカイブの取得
① PCでツイッターにログインして設定画面を開く（https://twitter.com/settings/account）
② 「Twitterデータ」タブを選択（パスワード求められたら入力する）
③ 「Twitterデータをダウンロード」を押す。
　※ダウンロードができるようになるまでかなり時間がかかる
　　過去のツイートやDMを画像も含めてDLするので、Twitterがダウンロードデータを生成するのに時間がかかる
　　でも新設設計なので、ダウンロード可能になったらダウンロードリンクをメールで送ってくれる。
④ メールに来たリンクをクリックしてダウンロード開始。
⑤ ダウンロードが完了したら適当な場所に解凍する

##3. tweet.jsを編集
ソースコードでこのファイルを読み込みたいので、ちょこっと手を加える。

① 解凍したフォルダの中の「data」フォルダを開く
② 「tweet.js」という名前のファイルがあるので、適当なテキストエディタで開く。
③ 先頭にある「window.YTD.tweet.part0 = 」という文字列を削除。
④ 保存して閉じる。

※保存する際にUTF-8のBOM無しにしておくこと。多分ファイル読み込み時にエラー出る。
※あと、念のためファイルのバックアップは取っておこう。ミスったらまたダウンロードのやり直しだ。

##4. APIキーの取得
ツイッターのAPIを使用するのにアクセストークンなるものが必要になる。まあ、ただの文字列だ。
下記手順で2つのkeyと2つのtokenを取得しよう。
プログラムで必要なのでメモ帳にでもコピペすればOK

① ココにアクセス→https://developer.twitter.com/en/apps
② Appsって中にいくつかあるかもしれないが、ツイッターのアカウントIDが記載されたものの「Details(詳細)」を選択する
③ 「App details」「Keys and tokens」「Permissions」って3つのタブがあるのを確認する

④ まずは「Permissions」を選択し、「Edit」ボタンを押して権限を変更する
⑤ 権限は「Read, write, and Direct Messages」てやつ。
⑥ Saveを押して保存。

⑦ 「Keys and tokens」を開く
⑧ 「Keys, secret keys and access tokens management.」に記載されている下記をそれぞれメモする
　・API key
　・API secret key
⑨ 「Access token & access token secret」の情報もコピーする
　「Regenerator」的なボタンを押すと
　・Access token
　・Access token secret
　が表示されるのでそれぞれメモする

これでOK

##5. ソースコードの編集
ソースサンプルは下記
各々よしなに変更してほしいところはコメントに書いたので好きなようにしてくれ

```python

import json
import twitter # pip install python-twitter

# ====== いい感じに設定書いてね ====== 

# keyとtokenを下記に記載
api_key             = 'ここにコピペ', # メモした「API key」をここにコピペ
api_secret_key      = 'ここにコピペ', # メモした「API secret key」をここにコピペ
access_token        = 'ここにコピペ', # メモした「Access token」をここにコピペ
access_token_secret = 'ここにコピペ', # メモした「Access token secret」をここにコピペ

# tewwt.jsのファイルパスを記載。("\"は必ず2つつけてね)
js_file_path = "D:\\sample\\hogehoge\\tweet.js" 

# 下記に指定したbegin～endの期間のツイートを削除する。（beginとendの日付を含む）
begin_year  = 2010 # この年の
begin_month = 1    # この月の
begin_day   = 1    # この日から↓
end_year  = 2019 # この年の
end_month = 12   # この月の
end_day   = 31   # この日までを削除

# ================================ 

api = twitter.Api(
    consumer_key        = api_key,
    consumer_secret     = api_secret_key,
    access_token_key    = access_token,
    access_token_secret = access_token_secret,
    sleep_on_rate_limit = True
)

class date():
    def __init__(self, y, m, d):
        self.y = y
        self.m = m
        self.d = d

class date_range():
    def __init__(self):
        self.begin = date(begin_year, begin_month, begin_day)
        self.end   = date(end_year, end_month, end_day)

# もっと効率良い方法ある気がするが、気にしたら負け
def cnv_month_from_str2int(month):
    if month =='Jan':
        return 1
    elif month =='Feb':
        return 2
    elif month =='Mar':
        return 3
    elif month =='Apr':
        return 4
    elif month =='May':
        return 5
    elif month =='Jun':
        return 6
    elif month =='Jul':
        return 7
    elif month =='Aug':
        return 8
    elif month =='Sep':
        return 9
    elif month =='Oct':
        return 10
    elif month =='Nov':
        return 11
    elif month =='Dec':
        return 12
    else:
        assert False, "ERROR!! [{}] is not month".format(month)

def run():
    d_r = date_range()
    cnt = 0
    with open(js_file_path, encoding='utf-8', mode='r') as f:
        tj=json.load(f)
        for tweet0 in tj:
            tweet = tweet0['tweet']
            print()
            print(tweet['id'])

            date = tweet['created_at']
            dow, month, day, time, other, year = date.split()
            _year = int(year)
            _day = int(day)
            _month = cnv_month_from_str2int(month)
            
            # out of custum date range.
            if ( _year > d_r.begin.y  and d_r.end.y < _year) \
            or (_month > d_r.begin.m and d_r.end.m < _month) \
            or (_day > d_r.begin.d   and d_r.end.d < _day):
                continue

            print("The number that deleted tweet is {}".format(cnt))
            print("Now deleting {}/{}/{}".format(_year, _month, _day) )

            try:
                api.DestroyStatus(tweet['id'])
                cnt += 1
            except Exception as e:
                # Error if already deleted or tweet is RT
                print(e.args)
    return cnt

if __name__ == '__main__':
    dl_cnt = run()
    print()
    print("Finish!!")
    print("Deleted {} tweets".format(dl_cnt))


```

##6. 実行
実行すると削除が始まる。
自分のアカウント開いて更新連打すればツイート数が減っていくのがわかる。
削除には結構時間がかかるので、気長に待とう。（数万件削除だと1時間とかそういう単位じゃ終わらない）

##7. 完了。
finishが表示されれば完了しているはず。
これで黒歴史をほぼ綺麗に消せたはずだ。やったぜ。

## 非対応事項
ちなみに、RTの取り消しはできない…
tweet.jsの情報を詳しく見てないけど、多分RTだと判定できるものがあるはず
あとはRTを取り消すAPIを公式ドキュメントから探して叩けばいいはず。調べるのが面倒だった。。

画像付きツイートだけ削除とかも、やろうと思えばできるはず。

やりたい人は.jsの中身とAPIを調べて良い感じに自分で書き換えてくれ


##参考
https://qiita.com/aeas44/items/a5b82da69b64b32aada4