snscrape、Twint、twikit、twscrape:X で今も使えるのはどれか
snscrape と Twint は2023年に X で動かなくなり、復活しません。twikit の最新リリースは2026年3月18日の X の変更以降に失敗し続けています。twscrape は今も動きますが、用意したログイン済みの X アカウントが必要です。
結論: 2026年11月2日時点で、snscrape は2023年6月30日からずっと X に対して blocked (404) を返し、Twint はアーカイブされ、twikit 2.3.3 は2025年2月のものです。X アカウントを危険にさらさずに同じ作業を続けるなら Sorsa API を使います。POST /search-tweets は以前のクエリをそのまま受け付け、1リクエストで約20ツイート、1,000件あたり$0.07からです。100回分の無料リクエストも付きます。
- エンドポイント
POST /search-tweets- 1ページの件数
- 1リクエストあたり約20ツイート
- 料金
- 1,000件あたり$0.07から
#2026年に今も動く Twitter スクレイピングライブラリ
X のデータ取得のために今もインストールされている Python ライブラリ8つのうち、メンテナンスされて動いているのは2つ、フォークとして動いているのが1つ、更新が遅いのが1つ、終了または壊れているのが4つです。今も動くライブラリはすべて X アカウントとしてログインします。X は2023年6月30日以降、検索、完全なタイムライン、フォロワー一覧をログイン済みのユーザーにしか表示していないからです。
下の表は、2026年11月2日時点で PyPI と GitHub に表示されていた内容と、各ライブラリが失敗したときに出力するエラーです。
| ライブラリ | 最終リリース | 状態 | 必要なもの | 表示されるエラー |
|---|---|---|---|---|
| snscrape | 2023年6月22日 | Twitter モジュールは終了 | なし(ログアウト状態) | blocked (404) |
| Twint | 2020年4月29日 | 2023年3月30日にアーカイブ | なし(ログアウト状態) | ゲストトークンが見つからない |
| twikit | 2025年2月7日 | 2026年3月18日から動作せず | ログインまたは Cookie | KEY_BYTE indices |
| twifork | 2026年8月30日 | twikit の動作するフォーク | ブラウザの Cookie | 古くなった Cookie |
| twscrape | 2026年8月25日 | 動作中 | X アカウント | アカウントのロック、403 |
| Scweet | 2026年10月22日 | 動作中 | auth_token の Cookie | アカウントのロック |
| ntscraper | 2025年5月24日 | Nitter とともに終了 | Nitter インスタンス | インスタンスが停止 |
| tweety | 2025年7月15日 | 更新が遅い | X アカウント | アカウントが読み取り専用になる |
snscrape
- 最終リリース
- 2023年6月22日
- 状態
- Twitter モジュールは終了
- 必要なもの
- なし(ログアウト状態)
- 表示されるエラー
blocked (404)
Twint
- 最終リリース
- 2020年4月29日
- 状態
- 2023年3月30日にアーカイブ
- 必要なもの
- なし(ログアウト状態)
- 表示されるエラー
- ゲストトークンが見つからない
twikit
- 最終リリース
- 2025年2月7日
- 状態
- 2026年3月18日から動作せず
- 必要なもの
- ログインまたは Cookie
- 表示されるエラー
KEY_BYTE indices
twifork
- 最終リリース
- 2026年8月30日
- 状態
- twikit の動作するフォーク
- 必要なもの
- ブラウザの Cookie
- 表示されるエラー
- 古くなった Cookie
twscrape
- 最終リリース
- 2026年8月25日
- 状態
- 動作中
- 必要なもの
- X アカウント
- 表示されるエラー
- アカウントのロック、403
Scweet
- 最終リリース
- 2026年10月22日
- 状態
- 動作中
- 必要なもの
auth_tokenの Cookie- 表示されるエラー
- アカウントのロック
ntscraper
- 最終リリース
- 2025年5月24日
- 状態
- Nitter とともに終了
- 必要なもの
- Nitter インスタンス
- 表示されるエラー
- インスタンスが停止
tweety
- 最終リリース
- 2025年7月15日
- 状態
- 更新が遅い
- 必要なもの
- X アカウント
- 表示されるエラー
- アカウントが読み取り専用になる
表全体は2つのパターンで説明できます。ログアウト状態で X を読んでいたライブラリ(snscrape、Twint、Nitter 経由の ntscraper)はデータの取得元を失い、パッチを当てても戻りません。ログインして使うライブラリは、X アカウントが有効なままで、コードが X のウェブアプリに追従している間だけ動き続けます。そのウェブアプリは、直近12か月で内部の検索クエリ ID を37回変更しました。ブラウザや公式 X API も含めた方法は、Twitter のスクレイピング方法のガイドで扱っています。
#ライブラリの呼び出しを Sorsa API のリクエスト1つに置き換える
これらのライブラリを使っていたプロジェクトには、Twitter(X)API 兼スクレイピングツールである Sorsa API を使います。同じ公開ツイート、プロフィール、フォロワー一覧を、ApiKey ヘッダー1つで JSON として返します。X アカウントも Cookie もプロキシも不要で、X がウェブアプリを変更しても Sorsa 側で修正するため、コードもレスポンスのスキーマも変わりません。検索結果は1,000件あたり$0.07から、フォロワーは1,000件あたり$0.007からで、無料で始める場合も含めて、どのプランも毎秒20リクエストです。
スクリプトの移行は4つのステップです。
-
キーを取得する。 サインアップして、ダッシュボードから API キーをコピーします。最初の100リクエストは無料で、期限もありません。
-
ヘルパーを1つ追加する。 この関数がライブラリの import の代わりになります。一覧を返す各エンドポイントは、ページと
next_cursorを返します。ヘルパーは、それが空で返るまでカーソルを送り返します。sorsa_helper.py import requests BASE = "https://api.sorsa.io/v3" HEADERS = {"ApiKey": "YOUR_API_KEY"} def pages(method, path, payload): """Call a Sorsa API list endpoint and yield every page.""" payload = dict(payload) send = requests.get if method == "GET" else requests.post arg = "params" if method == "GET" else "json" while True: r = send(BASE + path, headers=HEADERS, timeout=30, **{arg: payload}) r.raise_for_status() # 403: key or quota, 429: over 20 requests/s page = r.json() yield page if not page.get("next_cursor"): return payload["next_cursor"] = page["next_cursor"] def items(method, path, payload, key, limit=None): """Yield tweets or users across pages, stopping at limit.""" n = 0 for page in pages(method, path, payload): for item in page.get(key) or []: yield item n += 1 if limit and n >= limit: return def search(query, limit=None, order="latest"): body = {"query": query, "order": order} return items("POST", "/search-tweets", body, "tweets", limit) def user_tweets(username, limit=None): body = {"username": username} return items("POST", "/user-tweets", body, "tweets", limit) def followers(username, limit=None): params = {"username": username} return items("GET", "/followers", params, "users", limit) -
呼び出しを1つずつ置き換える。 使っているライブラリと、スクリプトが行っている呼び出しを選ぶと、変換ツールが対応するリクエストを表示します。
使っているライブラリ変更前: snscrapescraper = sntwitter.TwitterSearchScraper( "python lang:en") for tweet in scraper.get_items(): print(tweet.rawContent)変更後: Sorsa APIfor tweet in search("python lang:en"): print(tweet["full_text"])- エンドポイント
POST /search-tweets- 1リクエストで返すもの
- 約20ツイート
- Sorsa APIの料金
- 1,000ツイートあたり$0.07から
クエリ文字列はそのまま使えます:
from:,since:,until:,lang:とmin_faves:も同じように動作します。orderを"latest"に設定すると、snscrapeと同じ新しい順になります。各ライブラリの呼び出しは、Sorsa APIの1つのエンドポイントに対応します。書き込み系の呼び出しやいいねには、読み取り専用の対応機能がありません。
-
最初のページを確認する。 どのレスポンスも、各ツイートの中に投稿者のプロフィール全体が入っています。twscrape や twikit がユーザー ID のために必要としていた2回目の取得は不要になります。
レスポンス200 OK { "tweets": [ { "id": "2116173807613027825", "full_text": "Moved our nightly tweet pull off a dead library.", "created_at": "2026-10-30T14:22:07Z", "lang": "en", "likes_count": 214, "retweet_count": 37, "reply_count": 19, "quote_count": 6, "view_count": 18450, "conversation_id_str": "2116173807613027825", "user": { "id": "1592041833471827968", "username": "lena_ships_python", "display_name": "Lena Ships Python", "followers_count": 2310 } } ], "next_cursor": "DAACCgACGW7xDmNAJxAKAAMZbvEOY0AnEAgABAAAAAEAAA" }
呼び出しの対応表
表には、ほとんどのスクリプトが行う呼び出しを載せています。各行が Sorsa API のリクエスト1つに対応し、ライブラリの列はそれが置き換える呼び出しです。今も稼働しているスクリプトが多いログイン型のライブラリを先に載せています。
| 用途 | Sorsa API | twikit | twscrape |
|---|---|---|---|
| ツイートを検索 | POST /search-tweets(新しいタブで開きます) | search_tweet | search |
| ユーザーのツイート | POST /user-tweets(新しいタブで開きます) | get_user_tweets | user_tweets |
| プロフィール1件 | GET /info(新しいタブで開きます) | get_user_by_screen_name | user_by_login |
| フォロワー | GET /followers(新しいタブで開きます) | get_user_followers | followers |
| フォロー中 | GET /follows(新しいタブで開きます) | get_user_following | following |
| ツイート1件 | POST /tweet-info(新しいタブで開きます) | get_tweet_by_id | tweet_details |
| ID 指定で100ツイート | POST /tweet-info-bulk(新しいタブで開きます) | get_tweets_by_ids | なし |
| ツイートへのリプライ | POST /comments(新しいタブで開きます) | get_tweet_by_id | tweet_replies |
| リツイートしたユーザー | POST /retweeters(新しいタブで開きます) | get_retweeters | retweeters |
| ユーザーを検索 | POST /search-users(新しいタブで開きます) | search_user | search_user |
| リストのツイート | GET /list-tweets(新しいタブで開きます) | get_list_tweets | list_timeline |
| トレンド | GET /trends(新しいタブで開きます) | get_place_trends | trends |
| アカウントの「About」データ | GET /about(新しいタブで開きます) | なし | user_about |
ツイートを検索
- Sorsa API
- POST /search-tweets(新しいタブで開きます)
- twikit
- search_tweet
- twscrape
- search
ユーザーのツイート
- Sorsa API
- POST /user-tweets(新しいタブで開きます)
- twikit
- get_user_tweets
- twscrape
- user_tweets
プロフィール1件
- Sorsa API
- GET /info(新しいタブで開きます)
- twikit
- get_user_by_screen_name
- twscrape
- user_by_login
フォロワー
- Sorsa API
- GET /followers(新しいタブで開きます)
- twikit
- get_user_followers
- twscrape
- followers
フォロー中
- Sorsa API
- GET /follows(新しいタブで開きます)
- twikit
- get_user_following
- twscrape
- following
ツイート1件
- Sorsa API
- POST /tweet-info(新しいタブで開きます)
- twikit
- get_tweet_by_id
- twscrape
- tweet_details
ID 指定で100ツイート
- Sorsa API
- POST /tweet-info-bulk(新しいタブで開きます)
- twikit
- get_tweets_by_ids
- twscrape
- なし
ツイートへのリプライ
- Sorsa API
- POST /comments(新しいタブで開きます)
- twikit
- get_tweet_by_id
- twscrape
- tweet_replies
リツイートしたユーザー
- Sorsa API
- POST /retweeters(新しいタブで開きます)
- twikit
- get_retweeters
- twscrape
- retweeters
ユーザーを検索
- Sorsa API
- POST /search-users(新しいタブで開きます)
- twikit
- search_user
- twscrape
- search_user
リストのツイート
- Sorsa API
- GET /list-tweets(新しいタブで開きます)
- twikit
- get_list_tweets
- twscrape
- list_timeline
トレンド
- Sorsa API
- GET /trends(新しいタブで開きます)
- twikit
- get_place_trends
- twscrape
- trends
アカウントの「About」データ
- Sorsa API
- GET /about(新しいタブで開きます)
- twikit
- なし
- twscrape
- user_about
snscrape と Twint がカバーしていた用途は少なく、それぞれ同じエンドポイントに対応します。
| 用途 | Sorsa API | snscrape | Twint |
|---|---|---|---|
| ツイートを検索 | POST /search-tweets | TwitterSearchScraper | run.Search |
| ハッシュタグ | POST /search-tweets | TwitterHashtagScraper | #タグ付きの c.Search |
| ユーザーのツイート | POST /user-tweets | TwitterUserScraper | c.Username |
| プロフィール1件 | GET /info | TwitterUserScraper.entity | run.Lookup |
| フォロワー | GET /followers | なし | run.Followers |
| フォロー中 | GET /follows | なし | run.Following |
| ツイート1件 | POST /tweet-info | TwitterTweetScraper | なし |
| リストのツイート | GET /list-tweets | TwitterListPostsScraper | なし |
| トレンド | GET /trends | TwitterTrendsScraper | なし |
ツイートを検索
- Sorsa API
POST /search-tweets- snscrape
- TwitterSearchScraper
- Twint
- run.Search
ハッシュタグ
- Sorsa API
POST /search-tweets- snscrape
- TwitterHashtagScraper
- Twint
- #タグ付きの c.Search
ユーザーのツイート
- Sorsa API
POST /user-tweets- snscrape
- TwitterUserScraper
- Twint
- c.Username
プロフィール1件
- Sorsa API
GET /info- snscrape
- TwitterUserScraper.entity
- Twint
- run.Lookup
フォロワー
- Sorsa API
GET /followers- snscrape
- なし
- Twint
- run.Followers
フォロー中
- Sorsa API
GET /follows- snscrape
- なし
- Twint
- run.Following
ツイート1件
- Sorsa API
POST /tweet-info- snscrape
- TwitterTweetScraper
- Twint
- なし
リストのツイート
- Sorsa API
GET /list-tweets- snscrape
- TwitterListPostsScraper
- Twint
- なし
トレンド
- Sorsa API
GET /trends- snscrape
- TwitterTrendsScraper
- Twint
- なし
このほか、ライブラリに同等のものがなく表に載せるほどではないリクエストが2つあります。GET /info-batch(新しいタブで開きます) は1リクエストで最大100プロフィールを返します(どのライブラリもアカウントを1件ずつ引いていました)。GET /verified-followers(新しいタブで開きます) は、twscrape の verified_followers と twikit の get_user_verified_followers を置き換えます。
読み取り専用の置き換えがない用途も2つあります。投稿にいいねしたユーザーの一覧(twikit の get_favoriters、Twint の --favorites)と、ユーザー自身のいいねやブックマークは、Sorsa API が返す公開データではありません。投稿、フォロー、DM(twikit の create_tweet、follow_user、send_dm)は公式 X API に残します。Sorsa API は設計上、読み取り専用で、X アカウントに触れることはないからです。
#snscrape が blocked (404) を返す理由
snscrape がすべての Twitter スクレイピングで blocked (404) を返すのは、ログアウト状態で X を読んでいるためです。X は2023年6月30日に、ログアウトした訪問者への検索とタイムラインの提供を止めました。メンテナーは同じ日にissue #996(新しいタブで開きます)「All Twitter scrapes are failing」を立てました。この issue は今も未解決で、コメントは161件あります。
このライブラリは、X がかつて匿名の訪問者に渡していたゲストトークンを取得し、ログアウト状態のウェブページが使うエンドポイントを呼び出していました。ログインは設計上、対象外です。issue #270(新しいタブで開きます)には、snscrape は「does not and will not support logging into social network accounts」(ソーシャルネットワークのアカウントへのログインに対応しておらず、今後も対応しない)と書かれています。PyPI の最終リリース 0.7.0.20230622 は動かなくなる8日前に公開されたものなので、再インストール、新しい Python のバージョン、開発ブランチのどれでも状況は変わりません。他のネットワーク向けのモジュールは別の話で、Twitter モジュールには復活の道がありません。
多くのチュートリアルが教えた検索ループは、そのまま1行ずつ移せます。クエリ文字列の演算子は保たれ、from:、since:、until:、lang:、min_faves: は query フィールドで同じように使えます。
import itertools
import snscrape.modules.twitter as sntwitter
query = "from:lena_ships_python since:2026-10-01"
scraper = sntwitter.TwitterSearchScraper(query)
for tweet in itertools.islice(scraper.get_items(), 100):
print(tweet.date, tweet.likeCount, tweet.rawContent)
TwitterUserScraper("lena_ships_python") は user_tweets("lena_ships_python") に、TwitterHashtagScraper("yourtag") は search("#yourtag") になります。query フィールドが受け付けるすべての演算子は、2006年の投稿まで遡れるものも含めて、Twitter 検索演算子のリファレンスに一覧があります。
#Twint:ゲストトークンのエラーとアーカイブ
Twint は完全に終わっています。GitHub リポジトリは2023年3月30日に所有者がアーカイブし、PyPI の最終リリース(2.1.20)は2020年4月29日のもので、snscrape が失ったのと同じ、ログアウト状態のゲストトークンで X を読んでいました。
不具合はアーカイブの何年も前から始まっていました。RefreshTokenException: Could not find the Guest token in HTML は2020年10月の issue から出ており、2023年3月3日に立てられたissue #1433(新しいタブで開きます)が、アーカイブ前の最後の報告です。もう1つよく引用されるエラー CRITICAL:root:twint.run:Twint:Feed:noData は、Twint がパースしたページに、期待したデータが含まれていなかったという意味です。token.py にパッチを当てたフォークも、2023年6月に同じログイン必須の壁に突き当たりました。
Twint の Config オブジェクトは、素の引数に置き換えられます。c.Search と c.Username はクエリまたはユーザー名に、c.Since と c.Until は since: と until: としてクエリの中に移り、c.Store_csv は自分で制御できる CSV ライターになります。
import twint
c = twint.Config()
c.Search = "python"
c.Since = "2026-10-01"
c.Limit = 100
c.Store_csv = True
c.Output = "tweets.csv"
twint.run.Search(c)
twint.run.Followers(c) と twint.run.Following(c) は、1ページ最大200アカウントの GET /followers と GET /follows になります。Twint の以前の3,200ツイートというスクロール上限を超えるタイムライン全体は、期間指定の検索になります。その手順は、ユーザーの全ツイートをダウンロードのガイドで説明しています。
#twikit:2026年3月の不具合と twifork
twikit の最新リリース 2.3.3(2025年2月7日)は、X が2026年3月18日にウェブアプリを変更して以降、すべての呼び出しで失敗します。issue #408(新しいタブで開きます) は Couldn't get KEY_BYTE indices を報告していて今も未解決で、issue #425 には2026年4月23日付けの KeyError が追加されています。
原因は twikit が X と通信する方法にあります。twikit は通常の X ユーザーとしてログインし、x.com のウェブアプリが使う内部の GraphQL エンドポイントを呼び出します。その呼び出しにはどれも、X が配信するスクリプトから算出した x-client-transaction-id ヘッダーが必要です。X がそのスクリプトを変更したことで、twikit のパーサーはそれを解析できなくなりました。本家のリポジトリには未解決の issue とプルリクエストが160件あり、その後リリースは出ていません。
コードはフォークが引き継いでいます。2026年8月30日にリリースされた twifork(新しいタブで開きます) 2.4.0 は、from twikit import Client のインポートをそのまま残しつつ2026年の不具合を修正しており、README は制約を率直に述べています。パスワードでのログインは「cannot be made to work」(動作させられない)、ゲストアクセスは「is closed on X's side; use cookies」(X 側で閉じられているので Cookie を使う)。動かすには、X アカウントのブラウザセッションから auth_token と ct0 の Cookie をエクスポートし、そのアカウントがロックされないか見張る必要があります。
search_tweet("python", "Latest") のような twikit の検索は、ヘルパーの呼び出し1つになります。
from sorsa_helper import search
for t in search("python", limit=20):
print(t["created_at"], t["user"]["username"], t["full_text"])
twikit の 'Top' は "order": "popular" に、'Latest' は "latest" に対応します。Cookie ファイル、asyncio のループ、その背後のアカウントはすべて不要になります。
#twscrape:動くが、用意した X アカウントが必要
twscrape は2026年も動いています。バージョン 0.20.1 は2026年8月25日に公開され、リポジトリは10月31日にも更新されました。README(新しいタブで開きます) は条件を最初に明記しています。auth_token と ct0 を含むブラウザの Cookie から追加した「requires authorized X/Twitter accounts」(認証済みの X/Twitter アカウントが必要)です。
このライブラリはそうしたアカウントのプールで動くので、プール内のすべてのアカウントにロックの危険があります。
実際には、3つの失敗が見られます。
- ロックまたはログアウトされたアカウント。 有効なアカウントがないプールは待機するか、
NoAccountErrorを送出します。 - Cloudflare によるブロック。 未解決の issue #337(新しいタブで開きます)(2026年9月12日)は、
user_by_idでBlocked by Cloudflare: 403が出ると報告しています。 - X のウェブアプリの変更。 X は内部の GraphQL 呼び出しにフラグを追加しており、そのどれかが必須になると、リリースが追いつくまで twscrape は
GqlFeaturesOutdatedErrorを出します。
twscrape の user_by_login、user_tweets、followers の呼び出しは、ヘルパーの呼び出し2つになります。
from sorsa_helper import followers, user_tweets
tweets = list(user_tweets("lena_ships_python", limit=100))
fans = list(followers("lena_ships_python", limit=1000))
POST /user-tweets と GET /followers はユーザー名を直接受け付けるので、ユーザー ID の取得は不要です。フォロワー1,000件は、1ページ200件で5リクエストです。
#twscrape、twikit、snscrape の比較
3つのうち、公式リリースのままで今も動くのは twscrape だけです。twikit はそのフォーク経由でしか動かず、snscrape は X に対して直せません。どれも X アカウントなしでは今は動きません。置き換えの判断基準は、今動くか、こちらに何を求めるか、コードが動き続けるか、1リクエストでどれだけ返るか、1,000件の結果にいくらかかるかです。
| 基準 | Sorsa API | twscrape | twikit | snscrape |
|---|---|---|---|---|
| 今 X で動くか | はい | はい | twifork 経由 | いいえ |
| 必要な X アカウント | なし | プール一式 | 1つ(Cookie 経由) | なし(ただし終了) |
| X が変更したとき | Sorsa 側で修正 | リリースを待つ | フォークがパッチを当てる | 修正されない |
| 1リクエストあたりのツイート数 | 約20件、ID 指定なら100件 | 約20件 | 約20件 | かつては約20件 |
| 危険にさらすアカウント | なし | プール内のすべて | Cookie を使うアカウント | なし |
| セットアップ | API キー1つ | アカウント、Cookie、プロキシ | Cookie のエクスポート | 不要(何も返らない) |
| 1,000ツイートあたりの料金 | $0.07から | アカウント、プロキシ、時間 | アカウント、時間 | 無料(データなし) |
今 X で動くか
- Sorsa API
- はい
- twscrape
- はい
- twikit
- twifork 経由
- snscrape
- いいえ
必要な X アカウント
- Sorsa API
- なし
- twscrape
- プール一式
- twikit
- 1つ(Cookie 経由)
- snscrape
- なし(ただし終了)
X が変更したとき
- Sorsa API
- Sorsa 側で修正
- twscrape
- リリースを待つ
- twikit
- フォークがパッチを当てる
- snscrape
- 修正されない
1リクエストあたりのツイート数
- Sorsa API
- 約20件、ID 指定なら100件
- twscrape
- 約20件
- twikit
- 約20件
- snscrape
- かつては約20件
危険にさらすアカウント
- Sorsa API
- なし
- twscrape
- プール内のすべて
- twikit
- Cookie を使うアカウント
- snscrape
- なし
セットアップ
- Sorsa API
- API キー1つ
- twscrape
- アカウント、Cookie、プロキシ
- twikit
- Cookie のエクスポート
- snscrape
- 不要(何も返らない)
1,000ツイートあたりの料金
- Sorsa API
- $0.07から
- twscrape
- アカウント、プロキシ、時間
- twikit
- アカウント、時間
- snscrape
- 無料(データなし)
来月も動かさなければならないパイプラインには、Sorsa API を選んでください。これらのライブラリと同じ検索演算子で同じ用途に使え、検索なら1リクエストで約20ツイート、ID 指定のバッチなら100ツイート、全プランで毎秒20リクエスト、ロックされる X アカウントもありません。2022年から本番稼働して累計60億リクエスト以上を処理しており、当初は TweetScout API という名前でした。
#コードが読むフィールドを移行する
Sorsa API はフィールド名をスネークケースで付け、投稿者のプロフィール全体を user の中に入れます。そのため、移行で名前を変えるのは十数個の属性だけで、ほかはそのまま使えます。下の表は、各ライブラリでの旧名と、置き換え先のフィールドです。
| Sorsa API のフィールド | snscrape、twscrape | twikit | Twint |
|---|---|---|---|
id(文字列) | id | id | id |
created_at(ISO 8601) | date | created_at | datetime |
full_text | rawContent | text | tweet |
user.username | user.username | user.screen_name | username |
user.display_name | user.displayname | user.name | name |
likes_count | likeCount | favorite_count | likes_count |
retweet_count | retweetCount | retweet_count | retweets_count |
reply_count | replyCount | reply_count | replies_count |
quote_count | quoteCount | quote_count | なし |
view_count | viewCount | view_count | なし |
conversation_id_str | conversationId | なし | conversation_id |
quoted_status | quotedTweet | quote | なし |
id(文字列)- snscrape、twscrape
id- twikit
id- Twint
id
created_at(ISO 8601)- snscrape、twscrape
date- twikit
created_at- Twint
datetime
full_text- snscrape、twscrape
rawContent- twikit
text- Twint
tweet
user.username- snscrape、twscrape
user.username- twikit
user.screen_name- Twint
username
user.display_name- snscrape、twscrape
user.displayname- twikit
user.name- Twint
name
likes_count- snscrape、twscrape
likeCount- twikit
favorite_count- Twint
likes_count
retweet_count- snscrape、twscrape
retweetCount- twikit
retweet_count- Twint
retweets_count
reply_count- snscrape、twscrape
replyCount- twikit
reply_count- Twint
replies_count
quote_count- snscrape、twscrape
quoteCount- twikit
quote_count- Twint
- なし
view_count- snscrape、twscrape
viewCount- twikit
view_count- Twint
- なし
conversation_id_str- snscrape、twscrape
conversationId- twikit
- なし
- Twint
conversation_id
quoted_status- snscrape、twscrape
quotedTweet- twikit
quote- Twint
- なし
大きなコードベースでは、残りを移行する間、小さなアダプターで古い属性名を保てます。Sorsa API の各ツイートを、snscrape と twscrape の名前に答えるオブジェクトで包みます。
from datetime import datetime
from types import SimpleNamespace
def as_snscrape(t):
"""A Sorsa API tweet under snscrape/twscrape attribute names."""
u = t["user"]
return SimpleNamespace(
id=int(t["id"]),
url=f"https://x.com/{u['username']}/status/{t['id']}",
date=datetime.fromisoformat(t["created_at"].replace("Z", "+00:00")),
rawContent=t["full_text"],
lang=t.get("lang"),
likeCount=t["likes_count"],
retweetCount=t["retweet_count"],
replyCount=t["reply_count"],
quoteCount=t["quote_count"],
viewCount=t.get("view_count"),
user=SimpleNamespace(
username=u["username"],
displayname=u["display_name"],
followersCount=u["followers_count"],
),
)
for tweet in map(as_snscrape, search(query)): と書けば、古いループ本体はそのまま動きます。Sorsa API では ID が文字列で届くため、アダプターは snscrape が返していたとおり整数に戻しています。
#同じ作業の費用
Sorsa API のツイート検索は1,000件あたり$0.07から。公式 X API は1,000投稿あたり$5.00で、開発者アカウント、OAuth、前払いクレジットも必要です。ライブラリ自体に利用料はかかりませんが、X アカウント、プロキシ、X がウェブアプリを変えるたびにかかる作業時間を消費します。
公式 X API
$5,000
検索で1Mツイートの場合
1投稿あたり$0.005
Sorsa API
$70から
検索で1Mツイートの場合
1,000件あたり$0.07から
公式 X API の従量課金の料金(新しいタブで開きます)は月300万投稿の読み取りで止まり、それを超えると Enterprise 契約しかありません。ID 指定で100件ずつバッチ取得すれば、Sorsa API の料金は1,000件あたり$0.014まで下がります。フォロワー一覧は、1ページ200件で1,000件あたり$0.007からです。失敗したリクエストに課金されることはありません。
#以前の snscrape のクエリを今日 Sorsa API で動かす
snscrape と Twint はもうなく、今も動くライブラリには X にロックされていない X アカウントが必要です。Twint、snscrape、twikit、twscrape のジョブをそのリスクなしで動かし続けるなら、Sorsa API に移してください。キー1つで、既存の検索クエリがそのまま使え、1リクエスト約20ツイート、1,000件あたり$0.07からです。上のヘルパーを貼り付けて呼び出しを1つ置き換えれば、100回分の無料リクエストで約2,000ツイートが返り、以前のスクリプトの出力と照らし合わせられます。
#FAQ
twikit は2026年もメンテナンスされていますか
本家ではされていません。twikit の最新リリースは2025年2月7日の 2.3.3 で、2026年3月18日の X の変更以降は、すべての呼び出しが「Couldn't get KEY_BYTE indices」で失敗します(issue #408、未解決)。コミュニティのフォークである twifork 2.4.0(2026年8月30日リリース)がこの不具合を修正し、twikit のインポートもそのまま使えますが、動くのはログイン済み X アカウントからエクスポートした Cookie があるときだけです。
twscrape は X アカウントなしでも動きますか
動きません。twscrape は2026年も、2026年8月25日のバージョン 0.20.1 で動いていますが、README には、auth_token と ct0 を含む Cookie から追加した認証済みの X アカウントが必要だと書かれています。そうしたアカウントのプールで動き、どのアカウントも X にロックされる可能性があります。
Twitter で動く snscrape のフォークはありますか
X 向けに復活させられるフォークはありません。snscrape はログアウト状態で X を読んでいて、2023年6月30日以降、X は検索とタイムラインをログイン済みのユーザーにしか返しません。ゲストトークンにパッチを当てたフォークでも、結局は「blocked (404)」になります。メンテナーは issue #270 でログインを否定しているので、修正にはライブラリをログイン済みアカウントを前提に書き直す必要があります。
snscrape や Twint の検索クエリをそのまま使えますか
はい。Sorsa API の検索は X 自身のクエリ構文を受け付けるので、from:、since:、until:、lang:、min_faves:、filter: を含む文字列は、POST /search-tweets の query フィールドでそのまま使えます。snscrape が返していた新しい順にするには "order" を "latest" に、トップタブなら "popular" に設定してください。結果は1ページ約20件で、カーソル付きで返ります。
Twitter データ取得で、snscrape に最適な代替手段は何ですか
X アカウントなしで snscrape のように公開ツイートを収集するなら、最適な代替は Sorsa API です。同じ検索演算子が使え、検索は1リクエスト約20ツイートで1,000件あたり$0.07から、ID 指定のバッチは100ツイートで1,000件あたり$0.014から、全プランで毎秒20リクエストです。返すのは公開データだけで、X のログイン情報や Cookie を求めることはなく、新規アカウントには100回分の無料リクエストが付きます。
#検証の方法
2026年11月2日に、snscrape、Twint、twikit、twifork、twscrape、Scweet、ntscraper、tweety、Nitter の PyPI のリリース履歴と GitHub リポジトリの状態、そして上で挙げた issue を読みました。各ライブラリのメソッド名と属性名は、同じ日に GitHub のソースコードから取りました。ここで紹介した Sorsa API のエンドポイント、パラメータ、フィールドはすべて公開中の API リファレンスと一致しています。リクエストはそこから書いたもので、ライブラリのコードを x.com に対して実行してはいません。
情報源
- snscrape issue #996: All Twitter scrapes are failing(新しいタブで開きます)
- snscrape issue #270: Support for authentication(新しいタブで開きます)
- snscrape on PyPI(新しいタブで開きます)
- Twint repository (archived)(新しいタブで開きます)
- Twint issue #1433: Could not find the Guest token in HTML(新しいタブで開きます)
- twikit issue #408: ClientTransaction broken as of March 18, 2026(新しいタブで開きます)
- twikit on PyPI(新しいタブで開きます)
- twifork README(新しいタブで開きます)
- twscrape README(新しいタブで開きます)
- twscrape issue #337: user_by_id blocked by Cloudflare(新しいタブで開きます)
- Scweet on PyPI(新しいタブで開きます)
- ntscraper README(新しいタブで開きます)
- Nitter repository (archived)(新しいタブで開きます)
- X API pay-per-use pricing (docs.x.com)(新しいタブで開きます)
- Sorsa API reference, OpenAPI
- Search operators (Sorsa API docs)(新しいタブで開きます)