Twitter のボット判定:ボットとフェイクフォロワーを規模を問わず見抜く方法
Twitter のボット判定とは、登録日、フォロー比率、プロフィールの設定、投稿のペース、X が割り当てた国といった複数の公開シグナルを同時に見て、アカウントをスコア化することです。10個のうち4個以上に当てはまればボットの可能性が高いと判断します。
結論: フェイクフォロワーは、投稿ゼロ、デフォルトのアイコン、1週間前の登録といった7つのフラグのうち3つ以上に当てはまります。アクティブなアカウントなら、その割合が10%未満であれば普通です。リスト全体を監査するなら、Twitter(X)API 兼スクレイピングツールである Sorsa API を使います。1リクエストでフォロワー200人、1,000人あたり$0.007から。100回分の無料リクエストで2万人をスコア化できます。
- エンドポイント
GET /followers- ページサイズ
- 1リクエストあたりフォロワー200人
- 料金
- フォロワー1,000人あたり$0.007から
#Twitter アカウントがボットかどうかを見分ける方法
複数のシグナルをまとめて見て、同じ方向を指しているものがいくつあるかを数えます。1つだけ変な点があってもただのノイズですが、4つ揃えばパターンです。無料の Twitter ボットチェッカーなら、公開アカウントのカウントを数秒で済ませられます。プロフィール、X 自身の「このアカウントについて」のデータ、最新の投稿から10個のシグナルを読み取り、アカウントを低・中・高で評価し、最新フォロワー200人もスコア化します。
このフォームは、入力したアカウントを設定した状態で無料のTwitterボットチェッカーを開きます。
x.com で手作業で調べるなら、見るのは次の5か所です。
- プロフィール。 デフォルトのアイコン、空のプロフィール文、末尾に長い数字が並ぶハンドル。
- 数字。 数千アカウントをフォローしているのにフォローバックは数十人、アカウントが新しいのに投稿は数千件。
- このアカウントについて。 プロフィールのメニューを開くと、X が割り当てた国、ハンドルの変更回数、Premium の開始時期が表示されます。プロフィール文には Miami とあるのに、X は別の場所と判断しているアカウントは、もう一度見る価値があります。
- 投稿。 リポストだけ、多数のスレッドに同じ返信、24時間ずっと投稿している。
- ラベル。 ボットであることを自分で申告しているアカウントには、名前とハンドルの下に X の自動化アカウントのラベル(新しいタブで開きます)が付きます。青いチェックマークは何の証明にもなりません。有料の Premium プランに入っていることを示すだけで、人間であることは示さないからです。
#X におけるボットとフェイクフォロワーの定義
ボットとは、少なくとも一部をソフトウェアが動かしているアカウントです。フェイクフォロワーとは、他人のフォロワー数を水増しするために存在するアカウントです。両者は重なりますが、必要なチェックは別です。ボットは投稿内容に正体が出て、フェイクフォロワーはプロフィールの空っぽさに出ます。
| 種類 | 内容 | 見え方 |
|---|---|---|
| 自動化アカウント | スケジュールに沿って投稿するソフトウェア(通知、フィード、天気など) | 投稿間隔が一定、話題は1つ、X の「自動化」ラベルが付くことも多い |
| スパムボット | リンク、詐欺、返信を大量に流す自動化アカウント | あちこちに同じ返信、リポストだけ、プロフィールが空 |
| フェイクフォロワー | フォロワー数を上げるために購入・量産されたアカウント | 作成直後、投稿なし、いいねなし、アイコンなし、まとめて登録されている |
| 非アクティブなフォロワー | 投稿をやめた、または閲覧専用の実在の人 | フラグは1〜2個、登録日は古め |
| 連携アカウント | 支持を偽装するために、人やスクリプトが多数のアカウントを運用している | 共通の主張、近い登録日、場所が合わない |
自動化アカウント
- 内容
- スケジュールに沿って投稿するソフトウェア(通知、フィード、天気など)
- 見え方
- 投稿間隔が一定、話題は1つ、X の「自動化」ラベルが付くことも多い
スパムボット
- 内容
- リンク、詐欺、返信を大量に流す自動化アカウント
- 見え方
- あちこちに同じ返信、リポストだけ、プロフィールが空
フェイクフォロワー
- 内容
- フォロワー数を上げるために購入・量産されたアカウント
- 見え方
- 作成直後、投稿なし、いいねなし、アイコンなし、まとめて登録されている
非アクティブなフォロワー
- 内容
- 投稿をやめた、または閲覧専用の実在の人
- 見え方
- フラグは1〜2個、登録日は古め
連携アカウント
- 内容
- 支持を偽装するために、人やスクリプトが多数のアカウントを運用している
- 見え方
- 共通の主張、近い登録日、場所が合わない
X の真正性ポリシー(新しいタブで開きます)は、フォロー、いいね、表示回数を水増しするために金銭を支払うことと、フォローの繰り返し(フォロー・アンフォロー)を禁じています。非アクティブなフォロワーはルール違反ではないので、きちんとした監査ではフェイクと分けて数えます。
#ボットを見抜くシグナル
プロフィール、X の「このアカウントについて」パネル、アカウントの最新投稿という3つの公開情報源から得られる10個のシグナルで、ボットの大半を人間と区別できます。どのシグナルも、他のシグナルと並んで初めて意味を持ちます。下の表には、そのシグナルに引っかかる他のタイプも載せています。
| シグナル | 見る場所 | 要注意の条件 | ほかに当てはまる人 |
|---|---|---|---|
| プロフィールの設定 | プロフィール | 3つのうち2つ:デフォルトのアイコン、空のプロフィール文、末尾が6桁以上の数字のハンドル | プロフィールを設定したことがない人 |
| フォロー数とフォロワー数 | プロフィール | 1,000人以上をフォローし、フォローバックが20人に1人未満 | 新規アカウント、ニュースの閲覧中心の人 |
| アカウント年齢とフォロワー数 | プロフィール | 作成から6か月未満でフォロワー1万人以上 | バズった人 |
| 投稿のペース | プロフィール | 登録以来の平均で1日50件以上の投稿 | 報道機関、実況投稿をする人 |
| 所在地 | このアカウントについて | X の国が、プロフィール文の場所や App Store の地域と異なる | 旅行者、VPN 利用者、海外在住者 |
| ユーザー名の変更 | このアカウントについて | 3回以上、またはフォロワー1万人以上で直近90日以内に1回 | リブランディング |
| Premium の開始時期 | このアカウントについて | 登録から1週間以内に Premium を購入 | 長い動画を投稿するために登録したクリエイター |
| 投稿時間帯 | 最新の投稿 | 投稿が最も多い7時間が、アカウントが示すどの国でも夜間にあたる | 夜勤の人、予約投稿ツール |
| 投稿内容の構成 | 最新の投稿 | リポストが80%以上、返信が90%以上、または自分の投稿の90%以上にリンクがある | キュレーター、リンクフィード |
| AI ラベル | 最新の投稿 | 最新の投稿の半数以上に「Made with AI」ラベルが付いている | AI の利用を開示しているアーティスト |
プロフィールの設定
- 見る場所
- プロフィール
- 要注意の条件
- 3つのうち2つ:デフォルトのアイコン、空のプロフィール文、末尾が6桁以上の数字のハンドル
- ほかに当てはまる人
- プロフィールを設定したことがない人
フォロー数とフォロワー数
- 見る場所
- プロフィール
- 要注意の条件
- 1,000人以上をフォローし、フォローバックが20人に1人未満
- ほかに当てはまる人
- 新規アカウント、ニュースの閲覧中心の人
アカウント年齢とフォロワー数
- 見る場所
- プロフィール
- 要注意の条件
- 作成から6か月未満でフォロワー1万人以上
- ほかに当てはまる人
- バズった人
投稿のペース
- 見る場所
- プロフィール
- 要注意の条件
- 登録以来の平均で1日50件以上の投稿
- ほかに当てはまる人
- 報道機関、実況投稿をする人
所在地
- 見る場所
- このアカウントについて
- 要注意の条件
- X の国が、プロフィール文の場所や App Store の地域と異なる
- ほかに当てはまる人
- 旅行者、VPN 利用者、海外在住者
ユーザー名の変更
- 見る場所
- このアカウントについて
- 要注意の条件
- 3回以上、またはフォロワー1万人以上で直近90日以内に1回
- ほかに当てはまる人
- リブランディング
Premium の開始時期
- 見る場所
- このアカウントについて
- 要注意の条件
- 登録から1週間以内に Premium を購入
- ほかに当てはまる人
- 長い動画を投稿するために登録したクリエイター
投稿時間帯
- 見る場所
- 最新の投稿
- 要注意の条件
- 投稿が最も多い7時間が、アカウントが示すどの国でも夜間にあたる
- ほかに当てはまる人
- 夜勤の人、予約投稿ツール
投稿内容の構成
- 見る場所
- 最新の投稿
- 要注意の条件
- リポストが80%以上、返信が90%以上、または自分の投稿の90%以上にリンクがある
- ほかに当てはまる人
- キュレーター、リンクフィード
AI ラベル
- 見る場所
- 最新の投稿
- 要注意の条件
- 最新の投稿の半数以上に「Made with AI」ラベルが付いている
- ほかに当てはまる人
- AI の利用を開示しているアーティスト
「このアカウントについて」の3つのシグナルは、多くのガイドが見落としているものです。X はすべての公開プロフィールで、「このアカウントについて」に、アカウントに割り当てた国、ハンドルの変更回数、Premium の開始時期を表示します。国の意味と出どころについては、X の「アカウントの所在地」とはをご覧ください。
要注意のシグナルの数で判定します。0〜1個なら低、2〜3個なら中、4個以上なら高です。これは Twitter ボットチェッカーが表示する区分と同じなので、この表をもとに作ったスクリプトと無料ツールは、どのアカウントでも同じ結果になります。
#任意のアカウントのフェイクフォロワーを見つける方法
各フォロワーを、そのプロフィールにある7つのフラグでスコア化し、フェイクに見える割合を読み取ります。3つ以上ならフェイクの可能性が高く、2つなら多くは非アクティブな人、1つ以下なら実在のフォロワーです。7つのフラグはすべて、GET /followers がフォロワーごとに返すフィールドから判定できます。
- 直近30日以内に登録:
created_atから判定。 - 1,000人以上をフォローし、フォローバックが20人に1人未満:
followings_countとfollowers_countから判定。 - 投稿なし:
tweets_countが0。 - いいねなし:
favourites_countが0。 - デフォルトのアイコン:
profile_image_urlが X のデフォルト画像を指している。 - プロフィール文が空:
descriptionが空白。 - 名前と数字のハンドル:
usernameの末尾が6桁以上の数字。
注目すべき数字は、フェイクに見える割合です。私たちは次のように読んでいます。
| フェイクに見える割合 | 通常の意味 |
|---|---|
| 10%未満 | アクティブなアカウントでは普通:ボットは人間らしく見せるために人気アカウントをフォローする |
| 10〜30% | 要確認:同じ分野で同じ規模のアカウントと比べる |
| 30%超 | フォロワーの購入、またはボットの大量流入。特に、同じ数週間に X に登録したフォロワーが多い場合 |
10%未満
- 通常の意味
- アクティブなアカウントでは普通:ボットは人間らしく見せるために人気アカウントをフォローする
10〜30%
- 通常の意味
- 要確認:同じ分野で同じ規模のアカウントと比べる
30%超
- 通常の意味
- フォロワーの購入、またはボットの大量流入。特に、同じ数週間に X に登録したフォロワーが多い場合
この区分は7つのフラグに対する私たちの読み方で、X が公表しているルールではありません。疑いの大半は登録日で決着がつきます。X はフォロワーを新しい順に並べ、購入されたフォロワーは一括で入ってくるので、購入するとリストの先頭に作成直後のアカウントがまとまって現れます。
知っておきたいこと
非アクティブはフェイクではありません。実在の多くの人が、アカウントをフォローしても投稿もいいねもせず、プロフィール文も書かないため、2つのフラグに当てはまります。両者は分けて数えてください。まとめてフェイク扱いすると、古くて静かなフォロワーが多いアカウントで警戒度が倍になってしまいます。
#Python でフォロワー全員を監査する
フォロワー監査では、アカウントのフォロワーリスト全体をページ送りで取得し、各プロフィールを7つのフラグでスコア化します。この作業には Sorsa API を使います。GET /followers は1リクエストでフォロワー200人と、フラグに必要なすべてのフィールドを返し、1,000人あたり$0.007から。フォロワー5万人のアカウントなら$0.35からです。キーの取得からレポートまでは5ステップです。
-
キーを取得する。 サインアップして、ダッシュボードから API キーをコピーします。最初の100リクエストは無料です。
-
最初のページをリクエストする。 ハンドルを
GET /followers(新しいタブで開きます) に渡し、キーをApiKeyヘッダーに入れます。新しいフォロワーから順に返ります。ターミナル curl -G "https://api.sorsa.io/v3/followers" \ -H "ApiKey: YOUR_API_KEY" \ --data-urlencode "username=gulfcoast_wire_news"レスポンス200 OK { "users": [ { "id": "1981374420583055360", "username": "dana_k_2042719983", "display_name": "Dana K", "description": "Crypto | NFTs | DM for promo", "location": "", "created_at": "2026-10-24T03:12:51Z", "followers_count": 12, "followings_count": 2140, "tweets_count": 0, "favourites_count": 37, "media_count": 0, "profile_image_url": "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png", "verified": false, "protected": false }, { "id": "1204958817730289664", "username": "harborlight_reads", "display_name": "Harborlight Reads", "description": "Coastal history, one book at a time.", "location": "Mobile, Alabama", "created_at": "2019-12-12T15:40:02Z", "followers_count": 3871, "followings_count": 512, "tweets_count": 9420, "favourites_count": 18233, "media_count": 611, "profile_image_url": "https://pbs.twimg.com/profile_images/1204961/h.jpg", "verified": false, "protected": false } ], "next_cursor": "1849212213712385091" } -
各プロフィールをスコア化する。 フォロワーごとに7つのフラグを数え、フェイクに見える、非アクティブに見える、実在に見える、のいずれかに分類します。
-
カーソルをたどる。 カーソルとは、各ページが返す「しおり」のことです。
next_cursorを次のリクエストのパラメータとして送り続け、カーソルのないページが返ってきたらリストの終わりです。 -
監査を全体に実行する。 下のスクリプトが、任意のアカウントについてステップ2〜4を実行し、3つの割合、登録が最も多かった月、5件の例を出力します。無料チェッカーと同じように最新の200人だけをスコア化するには、
max_pages=1を渡します。import re import time from collections import Counter from datetime import datetime, timezone import requests API = "https://api.sorsa.io/v3" HEADERS = {"ApiKey": "YOUR_API_KEY"} NOW = datetime.now(timezone.utc) def flags(user): """The seven fake-follower flags of one profile.""" joined = datetime.fromisoformat(user["created_at"].replace("Z", "+00:00")) following = user["followings_count"] photo = user.get("profile_image_url") or "" found = [] if (NOW - joined).days < 30: found.append("joined in the last 30 days") if following >= 1000 and user["followers_count"] * 20 < following: found.append("follows 1,000+, few follow back") if user["tweets_count"] == 0: found.append("no posts") if user["favourites_count"] == 0: found.append("no likes") if not photo or "default_profile" in photo: found.append("default photo") if not (user.get("description") or "").strip(): found.append("empty bio") if re.search(r"\d{6,}$", user["username"]): found.append("name-and-digits handle") return found def audit(username, max_pages=None): """Score every follower of one account, 200 per request.""" params, pages = {"username": username}, 0 groups, months, examples = Counter(), Counter(), [] while True: r = requests.get(f"{API}/followers", headers=HEADERS, params=params) if r.status_code == 429: # over 20 requests in one second time.sleep(1) continue r.raise_for_status() page = r.json() for user in page["users"]: found = flags(user) n = len(found) group = "fake" if n >= 3 else "inactive" if n == 2 else "real" groups[group] += 1 months[user["created_at"][:7]] += 1 if group == "fake" and len(examples) < 5: examples.append((user["username"], found)) pages += 1 cursor = page.get("next_cursor") if not cursor or pages == max_pages: break params["next_cursor"] = cursor total = sum(groups.values()) for group in ("fake", "inactive", "real"): print(f"looks {group}: {groups[group]} ({groups[group] / total:.0%})") month, count = months.most_common(1)[0] print(f"busiest join month: {month}, {count / total:.0%} of followers") for handle, found in examples: print(f" @{handle}: {', '.join(found)}") audit("gulfcoast_wire_news")
401 または 403 は、キーがない、誤っている、またはリクエストを使い切ったことを意味します。429 は1秒間に20リクエストを超えたことを意味し、Python のスクリプトは1秒待って再試行します。1つのアカウントのページは、次のページに前のカーソルが必要なので順番に処理されますが、複数のアカウントなら、キー1つあたり毎秒20リクエストまで並行して監査できます。プロフィール自体をファイルに保存したい場合は、Twitter のフォロワーをエクスポートして CSV にする方法をご覧ください。
コードを書かずにレスポンスをスコア化する
GET /followers の任意の1ページ分の JSON(上の curl リクエストや API プレイグラウンドで取得したもの)を下に貼り付けると、同じ7つのフラグで、ページがブラウザ内でスコア化します。
1ページに最大200フォロワーが入ります。それ以上をスコア化するには、複数ページを1つのJSON配列として貼り付けてください: [page1, page2].
例: @gulfcoast_wire_newsの最新200フォロワー
17% 人が偽に見える
- 偽に見える 34 17%
- 休眠に見える 30 15%
- 本物に見える 136 68%
41人が直近30日以内にXに登録しました。登録が最も多い月: 2026年10月、全体の21%。
フラグが付いた例
- @dana_k_2042719983 直近30日以内に登録、フォロー1,000以上でフォローバックが少ない、投稿なし、デフォルト写真、名前+数字のハンドル
- @mira_lopez_88310274 直近30日以内に登録、投稿なし、いいねなし、デフォルト写真、自己紹介が空、名前+数字のハンドル
- @gainsdaily_alerts_x 直近30日以内に登録、フォロー1,000以上でフォローバックが少ない、投稿なし、自己紹介が空
- @t_ward_4471902366 投稿なし、いいねなし、デフォルト写真、名前+数字のハンドル
スコア化はブラウザ内で実行され、貼り付けた内容がページ外に送信されることはありません。
#既知のアカウントリストを100件ずつまとめて審査する
クリエイター、パートナー、返信アカウントのリストを審査するには、GET /info-batch(新しいタブで開きます) でプロフィールを100件ずつ読み取り、続けて GET /about(新しいタブで開きます) から各アカウントの「このアカウントについて」のデータを取得します。下のスクリプトは10個のうち6個のシグナルを計算し、さっと確認できるよう、X の国とプロフィール文の場所を並べて出力します。
「このアカウントについて」の側は、公式 X API が弱い部分です。データディクショナリ(新しいタブで開きます)が示すとおり、そのユーザーオブジェクトには自由記述の場所はあっても、国、ユーザー名の履歴、Premium の開始日はありません。Sorsa API の GET /about は、country、username_change_count、last_username_change_at、premium_start_at、そして source に App Store の地域を返します。
from datetime import datetime, timezone
import requests
API = "https://api.sorsa.io/v3"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
NOW = datetime.now(timezone.utc)
def when(stamp):
return datetime.fromisoformat(stamp.replace("Z", "+00:00"))
def profiles(handles):
"""Profiles of up to 100 accounts per request."""
for i in range(0, len(handles), 100):
r = requests.get(f"{API}/info-batch", headers=HEADERS,
params={"usernames": handles[i:i + 100]})
r.raise_for_status()
yield from r.json()["users"]
def about(handle):
"""X's About this account data: country, renames, Premium."""
r = requests.get(f"{API}/about", headers=HEADERS,
params={"username": handle})
r.raise_for_status()
return r.json()
def signals(p, a):
age = max((NOW - when(p["created_at"])).days, 1)
fans, follows = p["followers_count"], p["followings_count"]
photo = p.get("profile_image_url") or ""
setup = [not photo or "default_profile" in photo,
not (p.get("description") or "").strip(),
p["username"][-6:].isdigit()]
renamed = a.get("last_username_change_at")
premium = a.get("premium_start_at")
return {
"profile setup": sum(setup) >= 2,
"follow ratio": follows >= 1000 and fans * 20 < follows,
"young, big audience": age < 183 and fans >= 10000,
"50+ posts a day": p["tweets_count"] / age >= 50,
"username changes": (a.get("username_change_count") or 0) >= 3
or (bool(renamed) and (NOW - when(renamed)).days < 90
and fans >= 10000),
"Premium in week one": bool(premium)
and (when(premium) - when(p["created_at"])).days < 7,
}
for p in profiles(["gulfcoast_wire_news", "harborlight_reads"]):
a = about(p["username"])
hits = [name for name, hit in signals(p, a).items() if hit]
print(f"@{p['username']}: {len(hits)} of 6 {hits}")
print(f" X places it in {a.get('country')}; bio: {p.get('location')}")
各アカウントの「このアカウントについて」のリクエストは互いに独立しているので、リストは並行処理できます。1,000アカウントなら、毎秒20リクエストで1分もかかりません。残る3つのシグナルである投稿時間帯、投稿内容の構成、AI ラベルは、POST /user-tweets(新しいタブで開きます) から取得します。このエンドポイントは最新20件の投稿を、created_at、返信、リポスト、リンク、made_with_ai ラベルとともに返します。すでに2個以上に当てはまったアカウントだけに実行すれば、詳細チェックのコストも抑えられます。
#ボット監査にかかるコスト
Sorsa API でフォロワーをチェックするコストは1,000人あたり$0.007からです。公式 X API は1,000人あたり$10.00で、返したフォロワー1人ごとに、従量課金の料金表(新しいタブで開きます)にあるユーザー読み取り$0.010が課金されます。フォロワー5万人のアカウントなら、$500ではなく$0.35です。
公式 X API
$1,000
10万フォロワーの場合
1フォロワー$0.010
Sorsa API
$0.70から
10万フォロワーの場合
1,000人あたり$0.007から
コストは1,000分の1
アカウントのリストを審査する場合も、同じ考え方で料金が決まります。1,000アカウントのプロフィールと「このアカウントについて」のシグナルは Sorsa API で$1.41から、行動シグナル用に各アカウントの最新20件の投稿も加えると$2.81からです。公式 X API では、同じ1,000プロフィールに20件ずつの投稿を付けると$110.00かかり、しかもそのユーザーオブジェクトには「このアカウントについて」のデータがまったくありません。
ボット判定のデータソースを選ぶときの決め手は5つあります。Sorsa API の数字は次のとおりです。
- 1,000件あたりの料金: フォロワーは$0.007から、プロフィールは$0.014から。失敗したリクエストは課金されません。
- フィールド: フォロワーごとに完全な公開プロフィールを返し、公式 X API にはない X の「このアカウントについて」のデータも取得できます。
- 速度: 無料アカウントを含め、全プランで毎秒20リクエスト。
- セットアップ: ヘッダーに API キーを1つ入れるだけ。X の開発者アカウントも OAuth も審査も不要です。
- 自分のアカウント: 一切関与しません。Sorsa API は X のログイン情報も Cookie も求めないので、数千のアカウントをチェックしても、自分のアカウントには何のリスクもありません。
#かつての無料ボット判定ツールが機能しなくなった理由
多くのガイドが今も挙げているボット判定ツールは、Twitter の無料 API に依存していたため、2023年にそれが終了するとデータを失いました。インディアナ大学の Observatory on Social Media が運営する Botometer は、現在 Botometer X をアーカイブモードで運用しています。自身の説明(新しいタブで開きます)によると、スコアは2023年5月31日より前に収集したデータに基づいており、それ以降に作られたアカウントの記録はなく、モデルは生成 AI の登場前のものなので、AI で動くボットは検出できません。
最後に残っていたライブスコアリングの API エンドポイントである Botometer v4 と BotometerLite は、Botometer Pro の API ページ(新しいタブで開きます)の告知によれば2026年11月2日に終了しており、残っているのはアーカイブ用のエンドポイントだけです。SparkToro の無料の Fake Followers Audit も姿を消しました。そのアドレスは今、SparkToro のトップページにリダイレクトされます。
残っているのは、こうしたツールが使っていた方法、つまり公開シグナルをまとめて数えることです。プロフィールを大規模に読み取れる手段さえあれば、ライブデータでも通用します。その手段を提供するのが API です。このガイドのチェックなら、昨日作られたアカウントにも実行できます。アーカイブではそうはいきません。
#シグナルによる判定でわからないこと
シグナルで見つかるのは、雑なボットと購入されたフォロワーの大半です。アカウントを誰が、なぜ運用しているのかまでは証明できません。実際に問題になる限界は4つあります。
- 巧妙なフェイクは通過します。 古いアカウントで、本物のアイコンがあり、投稿のリズムが安定していて、返信が AI で書かれていれば、どのシグナルにも引っかからないことがあります。連携したネットワークは、1つのアカウントの中よりも、アカウント間(同じ登録時期、同じ文言)に現れます。
- 実在の人もフラグに当てはまります。 報道機関は1日80回投稿し、海外在住者のプロフィール文には故郷が書かれ、閲覧専用の人は一度も投稿しません。上の表では、シグナルごとに、ほかに当てはまる人を挙げています。
- 非公開のリストは非公開のままです。 非公開アカウントのフォロワーは誰にも読み取れず、Sorsa API が返すのは公開データだけです。
- 古い購入は埋もれます。 最新の200人からわかるのは最近の一括購入です。2年前の購入はリストのずっと奥にあるので、履歴が重要なときはリスト全体を監査してください。
シグナルであって、判決ではありません
高いスコアは、調べる理由であって証拠ではありません。削除、ブロック、報告をする前に、フラグが付いたアカウントをいくつか自分で開いて確かめてください。スコアだけでスクリプトにそれを任せることは決してしないでください。自分のアカウントが X に繰り返しボット扱いされる場合は、別の問題です。X に「リクエストが自動化されているようです」と表示されたときの対処法をご覧ください。
#最初のフォロワー監査を実行する
いちばん信用していないアカウントからスクリプトを実行してみましょう。Sorsa API は、7つのフラグに必要なすべてのフィールドとともに、そのフォロワーを1リクエスト200人、1,000人あたり$0.007からで読み取ります。100回分の無料リクエストで最初の2万人をカバーでき、1つのアカウントだけなら、Twitter ボットチェッカーがコードなしで答えを出します。フォロワー系のエンドポイントが返すそのほかの情報については、Twitter フォロワー API のガイドをご覧ください。
#よくある質問
Twitter のボット判定にはどの API を使えばよいですか?
Sorsa API を使います。GET /followers は1リクエストで完全なプロフィール付きのフォロワー200人を、1,000人あたり$0.007からで返します。公式 X API は$10.00です。さらに GET /about が、公式 X API が返さない X の「このアカウントについて」のデータを加えます。必要なのは API キー1つだけで、開発者アカウントは不要です。全プランで毎秒20リクエストで動作し、X のログイン情報には一切触れません。
X のフェイクフォロワーは何%までなら普通ですか?
アクティブなアカウントの最新フォロワーのうち、フェイクに見えるのが10%未満なら普通です。ボットは人間らしく見せるために人気アカウントをフォローするからです。10〜30%なら、似たアカウントと比べて詳しく確認する価値があります。30%を超え、同じ数週間に X に登録したフォロワーが多ければ、フォロワーの購入かボットの大量流入を示します。この読み方は7つのフラグに基づくもので、X は公式の基準を公表していません。
購入していないのに、なぜボットのフォロワーがいるのですか?
ボットは、人間らしく見せるため、フォローバックを集めるため、あるいはあなたを詐欺に誘導するために実在のアカウントをフォローします。そのため、ほとんどのアカウントにある程度は付きます。少数なら何も変わりません。外したいときは、ブロックしてからブロックを解除すると、フォロワーから外れ、ブロック状態も残りません。リストの先頭に、作成直後のアカウントが突然まとまって現れた場合は、警戒すべきパターンです。
投稿のエンゲージメントがボットによるものかどうか、どう見分けますか?
数字ではなく、エンゲージメントの元になっているアカウントをスコア化します。Sorsa API の POST /retweeters(新しいタブで開きます) は、投稿をリポストしたアカウントを完全なプロフィール付きで返し、POST /comments は返信を投稿者付きで返します。そのため、フォロワーと同じ7つのフラグをそのまま使えます。その中に、作成直後で中身が空のアカウントが大量にあれば、購入されたエンゲージメントです。Sorsa API は、誰が投稿にいいねしたかは返しません。
X でボットを無料で判定する方法はありますか?
あります。Twitter ボットチェッカーは、任意の公開アカウントの10個のシグナルを読み取り、最新フォロワー200人をスコア化します。無料で、登録も不要です。それ以上のアカウント数や、フォロワー全員を対象にするなら、Sorsa API で100回分の無料リクエストから始められます。クレジットカード不要・有効期限なしで、このガイドのスクリプトなら最大2万人のフォロワーをスコア化できます。
公式 X API なしでボットを判定できますか?
できます。ここで使うシグナルはすべて公開プロフィールのデータで、Sorsa API はヘッダーに API キーを1つ入れるだけで返します。X の開発者アカウントも OAuth も審査も不要です。公式 X API ではその3つがすべて必要で、返したユーザー1人ごとに$0.010が課金され、従量課金の上限は月間300万件の投稿読み取りです。
#検証の方法
2026年11月2日に、このガイドに登場するすべてのエンドポイント、フィールド、ページサイズを稼働中の Sorsa API リファレンスと照合し、公式 X API の料金とユーザーフィールドを docs.x.com と照合しました。Botometer の説明と API ページ、自動化ラベルと真正性についての X ヘルプセンターのページを読み、SparkToro の旧監査ツールのアドレスをたどって、現在の遷移先を確認しています。7つのフラグ、10個のシグナル、およびそのしきい値は、無料の Twitter ボットチェッカーが使っているものと同じです。例に出てくるアカウントは架空のものです。
出典
- Sorsa API reference: Followers(新しいタブで開きます)
- Sorsa API reference: Account About Info(新しいタブで開きます)
- X API pricing (docs.x.com)(新しいタブで開きます)
- X API data dictionary: user fields (docs.x.com)(新しいタブで開きます)
- About automated account labels (X Help Center)(新しいタブで開きます)
- Authenticity policy (X Help Center)(新しいタブで開きます)
- About Botometer (OSoMe, Indiana University)(新しいタブで開きます)
- Botometer Pro: deprecation and sunset notice(新しいタブで開きます)