1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TwitterAPIが有料化してしまったので、API無しで自分の全ツイートを取得する

Posted at

この記事は元々2024年1月5日に個人ブログで公開された内容をQiitaに移行したものです。

訳あってX(Twitter)で自分のすべてのツイートを取得する必要がでてきました。

これまでであればTwitter APIを使ってサクッと取得したいところなのですが、悲しいことにTwitter APIは2023年に大幅な仕様変更が行われ、Freeプランではツイートの取得ができなくなりました。

ツイートの取得ができる最小プランがBasicプランですが、これは月100$とお高めです。趣味だけで使うには払いたくありませんね。

ということで仕方がないので代替案を考えてみました。

(そういえば今は「ツイート」じゃなくて「ポスト」って呼ぶんでしたっけ...。)

1. アーカイブのダウンロード

面倒ですがまずはブラウザでポチポチ操作が必要です。

X(Twitter)の設定ページ(https://twitter.com/settings/account)へ移動し、「アカウント」>「データのアーカイブをダウンロード」を選択します。

ここからダウンロードのリクエストを送ることができます。

twitter-download-1024x617.jpg

リクエストを送ったらX側の準備ができるまで1日程度かかるので、気長に待ちましょう。

ダウンロードできるようになったらメールで通知が来ますので、メールの指示に従ってダウンロードしましょう。

2. tweets.jsをtweets.jsonへ変換

さっそくダウンロードファイルを解凍してみましょう。

ファイルが多数含まれていますが、今回欲しい過去のツイートデータは/data/tweets.jsにあります。

中身はこんな感じ。

tweets.js
window.YTD.tweets.part0 = [
  {
    "tweet" : {
      "edit_info" : {...},
      "retweeted" : false,
      "source" : "...",
      "entities" : {...},
      "display_text_range" : [
        "0",
        "83"
      ],
      "favorite_count" : "...",
      "id_str" : "...",
      "truncated" : false,
      "retweet_count" : "...",
      "id" : "...",
      "possibly_sensitive" : false,
      "created_at" : "Fri Dec 29 10:12:14 +0000 2023",
      "favorited" : false,
      "full_text" : "ガンボスープめちゃくちゃ美味かった",
      "lang" : "ja"
    }
  },
  {
    "tweet" : {
      ...
    }
  }
]

このファイルは、window.YTD.tweets.part0というobjectに過去のツイートがリスト形式で格納されているシンプルなファイルです。

今回はこのファイルの中身にしか用がないので、次のように"window.YTD.tweets.part0 = "の部分を消して、扱いやすいjsonファイルにしちゃいましょう。(拡張子も.jsonに変えるだけ)。

[
  {
    "tweet" : {
      "edit_info" : {...},
      "retweeted" : false,
      "source" : "...",
      "entities" : {...},
      "display_text_range" : [
        "0",
        "83"
      ],
      "favorite_count" : "...",
      "id_str" : "...",
      "truncated" : false,
      "retweet_count" : "...",
      "id" : "...",
      "possibly_sensitive" : false,
      "created_at" : "Fri Dec 29 10:12:14 +0000 2023",
      "favorited" : false,
      "full_text" : "ガンボスープめちゃくちゃ美味かった",
      "lang" : "ja"
    }
  },
  {
    "tweet" : {
      ...
    }
  }
]

3. データ抽出

先ほど作ったtweets.jsonはシンプルなjsonファイルなので、PythonなりJavascriptなりで簡単にパースできます。

今回の目的は、ここからツイートのテキストのみを取り出してリストにすることです。
Pythonだと以下のようにできます。

import json

# 元ファイル読み込み
with open('tweets.json') as f:
    input_json = json.load(f)

# 元のリストから"full_text"のみを抽出したリストを生成
# (リツイートは除く)
output_json = [tweet["tweet"]["full_text"] for tweet in input_json if len(tweet["tweet"]["entities"]["user_mentions"]) == 0]

# ファイルに保存
with open('tweetFullTexts.json', 'w') as f:
    json.dump(output_json, f, indent=2, ensure_ascii=False)

元のファイルには"full_text"フィールドにツイートの内容がstringで格納されているので、そこだけを取り出してリストを作っています。

ちなみにリツイートか否かは"user_mentions"の有無で判別しています。
"retweeted"フィールドはリツイートか否かには関係ないみたいです。これ何のためのフィールドなんだろ...)

最終的な出力ファイルは以下のような感じになります。

[
  "ガンボスープめちゃくちゃ美味かった",
  "Leafletバグ多すぎてつらい",
  "リメンバーミーのエンディングは神"
]
1
2
0

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
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?