Source profileQuality 75/100

affaan-m/ECC/docs/ja-JP/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/ja-JP/skills/x-api"
    Safe inspection promptEditorial

    Inspect the Agent Skill "x-api" from https://github.com/affaan-m/ECC/blob/4e973d3eaf92d97f8d2e2d8abb39d8bdc8711b38/docs/ja-JP/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/ja-JP/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(ユーザーコンテキスト)

    以下に必要:ツイートの投稿、アカウント管理、DM。

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

    コア操作

    ツイートを1件投稿する

    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. 長さを検証する(ツイート1件あたり280文字)
    3. 上記のパターンを使用してX API経由で投稿する
    4. public_metricsでエンゲージメントを追跡する

    関連スキル

    • content-engine — X向けのプラットフォームネイティブコンテンツを生成する
    • crosspost — X、LinkedIn、その他のプラットフォームでコンテンツを配信する

    Alternatives

    Compare before choosing