鴨川にあこがれる日々

軽い技術っぽい記事かいてます

個人用黒歴史クリーナーを自作しよう

はじめに

RubyとGemのTwitterを使って,個人アカウントのツイートの履歴を全部削除するコードについて言及します.
以前3回ほど試みましたが,日本語のドキュメントの頼ったばかりにできませんでした.
観念して英語で探したので,備忘録としても.

タイトルにもある黒歴史クリーナーというサービスもありますが,自分の全ツイート履歴をアップロードするのは気がひけるので...

黒歴史クリーナー

結論

全件ダウンロードしないとできません

環境

以下の環境で実行しています.

です

本題

以下のページを参考にしました.
Module: Twitter::REST::Timelines — Documentation for twitter (5.11.0)

例によってまず認証を行います.

以下のようにすると直近20ツイートくらいが消えます.

# -*- coding: utf-8 -*-
require 'twitter'

# アプリケーションキー 個人ごと
consumer_key = "hogehoge"
consumer_secret = "hogehoge"
access_token = "hogehoge-hogehoge"
access_token_secret = "hogehogehogehoge"

# 認証
client = Twitter::REST::Client.new do |config|
  config.consumer_key = consumer_key
  config.consumer_secret = consumer_secret
  config.access_token = access_token
  config.access_token_secret = access_token_secret
end

client.user_timeline().each do |elem|
  client.destroy_status(elem.id)
end

user_timelineで自分のツイートを取得し,そのツイートのidをdestroy_statusメソッドの引数にします.
実行するとuser_timelineで取得できただけ,削除ができます.

全部消したいので,

# -*- coding: utf-8 -*-
require 'twitter'

# アプリケーションキー 個人ごと
consumer_key = "hogehoge"
consumer_secret = "hogehoge"
access_token = "hogehoge-hogehoge"
access_token_secret = "hogehogehogehoge"

# 認証
client = Twitter::REST::Client.new do |config|
  config.consumer_key = consumer_key
  config.consumer_secret = consumer_secret
  config.access_token = access_token
  config.access_token_secret = access_token_secret
end

while true
  client.user_timeline(:count => 200).each do |elem|
    client.destroy_status(elem.id)
  end
end

全て削除したいので,while trueのループの中で先ほどの取得と削除を処理させ,エラーになるまで実行させます.

user_timeline(:count => xxx)

xxxは整数値を最大200まで指定ができ,1回に取得する件数を指定しています.
最大値の200であれば200件ツイートを取得します

実行時間が非常にかかるので,気長に待たないといけません(他にいい方法あったら知りたい・・・)

終わりに

user_timelineで取得したツイート(この場合elemがそれに当たるかと思います.)に付与されている情報を利用して,RTとfavがないツイートだけ削除する,という用途もできるかと思います.

追記(同日)

上の方法だと暫く経つとリクエストの上限に達して停止します.

指摘されたこと

以下の様な感じで試してみたところ,

i = 0
while true
  user_timeline(count => 200, :page => i)
  i += 1
end

リクエストの上限には達することはなくなったのですが,
RequestTimeoutのエラーがでるようになりました.
gemのメソッドのところには記述がなかった気がしたので,
ご指摘いただいたpageパラメータについて調べてみます.(余力があれば追記します.)

追記(10月4日)

Pageパラメータを使っても削除できる限界はあるようでした.
3200件以降はuser_timelineで取得できないようです.
ツイートのidさえ手に入ればいいので,個人のツイートをダウンロードして,ツイートのidをdestroy_statusに渡すというのが現実的な解決策でしょうか.
(だから黒歴史クリーナーは全部削除で個人の履歴をアップロードさせている?)