本文へスキップ

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 に表示されていた内容と、各ライブラリが失敗したときに出力するエラーです。

ライブラリ最終リリース状態必要なもの表示されるエラー
snscrape2023年6月22日Twitter モジュールは終了なし(ログアウト状態)blocked (404)
Twint2020年4月29日2023年3月30日にアーカイブなし(ログアウト状態)ゲストトークンが見つからない
twikit2025年2月7日2026年3月18日から動作せずログインまたは CookieKEY_BYTE indices
twifork2026年8月30日twikit の動作するフォークブラウザの Cookie古くなった Cookie
twscrape2026年8月25日動作中X アカウントアカウントのロック、403
Scweet2026年10月22日動作中auth_token の Cookieアカウントのロック
ntscraper2025年5月24日Nitter とともに終了Nitter インスタンスインスタンスが停止
tweety2025年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 のスクレイピング方法のガイドで扱っています。

各ライブラリがXを読めなくなった時期 リリース日とIssue日はPyPIとGitHubより。2026年11月2日に確認 2020 2021 2022 2023 2024 2025 2026 現在 Twint アーカイブ済み ゲストトークンのエラー、2020年10月 2023年3月30日にアーカイブ snscrape Xには非対応 2023年6月30日に動作停止(#996) 最終リリースは8日前 ntscraper Nitterとともに終了 最終リリース2025年5月24日 Nitterは2026年10月9日にアーカイブ twikit 上流で破損 最終リリース2025年2月7日 2026年3月18日に動作停止(#408) twscrape アカウントがあれば動作 2026年8月25日に0.20.1 要ログインのXアカウント
ログアウト状態のライブラリはすべて消えた。今も動くライブラリは twscrape も含め、ログイン済みアカウントで動いている。

#ライブラリの呼び出しを 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つのステップです。

  1. キーを取得する。 サインアップして、ダッシュボードから API キーをコピーします。最初の100リクエストは無料で、期限もありません。

  2. ヘルパーを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)
    
  3. 呼び出しを1つずつ置き換える。 使っているライブラリと、スクリプトが行っている呼び出しを選ぶと、変換ツールが対応するリクエストを表示します。

    使っているライブラリ
    変更前: snscrape
    scraper = sntwitter.TwitterSearchScraper(
        "python lang:en")
    for tweet in scraper.get_items():
        print(tweet.rawContent)
    変更後: Sorsa API
    for 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つのエンドポイントに対応します。書き込み系の呼び出しやいいねには、読み取り専用の対応機能がありません。

  4. 最初のページを確認する。 どのレスポンスも、各ツイートの中に投稿者のプロフィール全体が入っています。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 APItwikittwscrape
ツイートを検索POST /search-tweets(新しいタブで開きます)search_tweetsearch
ユーザーのツイートPOST /user-tweets(新しいタブで開きます)get_user_tweetsuser_tweets
プロフィール1件GET /info(新しいタブで開きます)get_user_by_screen_nameuser_by_login
フォロワーGET /followers(新しいタブで開きます)get_user_followersfollowers
フォロー中GET /follows(新しいタブで開きます)get_user_followingfollowing
ツイート1件POST /tweet-info(新しいタブで開きます)get_tweet_by_idtweet_details
ID 指定で100ツイートPOST /tweet-info-bulk(新しいタブで開きます)get_tweets_by_idsなし
ツイートへのリプライPOST /comments(新しいタブで開きます)get_tweet_by_idtweet_replies
リツイートしたユーザーPOST /retweeters(新しいタブで開きます)get_retweetersretweeters
ユーザーを検索POST /search-users(新しいタブで開きます)search_usersearch_user
リストのツイートGET /list-tweets(新しいタブで開きます)get_list_tweetslist_timeline
トレンドGET /trends(新しいタブで開きます)get_place_trendstrends
アカウントの「About」データGET /about(新しいタブで開きます)なしuser_about

snscrape と Twint がカバーしていた用途は少なく、それぞれ同じエンドポイントに対応します。

用途Sorsa APIsnscrapeTwint
ツイートを検索POST /search-tweetsTwitterSearchScraperrun.Search
ハッシュタグPOST /search-tweetsTwitterHashtagScraper#タグ付きの c.Search
ユーザーのツイートPOST /user-tweetsTwitterUserScraperc.Username
プロフィール1件GET /infoTwitterUserScraper.entityrun.Lookup
フォロワーGET /followersなしrun.Followers
フォロー中GET /followsなしrun.Following
ツイート1件POST /tweet-infoTwitterTweetScraperなし
リストのツイートGET /list-tweetsTwitterListPostsScraperなし
トレンドGET /trendsTwitterTrendsScraperなし
  • ツイートを検索

    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つになります。

移行後:Sorsa API
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つになります。

移行後:Sorsa API
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 APItwscrapetwikitsnscrape
今 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、twscrapetwikitTwint
id(文字列)ididid
created_at(ISO 8601)datecreated_atdatetime
full_textrawContenttexttweet
user.usernameuser.usernameuser.screen_nameusername
user.display_nameuser.displaynameuser.namename
likes_countlikeCountfavorite_countlikes_count
retweet_countretweetCountretweet_countretweets_count
reply_countreplyCountreply_countreplies_count
quote_countquoteCountquote_countなし
view_countviewCountview_countなし
conversation_id_strconversationIdなしconversation_id
quoted_statusquotedTweetquoteなし
  • 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 の名前に答えるオブジェクトで包みます。

adapter.py
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 が返していたとおり整数に戻しています。

各ライブラリがXに到達する方法と、止まる原因 ライブラリ Xの読み取り方法 止まる原因 snscrape Twint ログアウト状態のゲストトークン、 匿名訪問者にXが渡していた通行証 2023年6月30日に終了: 検索にログインが必要に ntscraper 公開Nitterインスタンス Xのページを中継 Nitterは 2026年10月9日にアーカイブ twikit, twifork twscrape, Scweet ログイン済みアカウントのCookieを x.comのWebアプリに送信 アカウントのロックと x.comの変更のたび Sorsa API ApiKeyヘッダー1つ、 JSONが返り、1ページ約20ツイート Xアカウント不要、 ロックされるものなし
ログアウト状態の経路は閉じられた。ログイン型の経路は、アカウントが続く間は動く。API キーなら、X アカウントはまったく関わらない。

#同じ作業の費用

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 に対して実行してはいません。

Sorsa APIチーム 読み取り専用のX(Twitter)APIとスクレイピングツール、Sorsa APIを開発・運営しています。2022年から本番稼働し(旧TweetScout API)、累計60億リクエスト以上を処理しています。 Sorsa APIについて

変更点
  • 初公開。