Install any skill in seconds. Free to start, no credit card required.
Get Started Free →X/Twitter API integration for posting tweets, threads, reading timelines, search, and analytics. Covers OAuth auth patterns, rate limits, and platform-native content posting. Use when the user wants to interact with X programmatically.
.claude/skills/affaan-m-x-api/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 78% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 108% | 0% |
以编程方式与 X(Twitter)交互,用于发布、读取、搜索和分析。
最佳适用场景:读取密集型操作、搜索、公开数据。
bash# Environment setup export X_BEARER_TOKEN="your-bearer-token"
pythonimport os import requests bearer = os.environ["X_BEARER_TOKEN"] headers = {"Authorization": f"Bearer {bearer}"} # Search recent tweets resp = requests.get( "https://api.x.com/2/tweets/search/recent", headers=headers, params={"query": "claude code", "max_results": 10} ) tweets = resp.json()
必需用于:发布推文、管理账户、私信。
bash# Environment setup — source before use export X_API_KEY="your-api-key" export X_API_SECRET="your-api-secret" export X_ACCESS_TOKEN="your-access-token" export X_ACCESS_SECRET="your-access-secret"
pythonimport os from requests_oauthlib import OAuth1Session oauth = OAuth1Session( os.environ["X_API_KEY"], client_secret=os.environ["X_API_SECRET"], resource_owner_key=os.environ["X_ACCESS_TOKEN"], resource_owner_secret=os.environ["X_ACCESS_SECRET"], )
pythonresp = oauth.post( "https://api.x.com/2/tweets", json={"text": "Hello from Claude Code"} ) resp.raise_for_status() tweet_id = resp.json()["data"]["id"]
pythondef post_thread(oauth, tweets: list[str]) -> list[str]: ids = [] reply_to = None for text in tweets: payload = {"text": text} if reply_to: payload["reply"] = {"in_reply_to_tweet_id": reply_to} resp = oauth.post("https://api.x.com/2/tweets", json=payload) tweet_id = resp.json()["data"]["id"] ids.append(tweet_id) reply_to = tweet_id return ids
pythonresp = requests.get( f"https://api.x.com/2/users/{user_id}/tweets", headers=headers, params={ "max_results": 10, "tweet.fields": "created_at,public_metrics", } )
pythonresp = requests.get( "https://api.x.com/2/tweets/search/recent", headers=headers, params={ "query": "from:affaanmustafa -is:retweet", "max_results": 10, "tweet.fields": "public_metrics,created_at", } )
pythonresp = requests.get( "https://api.x.com/2/users/by/username/affaanmustafa", headers=headers, params={"user.fields": "public_metrics,description,created_at"} )
python# Media upload uses v1.1 endpoint # Step 1: Upload media media_resp = oauth.post( "https://upload.twitter.com/1.1/media/upload.json", files={"media": open("image.png", "rb")} ) media_id = media_resp.json()["media_id_string"] # Step 2: Post with media resp = oauth.post( "https://api.x.com/2/tweets", json={"text": "Check this out", "media": {"media_ids": [media_id]}} )
X API 的速率限制因端点、认证方法和账户等级而异,并且会随时间变化。请始终:
x-rate-limit-remaining 和 x-rate-limit-reset 头部信息pythonimport time remaining = int(resp.headers.get("x-rate-limit-remaining", 0)) if remaining < 5: reset = int(resp.headers.get("x-rate-limit-reset", 0)) wait = max(0, reset - int(time.time())) print(f"Rate limit approaching. Resets in {wait}s")
pythonresp = oauth.post("https://api.x.com/2/tweets", json={"text": content}) if resp.status_code == 201: return resp.json()["data"]["id"] elif resp.status_code == 429: reset = int(resp.headers["x-rate-limit-reset"]) raise Exception(f"Rate limited. Resets at {reset}") elif resp.status_code == 403: raise Exception(f"Forbidden: {resp.json().get('detail', 'check permissions')}") else: raise Exception(f"X API error {resp.status_code}: {resp.text}")
.env 文件。.env 文件。 将其添加到 .gitignore。使用 content-engine 技能生成平台原生内容,然后通过 X API 发布:
content-engine — 为 X 生成平台原生内容crosspost — 在 X、LinkedIn 和其他平台分发内容| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→pass | 11,123 | 7,923 | -29% | 1 | 1 | 0% | 2,572 | 3,637 | +41% | 0 | 0 | — |
case-01 | fail→pass | 9,875 | 8,006 | -19% | 1 | 1 | 0% | 2,400 | 3,473 | +45% | 0 | 0 | — |
case-03 | pass→pass | 8,818 | 4,069 | -54% | 1 | 1 | 0% | 1,910 | 2,503 | +31% | 0 | 0 | — |
case-04 | fail→pass | 10,091 | 6,223 | -38% | 1 | 1 | 0% | 1,870 | 2,891 | +55% | 0 | 0 | — |
case-05 | fail→pass | 6,033 | 3,813 | -37% | 1 | 1 | 0% | 1,311 | 2,333 | +78% | 0 | 0 | — |
case-06 | fail→pass | 5,500 | 4,468 | -19% | 1 | 1 | 0% | 1,268 | 2,639 | +108% | 0 | 0 | — |
case-07 | fail→pass | 4,585 | 2,909 | -37% | 1 | 1 | 0% | 795 | 2,173 | +173% | 0 | 0 | — |
case-08 | fail→pass | 5,373 | 5,654 | +5% | 1 | 1 | 0% | 1,057 | 2,766 | +162% | 0 | 0 | — |
case-09 | pass→pass | 9,631 | 7,129 | -26% | 1 | 1 | 0% | 1,786 | 2,973 | +66% | 0 | 0 | — |
case-10 | fail→pass | 16,351 | 15,329 | -6% | 1 | 1 | 0% | 3,465 | 5,224 | +51% | 0 | 0 | — |
case-11 | pass→pass | 5,357 | 2,383 | -56% | 1 | 1 | 0% | 866 | 1,796 | +107% | 0 | 0 | — |
case-12 | pass→pass | 12,069 | 9,073 | -25% | 1 | 1 | 0% | 1,969 | 3,192 | +62% | 0 | 0 | — |
case-13 | pass→pass | 6,645 | 6,518 | -2% | 1 | 1 | 0% | 1,080 | 2,618 | +142% | 0 | 0 | — |
case-14 | pass→pass | 8,601 | 5,715 | -34% | 1 | 1 | 0% | 1,371 | 2,591 | +89% | 0 | 0 | — |
case-15 | pass→pass | 6,254 | 4,022 | -36% | 1 | 1 | 0% | 1,075 | 2,287 | +113% | 0 | 0 | — |
case-16 | pass→pass | 7,181 | 3,975 | -45% | 1 | 1 | 0% | 1,323 | 2,391 | +81% | 0 | 0 | — |
case-17 | pass→pass | 9,568 | 6,785 | -29% | 1 | 1 | 0% | 1,653 | 2,835 | +72% | 0 | 0 | — |
case-18 | pass→pass | 6,303 | 4,171 | -34% | 1 | 1 | 0% | 1,026 | 2,462 | +140% | 0 | 0 | — |
case-19 | pass→pass | 9,517 | 5,807 | -39% | 1 | 1 | 0% | 2,055 | 2,859 | +39% | 0 | 0 | — |
case-20 | pass→pass | 13,556 | 10,528 | -22% | 1 | 1 | 0% | 2,604 | 3,705 | +42% | 0 | 0 | — |
case-21 | pass→pass | 10,648 | 8,462 | -21% | 1 | 1 | 0% | 2,357 | 3,543 | +50% | 0 | 0 | — |
case-22 | pass→pass | 14,580 | 13,605 | -7% | 1 | 1 | 0% | 2,826 | 4,327 | +53% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.