Source profileQuality 75/100

affaan-m/ECC/docs/zh-CN/skills/x-api/SKILL.md

x-api

Use it for engineering tasks; the detail page covers purpose, installation, and practical steps.

Source repository stars
234,327
Declared platforms
0
Static risk flags
1
Last source update
2026-07-27
Source checked
2026-07-28

Decision brief

What it does—and where it fits

以编程方式与 X(Twitter)交互,用于发布、读取、搜索和分析。

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/affaan-m/ECC --skill "docs/zh-CN/skills/x-api"
    Safe inspection promptEditorial

    Inspect the Agent Skill "x-api" from https://github.com/affaan-m/ECC/blob/4e973d3eaf92d97f8d2e2d8abb39d8bdc8711b38/docs/zh-CN/skills/x-api/SKILL.md at commit 4e973d3eaf92d97f8d2e2d8abb39d8bdc8711b38. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Environment setup

      export XBEARERTOKEN="your-bearer-token" python import os import requests

      export XBEARERTOKEN="your-bearer-token" python import os import requestsbearer = os.environ["XBEARERTOKEN"] headers = {"Authorization": f"Bearer {bearer}"}
    2. 02

      Environment setup — source before use

      export XAPIKEY="your-api-key" export XAPISECRET="your-api-secret" export XACCESSTOKEN="your-access-token" export XACCESSSECRET="your-access-secret" python import os from requestsoauthlib import OAuth1Session

      export XAPIKEY="your-api-key" export XAPISECRET="your-api-secret" export XACCESSTOKEN="your-access-token" export XACCESSSECRET="your-access-secret" python import os from requestsoauthlib import OAuth1Sessionoauth = OAuth1Session( os.environ["XAPIKEY"], clientsecret=os.environ["XAPISECRET"], resourceownerkey=os.environ["XACCESSTOKEN"], resourceownersecret=os.environ["XACCESSSECRET"], ) python resp = oauth.post( "https://api…
    3. 03

      Step 1: Upload media

      mediaresp = oauth.post( "https://upload.twitter.com/1.1/media/upload.json", files={"media": open("image.png", "rb")} ) mediaid = mediaresp.json()["mediaidstring"]

      mediaresp = oauth.post( "https://upload.twitter.com/1.1/media/upload.json", files={"media": open("image.png", "rb")} ) mediaid = mediaresp.json()["mediaidstring"]
    4. 04

      Step 2: Post with media

      resp = oauth.post( "https://api.x.com/2/tweets", json={"text": "Check this out", "media": {"mediaids": [mediaid]}} ) python import time

      切勿硬编码令牌。 使用环境变量或 .env 文件。切勿提交 .env 文件。 将其添加到 .gitignore。如果令牌暴露,请轮换令牌。 在 developer.x.com 重新生成。

    Permission review

    Static risk signals and limitations

    Network access

    medium · line 33

    The documentation includes network, browsing, or remote request actions.

    resp = requests.get(

    Network access

    medium · line 34

    The documentation includes network, browsing, or remote request actions.

    "https://api.x.com/2/tweets/search/recent",

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score75/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars234,327SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    affaan-m/ECC
    Skill path
    docs/zh-CN/skills/x-api/SKILL.md
    Commit
    4e973d3eaf92d97f8d2e2d8abb39d8bdc8711b38
    License
    MIT
    Collected
    2026-07-28
    Default branch
    main
    View the original SKILL.md

    X API

    以编程方式与 X(Twitter)交互,用于发布、读取、搜索和分析。

    何时激活

    • 用户希望以编程方式发布推文或帖子串
    • 从 X 读取时间线、提及或用户数据
    • 在 X 上搜索内容、趋势或对话
    • 构建 X 集成或机器人
    • 分析和参与度跟踪
    • 用户提及"发布到 X"、"发推"、"X API"或"Twitter API"

    认证

    OAuth 2.0 Bearer 令牌(仅应用)

    最佳适用场景:读取密集型操作、搜索、公开数据。

    # Environment setup
    export X_BEARER_TOKEN="your-bearer-token"
    
    import 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()
    

    OAuth 1.0a(用户上下文)

    必需用于:发布推文、管理账户、私信。

    # 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"
    
    import 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"],
    )
    

    核心操作

    发布一条推文

    resp = oauth.post(
        "https://api.x.com/2/tweets",
        json={"text": "Hello from Claude Code"}
    )
    resp.raise_for_status()
    tweet_id = resp.json()["data"]["id"]
    

    发布一个帖子串

    def 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
    

    读取用户时间线

    resp = requests.get(
        f"https://api.x.com/2/users/{user_id}/tweets",
        headers=headers,
        params={
            "max_results": 10,
            "tweet.fields": "created_at,public_metrics",
        }
    )
    

    搜索推文

    resp = 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",
        }
    )
    

    通过用户名获取用户

    resp = requests.get(
        "https://api.x.com/2/users/by/username/affaanmustafa",
        headers=headers,
        params={"user.fields": "public_metrics,description,created_at"}
    )
    

    上传媒体并发布

    # 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 开发者文档
    • 在运行时读取 x-rate-limit-remainingx-rate-limit-reset 头部信息
    • 自动退避,而不是依赖代码中的静态表格
    import 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")
    

    错误处理

    resp = 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
    • 如果令牌暴露,请轮换令牌。 在 developer.x.com 重新生成。
    • 当不需要写权限时,使用只读令牌。
    • 安全存储 OAuth 密钥 — 不要存储在源代码或日志中。

    与内容引擎集成

    使用 content-engine 技能生成平台原生内容,然后通过 X API 发布:

    1. 使用内容引擎生成内容(X 平台格式)
    2. 验证长度(单条推文 280 字符)
    3. 使用上述模式通过 X API 发布
    4. 通过 public_metrics 跟踪参与度

    相关技能

    • content-engine — 为 X 生成平台原生内容
    • crosspost — 在 X、LinkedIn 和其他平台分发内容

    Alternatives

    Compare before choosing