XのアカウントやリストからTwitterのRSSフィードを作る方法
Xは公式のRSSフィードを提供していないため、Twitter RSSフィードは自分で作ります。スクリプトでアカウントの最新投稿をJSONで読み取り(1リクエストで約20件)、RSS 2.0のファイルに書き換えて、リーダーに定期的に取得させます。
要点: 15分ごとに更新する場合、フィード1つにつき月に約2,880リクエストです。公開Xリストを使えば、最大5,000アカウントを同じ1リクエストにまとめられます。作るにはSorsa APIが使えます。POST /user-tweets は1リクエストで20投稿を返し、1,000件あたり$0.07からです。100回分の無料リクエストで、最初の2,000投稿を取得できます。
- エンドポイント
POST /user-tweets- 1ページの件数
- 1リクエストあたり20投稿
- 料金
- 1,000投稿あたり$0.07から
#XにはRSSフィードがありますか?
ありません。Xにはプロフィール、検索、リストのいずれにもRSSフィードがありません。プロフィールのアドレスに /rss を付けても、x.comは通常のウェブページを返します。2026年11月2日に確認しました。現在動いているTwitter RSSフィードは、すべて誰かがXのデータから生成したものです。つまり本当の選択肢は、何の上に作るか、そして誰が運用を続けるかです。
既製の方法には、それぞれ条件が付きます。
- RSSHubのXルートは、ルートのソースによると、現在はログイン済みのXアカウントの
auth_tokenCookieか、公式X APIのキーがないと動きません。Cookieを使うとフィードが実在のアカウントに結び付き、そのアカウントが危険にさらされます。 - ホスト型のフィード生成サービスは、フィードをサブスクリプションとして販売しています。フィードごとに保持する投稿数や更新頻度は、プランで決まります。
RSS自体は健在です。Feedly、Inoreader、NetNewsWire、FreshRSS、Miniflux、n8nのRSS Readノードは、いずれもRSS 2.0を購読できます。作ったフィードは、普段使っているツールにそのままつなげます。フィードではなく、スマートフォンやSlackへの通知がほしいなら、ツイートの通知を受け取る方法を参照してください。
#Twitter RSSフィードの仕組み
Twitter RSSフィードは5つのステップでできていて、Xのデータに触れるのは最初の1つだけです。残りは短いスクリプトとタイマーで済みます。
-
最新の投稿をJSONで取得します。 1回のリクエストで、アカウントの最新20投稿が、本文、日付、メディア、投稿者つきで返ります。
-
取得済みの投稿を保持します。 小さな状態ファイルを置くと、重複を防げて、フィードに1ページ分より多い投稿を持たせられます。
-
各投稿をRSSのitemに変換します。 タイトル、リンク、日付、本文を、どのリーダーでも解釈できる要素に入れます。
-
XMLファイルを書き出します。 先に一時ファイルへ書いてから入れ替えると、リーダーが中途半端なフィードを取得することがありません。
-
スケジュールで更新します。 多くのフィードには、15分〜60分ごとが適しています。
Xのデータを読むのは最初のステップだけです。スクリプトとファイル、リーダーはあなたの側にあります。
データを取得するステップには、Twitter(X)API兼スクレイピングツールであるSorsa APIが使えます。APIキー1つで POST /user-tweets を1回呼ぶと、アカウントの最新20投稿が整ったJSONで返ります。開発者アカウントは不要で、Xのログイン情報を求めることもありません。レスポンスのスキーマはリリースをまたいでも変わらないため、今日書いたフィードのスクリプトがそのまま動き続けます。
リーダーに表示される内容は5つのRSS要素にすべて入っていて、それぞれがレスポンスのフィールドに対応します。
| RSSの要素 | Sorsa APIのフィールド | 役割 |
|---|---|---|
title | full_text の先頭80文字 | リーダーはタイトルで項目を一覧表示する |
link と guid | https://x.com/ + user.username + /status/ + id | 固定のguidで重複を防ぐ |
pubDate | created_at(ISO 8601) | RSSにはRFC 822形式の日付が必要 |
description | full_text と entities[].preview の画像 | 投稿をHTMLにしたもの |
dc:creator | user.display_name | RSSの author はメールアドレスでなければならない |
title- Sorsa APIのフィールド
full_textの先頭80文字- 役割
- リーダーはタイトルで項目を一覧表示する
linkとguid- Sorsa APIのフィールド
https://x.com/+user.username+/status/+id- 役割
- 固定のguidで重複を防ぐ
pubDate- Sorsa APIのフィールド
created_at(ISO 8601)- 役割
- RSSにはRFC 822形式の日付が必要
description- Sorsa APIのフィールド
full_textとentities[].previewの画像- 役割
- 投稿をHTMLにしたもの
dc:creator- Sorsa APIのフィールド
user.display_name- 役割
- RSSの
authorはメールアドレスでなければならない
#アカウントの投稿をJSONで取得する
アカウントのハンドルを POST /user-tweets に送ると、最新の20投稿が1回のレスポンスで返ります。何もない状態から最初のレスポンスまで、手順は3つです。
-
キーを取得します。 登録して、ダッシュボードからAPIキーをコピーします。最初の100リクエストは無料で、有効期限はありません。
-
エンドポイントを呼び出します。 ユーザー名をJSONボディで送り、キーを
ApiKeyヘッダーに入れます。パラメーターの一覧はユーザーのツイート取得リファレンス(新しいタブで開きます)にあります。Terminal curl -X POST "https://api.sorsa.io/v3/user-tweets" \ -H "ApiKey: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"username": "nasa_launch_desk"}'Response200 OK { "tweets": [ { "id": "1985012345678901234", "full_text": "Static fire complete. Launch window opens Thursday.", "created_at": "2026-11-02T14:05:00Z", "lang": "en", "likes_count": 1840, "retweet_count": 312, "reply_count": 95, "view_count": 120400, "is_reply": false, "entities": [ { "type": "photo", "link": "https://t.co/k3x9demo", "preview": "https://pbs.twimg.com/media/demo-static-fire.jpg" } ], "user": { "id": "1700000000000000042", "username": "nasa_launch_desk", "display_name": "Launch Desk" } } ], "next_cursor": "DAABCgABG8a1demoAAA" } -
フィードに表示する内容を選びます。
typeにはposts(デフォルト)、replies、retweetsを指定できます。with_replies: trueを付けると、リプライも投稿に混ぜて取得します。next_cursorを使うと、さらに古い次の20投稿を取得できます。
各投稿には投稿者のプロフィール全体も含まれるため、フィードのために名前やアイコンを別のリクエストで取得する必要はありません。403はキーがないかリクエストを使い切ったことを、429は1秒間に20リクエストを超えたことを示します。失敗したリクエストに課金されることはありません。
#PythonでJSONをRSSに変換する
下のスクリプトは、そのJSONをPythonの標準ライブラリだけで有効なRSS 2.0のファイルに変換します。インストールするものはありません。アカウントにも、リストにも、検索にも使えて、実行のあいだに直近50投稿を記憶します。
"""Write an RSS 2.0 feed of an X account, List or search.
python x_rss.py user nasa_launch_desk
python x_rss.py list 1700000000000000001
python x_rss.py search "from:nasa_launch_desk OR #artemis"
"""
import json
import os
import sys
import urllib.parse
import urllib.request
from datetime import datetime
from email.utils import format_datetime
from xml.sax.saxutils import escape
API = "https://api.sorsa.io/v3"
KEY = os.environ.get("SORSA_API_KEY", "YOUR_API_KEY")
KEEP = 50 # posts the feed keeps
MAX_PAGES = 5 # pages one run may read to catch up
def page(kind, target, cursor):
if kind == "list":
query = {"list_id": target}
if cursor:
query["next_cursor"] = cursor
url = API + "/list-tweets?" + urllib.parse.urlencode(query)
req = urllib.request.Request(url)
else:
if kind == "user":
path, body = "/user-tweets", {"username": target}
else:
path, body = "/search-tweets", {"query": target,
"order": "latest"}
if cursor:
body["next_cursor"] = cursor
req = urllib.request.Request(
API + path, data=json.dumps(body).encode(),
headers={"Content-Type": "application/json"})
req.add_header("ApiKey", KEY)
with urllib.request.urlopen(req, timeout=30) as resp:
return json.load(resp)
def fetch_new(kind, target, seen):
new, cursor = [], None
for _ in range(MAX_PAGES):
data = page(kind, target, cursor)
tweets = data.get("tweets") or []
new += [t for t in tweets if t["id"] not in seen]
cursor = data.get("next_cursor")
caught_up = any(t["id"] in seen for t in tweets)
if not cursor or not seen or caught_up:
break
return new
def to_item(t):
user = t.get("user") or {}
name = user.get("username", "")
link = f"https://x.com/{name}/status/{t['id']}"
text = " ".join(t.get("full_text", "").split())
when = datetime.fromisoformat(t["created_at"].replace("Z", "+00:00"))
pics = "".join(f'<p><img src="{escape(e["preview"])}"></p>'
for e in t.get("entities") or []
if e.get("type") == "photo" and e.get("preview"))
author = escape(user.get("display_name") or name)
xml = ("<item>"
f"<title>{escape(text[:80])}</title>"
f"<link>{link}</link>"
f'<guid isPermaLink="true">{link}</guid>'
f"<pubDate>{format_datetime(when)}</pubDate>"
f"<dc:creator>{author}</dc:creator>"
f"<description>{escape(escape(text) + pics)}</description>"
"</item>")
return {"id": t["id"], "date": when.isoformat(), "xml": xml}
def main(kind, target):
safe = (c if c.isalnum() or c in "_-" else "-" for c in target)
name = "".join(safe)[:60]
state, feed = name + ".json", name + ".xml"
items = []
if os.path.exists(state):
with open(state, encoding="utf-8") as f:
items = json.load(f)
seen = {i["id"] for i in items}
items += [to_item(t) for t in fetch_new(kind, target, seen)]
items = sorted(items, key=lambda i: i["date"], reverse=True)[:KEEP]
with open(state, "w", encoding="utf-8") as f:
json.dump(items, f)
home = {"user": f"https://x.com/{target}",
"list": f"https://x.com/i/lists/{target}"}
title = escape(f"X {kind}: {target}")
xml = ('<?xml version="1.0" encoding="UTF-8"?>'
'<rss version="2.0" '
'xmlns:dc="http://purl.org/dc/elements/1.1/"><channel>'
f"<title>{title}</title>"
f"<link>{home.get(kind, 'https://x.com/')}</link>"
f"<description>{title}, built with Sorsa API</description>"
+ "".join(i["xml"] for i in items) + "</channel></rss>")
with open(feed + ".tmp", "w", encoding="utf-8") as f:
f.write(xml)
os.replace(feed + ".tmp", feed)
print(f"{feed}: {len(items)} posts")
if __name__ == "__main__":
main(sys.argv[1], sys.argv[2])
このフィードが、1ページを単純に変換しただけのものより優れている点は3つあります。
- 投稿が集中しても取りこぼしません。 実行の間にアカウントが20回を超えて投稿した場合、スクリプトは
next_cursorをたどって、すでに持っている投稿に出会うまで(最大5ページ)さかのぼります。 - 20件ではなく50件を保持します。 JSONの状態ファイルが過去の投稿を覚えているため、投稿の少ない日でもフィードが空になりません。
- フィードバリデーターの一般的なチェックを通ります。 日付はRFC 822形式、すべてのitemに固定の
guidがあり、投稿者はdc:creatorに入り、投稿のHTMLはXML用に1回だけエスケープされます。
python x_rss.py user nasa_launch_desk を実行すると、スクリプトの隣に nasa_launch_desk.xml というファイルができます。最初の実行は1リクエスト、以降の実行は1リクエストに加えて、追いつくのに必要な追加ページ1つにつき1リクエストです。
#リスト全体や検索を1つのフィードにする
公開Xリストを使うと、最大5,000アカウントが、1アカウントのフィードと同じコストの1つのフィードになります。Sorsa APIの GET /list-tweets は、リストの全メンバーの最新投稿を、時系列順の1ページで返します。そのため、フォローするアカウントが何件でも、更新1回につき消費するリクエストは1つです。
200アカウントを個別のフィードとして15分ごとに追うと、月に57.6万リクエストかかります。同じ200アカウントを1つのリストにまとめれば、2,880リクエストです。設定するには、Xアプリで公開リストを作る(または他の人の公開リストを使う)、そのアドレスの末尾にある数字(x.com/i/lists/<number>)をコピーして、list_id として渡します。パラメーターはリストのツイート取得リファレンス(新しいタブで開きます)にあります。メンバーやフォロワーについては、Twitter リスト APIのガイドで解説しています。
python x_rss.py list 1700000000000000001
検索フィードも同じように動きます。order を latest にして POST /search-tweets を使います。リストを作らずに少数のアカウントを追いたいときや、トピックを追いたいときに使えます。
from:nasa_launch_desk OR from:orbit_news_digest
#artemis -filter:replies
"launch window" lang:en min_faves:50
Xの検索演算子はすべて使え、2006年にさかのぼれます。演算子は例つきでTwitterの検索演算子のガイドに一覧があり、リクエストの形式はツイート検索のリファレンス(新しいタブで開きます)にあります。投稿の多いリストやハッシュタグでは、更新の間に20回を超えて投稿されることがあります。その場合スクリプトは追加のページを1ページにつき1リクエストで読み取ります。そのため、混み合うフィードは更新の頻度を下げるのではなく、上げてください。
#スケジュール実行と購読
スクリプトをタイマーで実行し、ウェブサーバーでファイルをリーダーに渡せば、フィードは新しいままです。Linuxサーバーなら、crontabに2行書くだけで、キーを保持して15分ごとにフィードを更新できます。
SORSA_API_KEY=YOUR_API_KEY
*/15 * * * * cd /srv/feeds && python3 x_rss.py user nasa_launch_desk
あとはフォルダーを公開します。そのマシンですでに動いているウェブサーバー(nginx、Caddy、Apache)なら、どれでも /srv/feeds を公開できます。同じサーバー上のFreshRSSやMinifluxのようなセルフホスト型のリーダーなら、ローカルのアドレスからファイルを読めます。手早く試すなら、python3 -m http.server 8080 --directory /srv/feeds で、http://localhost:8080/nasa_launch_desk.xml に公開されます。
フィードのアドレスを、リーダーの「フィードを追加」欄に貼り付けます。リーダーの更新間隔は、cronの実行間隔より短くしないでください。5分ごとに確認するリーダーは、4回のうち3回、同じファイルを見ることになります。
知っておきたいこと
フィードのURLは、自分のリーダーやチームのツールで使うためのものです。公開ページに置くのではなく、長いランダムなパスの後ろか、リーダーのログインの後ろに置いてください。フィードに含まれる投稿の権利は投稿者にあり、フィードには公開投稿だけが入ります。
#n8nでフィードを配信する
n8nなら、自前のサーバーなしで、4つのノードだけで同じフィードをn8n自身のURLで配信できます。リーダーがそのURLを取得するたびに、ワークフローがSorsa APIを1回呼び出し、新しいXMLを返します。
-
Webhookノードを追加します。 HTTP MethodをGETにし、長いランダムなパスを付けて、Respondを「Using 'Respond to Webhook' Node」に設定します。
-
HTTP Requestノードを追加します。
https://api.sorsa.io/v3/user-tweetsにPOSTし、ヘッダーApiKeyを付けて、JSONボディ{"username": "nasa_launch_desk"}を送ります。 -
Codeノードを追加します。
tweets配列をRSSのitemに変換します。コードは下のワークフローにあります。 -
Respond to Webhookノードを追加します。 Respond WithをTextにし、Codeノードの
xmlフィールドをResponse Bodyにドラッグして、レスポンスヘッダーContent-Typeにapplication/rss+xml; charset=utf-8を追加します。 -
ワークフローを有効化します。 WebhookノードのProduction URLを、リーダーに購読させます。
n8nワークフロー: 4ノード、フィードのURLは1つ- WebhookFeed URLGET、最後のノードで応答
- HTTP RequestSorsa API user tweetsPOST /user-tweets、ヘッダーはApiKey
- CodeBuild RSStweetsをRSS 2.0のitemに変換
- Respond to WebhookReturn the feedテキスト、application/rss+xml
const tweets = $input.first().json.tweets || []; const esc = (s) => String(s).replace(/&/g, '&') .replace(/</g, '<').replace(/>/g, '>'); const items = tweets.map((t) => { const link = 'https://x.com/' + t.user.username + '/status/' + t.id; const text = t.full_text.replace(/\s+/g, ' '); return '<item><title>' + esc(text.slice(0, 80)) + '</title>' + '<link>' + link + '</link>' + '<guid isPermaLink="true">' + link + '</guid>' + '<pubDate>' + new Date(t.created_at).toUTCString() + '</pubDate>' + '<description>' + esc(esc(text)) + '</description></item>'; }).join(''); const xml = '<?xml version="1.0" encoding="UTF-8"?>' + '<rss version="2.0"><channel><title>X feed</title>' + '<link>https://x.com/</link>' + '<description>Built with Sorsa API</description>' + items + '</channel></rss>'; return [{ json: { xml } }];{ "name": "X account to RSS feed (Sorsa API)", "nodes": [ { "parameters": { "httpMethod": "GET", "path": "x-feed-3f9c1a7e5b2d", "responseMode": "responseNode", "options": {} }, "name": "Feed URL", "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [ 0, 0 ], "webhookId": "3f9c1a7e-5b2d-4c8e-9a61-7d0e2b4f6c13" }, { "parameters": { "method": "POST", "url": "https://api.sorsa.io/v3/user-tweets", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "ApiKey", "value": "YOUR_API_KEY" } ] }, "sendBody": true, "specifyBody": "json", "jsonBody": "{\"username\": \"nasa_launch_desk\"}", "options": {} }, "name": "Sorsa API user tweets", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 220, 0 ] }, { "parameters": { "jsCode": "const tweets = $input.first().json.tweets || [];\nconst esc = (s) => String(s).replace(/&/g, '&')\n .replace(/</g, '<').replace(/>/g, '>');\nconst items = tweets.map((t) => {\n const link = 'https://x.com/' + t.user.username + '/status/' + t.id;\n const text = t.full_text.replace(/\\s+/g, ' ');\n return '<item><title>' + esc(text.slice(0, 80)) + '</title>' +\n '<link>' + link + '</link>' +\n '<guid isPermaLink=\"true\">' + link + '</guid>' +\n '<pubDate>' + new Date(t.created_at).toUTCString() + '</pubDate>' +\n '<description>' + esc(esc(text)) + '</description></item>';\n}).join('');\nconst xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>' +\n '<rss version=\"2.0\"><channel><title>X feed</title>' +\n '<link>https://x.com/</link>' +\n '<description>Built with Sorsa API</description>' +\n items + '</channel></rss>';\nreturn [{ json: { xml } }];" }, "name": "Build RSS", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 440, 0 ] }, { "parameters": { "respondWith": "text", "responseBody": "={{ $json.xml }}", "options": { "responseHeaders": { "entries": [ { "name": "Content-Type", "value": "application/rss+xml; charset=utf-8" } ] } } }, "name": "Return the feed", "type": "n8n-nodes-base.respondToWebhook", "typeVersion": 1.1, "position": [ 660, 0 ] } ], "connections": { "Feed URL": { "main": [ [ { "node": "Sorsa API user tweets", "type": "main", "index": 0 } ] ] }, "Sorsa API user tweets": { "main": [ [ { "node": "Build RSS", "type": "main", "index": 0 } ] ] }, "Build RSS": { "main": [ [ { "node": "Return the feed", "type": "main", "index": 0 } ] ] } } }n8nの空のキャンバスにJSONを貼り付け、HTTP Requestノードにキーを入れて、ワークフローを有効化し、Production URLを購読します。
Codeノードが、Sorsa APIのtweets配列をRSS 2.0に変換します。ワークフローJSONを使えば、4つのノードを一度に取り込めます。
この方法では、リーダーの更新間隔がコストを決めます。1時間ごとに確認するリーダーなら、フィード1つにつき月に720リクエストです。リストや検索のフィードにするには、HTTP RequestノードのURLとボディを変更します。取得した投稿をワークフローの後続(Slack、スプレッドシート、AIのステップ)にだけ使うなら、RSSは省いてJSONを直接読み取ってください。やり方はn8nでTwitter APIのガイドにあります。
#Twitter RSSフィードの費用
Twitter RSSフィードの費用は、更新1回につき1リクエストです。つまり価格は、アカウントの投稿量ではなく、更新の頻度と運用するフィードの数で決まります。30日の月で見ると次のとおりです。
| 更新間隔 | 1フィードの月間リクエスト数 | Starterの1万リクエストで運用できるフィード数 |
|---|---|---|
| 5分ごと | 8,640 | 1 |
| 15分ごと | 2,880 | 3 |
| 30分ごと | 1,440 | 6 |
| 1時間ごと | 720 | 13 |
| 6時間ごと | 120 | 83 |
5分ごと
- 1フィードの月間リクエスト数
- 8,640
- Starterの1万リクエストで運用できるフィード数
- 1
15分ごと
- 1フィードの月間リクエスト数
- 2,880
- Starterの1万リクエストで運用できるフィード数
- 3
30分ごと
- 1フィードの月間リクエスト数
- 1,440
- Starterの1万リクエストで運用できるフィード数
- 6
1時間ごと
- 1フィードの月間リクエスト数
- 720
- Starterの1万リクエストで運用できるフィード数
- 13
6時間ごと
- 1フィードの月間リクエスト数
- 120
- Starterの1万リクエストで運用できるフィード数
- 83
リストや検索は、含まれるアカウント数にかかわらず1フィードとして数えます。
投稿の多いリストや初回の実行のように、ページが満杯で返ってくる場合、Sorsa APIは投稿を1,000件あたり$0.07からで提供します。公式X APIは、従量課金の料金(新しいタブで開きます)で、読み取った投稿1,000件あたり$5.00を課金します。そのうえ開発者アカウントとOAuthアプリが必要で、従量課金は月間300万件の投稿読み取りが上限です。2026年11月22日からは、Xはエクスパンション経由で返される各投稿の投稿者とメディアにも、1ユーザーあたり$0.010を課金します(Xの10月23日のお知らせ(新しいタブで開きます))。
#今日から最初のフィードを作る
Twitter RSSフィードは、約100行のスクリプトとタイマーでできています。自分で書けないのはデータだけです。そのデータにはSorsa APIが使えます。更新1回につき1リクエスト、1リクエストで20投稿、最大5,000アカウントのリスト全体を1つのフィードに、全プラン毎秒20リクエストです。必要なのは開発者アカウントではなくAPIキー1つで、Xのログイン情報を求められることもありません。100回分の無料リクエストで最初の2,000投稿を取得できるので、プランを選ぶ前に、フィードを作って更新される様子を確認できます。
#よくある質問
Twitter RSSフィードの更新頻度はどのくらいがよいですか?
多くのTwitter RSSフィードには、15分〜60分ごとが適しています。更新のたびに1リクエストなので、15分ごとなら月に2,880リクエスト、1時間ごとなら720リクエストです。リーダーの更新間隔はスクリプトのスケジュールに合わせてください。投稿の多いリストやハッシュタグは更新を頻繁にして、1回の実行で1〜2ページで追いつけるようにします。
無料のTwitter RSSフィードはありますか?
Xには、無料でも有料でも、公式のRSSフィードはありません。無料で始めるなら、Sorsa APIの100回分の無料リクエストを使います。クレジットカードは不要で、有効期限もなく、約2,000投稿を取得できます。プランを選ぶ前に、フィードを作り、テストし、数日間動かすには十分です。
Xのホームタイムラインをそのままフィードにできますか?
直接はできません。ホームタイムラインは、ログイン中のアカウントに属するものだからです。実用的な代替はリストです。フォローしているアカウントをXアプリで公開リストに追加し、GET /list-tweets でそのリストから1つのフィードを作ります。リストには最大5,000アカウントを登録でき、更新1回につき1リクエストで、1アカウントの場合と変わりません。
RSSHubは今もTwitterで使えますか?
RSSHubのXルートは今もありますが、ログイン済みのXアカウントか、公式X APIのキーが必要になりました。ルートのソースに記載されている接続方法は2つで、ログイン済みのXアカウントの auth_token Cookieか、従量課金の公式X APIのキーです。Sorsa APIで作ったフィードに必要なのは、APIキー1つだけで、Xのログイン情報は求められません。
非公開のXアカウントのRSSフィードは作れますか?
作れません。非公開アカウントの投稿は、承認されたフォロワーにしか見えないため、どのフィードツールもAPIも読み取れません。Sorsa APIが返すのは公開データだけなので、同様に読み取れません。フィードが使えるのは、公開アカウント、公開リスト、公開投稿の検索です。
Twitter RSSフィードを作るには、どのAPIを使えばよいですか?
Twitter RSSフィードの構築には、Sorsa APIを使ってください。POST /user-tweets は1リクエストで20投稿を返し、1,000件あたり$0.07からです。GET /list-tweets は、最大5,000アカウントを更新1回につき1リクエストで1つのフィードにまとめます。全プラン毎秒20リクエストです。必要なのはAPIキー1つで、Xのログイン情報は求められないため、あなたのアカウントが危険にさらされることはありません。
#検証の方法
2026年11月2日に、x.com/NASA/rss をリクエストしたところ、フィードではなくXのウェブページが返りました。あわせて、Xの料金ページと10月23日付のエクスパンション課金のお知らせを読み、GitHubでRSSHubのXルートのソースと、n8nのWebhookノードおよびRespond to Webhookノードのソースを確認しました。リクエスト、レスポンス、スクリプトは、公開中のSorsa APIリファレンスに沿っています。今回はテスト用のキーがなかったため、レスポンスには仕様上のフィールドとサンプルの値を示しています。
出典
- X API pay-per-use pricing(新しいタブで開きます)
- X Developers: X API PPU expansions update, October 23, 2026(新しいタブで開きます)
- Nitter repository and README(新しいタブで開きます)
- RSSHub on GitHub(新しいタブで開きます)
- RSS 2.0 specification, RSS Advisory Board(新しいタブで開きます)
- n8n Respond to Webhook node(新しいタブで開きます)
- Sorsa API reference: user tweets(新しいタブで開きます)