{
  "schemaVersion": "1.0",
  "item": {
    "slug": "twitter-post",
    "name": "Twitter Post",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/sit-in/twitter-post",
    "canonicalUrl": "https://clawhub.ai/sit-in/twitter-post",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/twitter-post",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=twitter-post",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/tweet.js"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/twitter-post"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/twitter-post",
    "agentPageUrl": "https://openagent3.xyz/skills/twitter-post/agent",
    "manifestUrl": "https://openagent3.xyz/skills/twitter-post/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/twitter-post/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Twitter Post",
        "body": "Post tweets via the official Twitter/X API v2 using OAuth 1.0a authentication."
      },
      {
        "title": "Prerequisites",
        "body": "Four environment variables must be set. Obtain them from developer.x.com:\n\nTWITTER_CONSUMER_KEY=<API Key>\nTWITTER_CONSUMER_SECRET=<API Key Secret>\nTWITTER_ACCESS_TOKEN=<Access Token>\nTWITTER_ACCESS_TOKEN_SECRET=<Access Token Secret>\n\nOptional:\n\nHTTPS_PROXY — HTTP proxy URL (e.g. http://127.0.0.1:7897) for regions that need it\nTWITTER_DRY_RUN=1 — validate and print without posting"
      },
      {
        "title": "Setup",
        "body": "Store credentials as env vars. Recommended: add to the OpenClaw instance config or export in shell profile. Never hardcode keys in SKILL.md or scripts.\n\nIf the user hasn't set up OAuth yet, guide them:\n\nGo to developer.x.com → Dashboard → Create App\nSet App permissions to Read and Write\nGo to Keys and tokens tab\nCopy API Key, API Key Secret\nGenerate Access Token and Access Token Secret (ensure Read+Write scope)\nIf the portal only shows Read, use PIN-based OAuth flow:\n\nCall POST /oauth/request_token with oauth_callback=oob\nUser opens https://api.twitter.com/oauth/authorize?oauth_token=<token>\nUser provides the PIN code\nCall POST /oauth/access_token with the PIN as oauth_verifier"
      },
      {
        "title": "Usage",
        "body": "All commands via exec. Script path: scripts/tweet.js (relative to this skill directory)."
      },
      {
        "title": "Single tweet",
        "body": "node scripts/tweet.js \"Your tweet content here\""
      },
      {
        "title": "Reply to a tweet",
        "body": "node scripts/tweet.js --reply-to 1234567890 \"Reply text\""
      },
      {
        "title": "Quote tweet",
        "body": "node scripts/tweet.js --quote 1234567890 \"Your commentary\""
      },
      {
        "title": "Thread (multiple tweets)",
        "body": "node scripts/tweet.js --thread \"First tweet\" \"Second tweet\" \"Third tweet\""
      },
      {
        "title": "Output",
        "body": "JSON to stdout:\n\n{\"ok\":true,\"id\":\"123456789\",\"url\":\"https://x.com/i/status/123456789\",\"remaining\":\"99\",\"limit\":\"100\"}\n\nOn error: {\"ok\":false,\"error\":\"...\"}"
      },
      {
        "title": "Character Limits",
        "body": "Max 280 weighted characters per tweet\nCJK characters (Chinese/Japanese/Korean) count as 2 each\nURLs count as 23 each regardless of length\nScript auto-validates before posting; rejects if over limit"
      },
      {
        "title": "Rate Limits",
        "body": "100 tweets / 15 min per user (OAuth 1.0a)\n3,000 tweets / month on Basic plan ($200/mo)\nCheck remaining field in output to monitor quota"
      },
      {
        "title": "Tips",
        "body": "For content from Notion/database: fetch the text first, then pipe to tweet.js\nFor cron-based auto-posting: use exec with env vars set, parse JSON output to confirm success\nThread mode posts sequentially; each tweet auto-replies to the previous one\nCombine --thread with --reply-to to attach a thread under an existing tweet"
      }
    ],
    "body": "Twitter Post\n\nPost tweets via the official Twitter/X API v2 using OAuth 1.0a authentication.\n\nPrerequisites\n\nFour environment variables must be set. Obtain them from developer.x.com:\n\nTWITTER_CONSUMER_KEY=<API Key>\nTWITTER_CONSUMER_SECRET=<API Key Secret>\nTWITTER_ACCESS_TOKEN=<Access Token>\nTWITTER_ACCESS_TOKEN_SECRET=<Access Token Secret>\n\n\nOptional:\n\nHTTPS_PROXY — HTTP proxy URL (e.g. http://127.0.0.1:7897) for regions that need it\nTWITTER_DRY_RUN=1 — validate and print without posting\nSetup\n\nStore credentials as env vars. Recommended: add to the OpenClaw instance config or export in shell profile. Never hardcode keys in SKILL.md or scripts.\n\nIf the user hasn't set up OAuth yet, guide them:\n\nGo to developer.x.com → Dashboard → Create App\nSet App permissions to Read and Write\nGo to Keys and tokens tab\nCopy API Key, API Key Secret\nGenerate Access Token and Access Token Secret (ensure Read+Write scope)\nIf the portal only shows Read, use PIN-based OAuth flow:\nCall POST /oauth/request_token with oauth_callback=oob\nUser opens https://api.twitter.com/oauth/authorize?oauth_token=<token>\nUser provides the PIN code\nCall POST /oauth/access_token with the PIN as oauth_verifier\nUsage\n\nAll commands via exec. Script path: scripts/tweet.js (relative to this skill directory).\n\nSingle tweet\nnode scripts/tweet.js \"Your tweet content here\"\n\nReply to a tweet\nnode scripts/tweet.js --reply-to 1234567890 \"Reply text\"\n\nQuote tweet\nnode scripts/tweet.js --quote 1234567890 \"Your commentary\"\n\nThread (multiple tweets)\nnode scripts/tweet.js --thread \"First tweet\" \"Second tweet\" \"Third tweet\"\n\nOutput\n\nJSON to stdout:\n\n{\"ok\":true,\"id\":\"123456789\",\"url\":\"https://x.com/i/status/123456789\",\"remaining\":\"99\",\"limit\":\"100\"}\n\n\nOn error: {\"ok\":false,\"error\":\"...\"}\n\nCharacter Limits\nMax 280 weighted characters per tweet\nCJK characters (Chinese/Japanese/Korean) count as 2 each\nURLs count as 23 each regardless of length\nScript auto-validates before posting; rejects if over limit\nRate Limits\n100 tweets / 15 min per user (OAuth 1.0a)\n3,000 tweets / month on Basic plan ($200/mo)\nCheck remaining field in output to monitor quota\nTips\nFor content from Notion/database: fetch the text first, then pipe to tweet.js\nFor cron-based auto-posting: use exec with env vars set, parse JSON output to confirm success\nThread mode posts sequentially; each tweet auto-replies to the previous one\nCombine --thread with --reply-to to attach a thread under an existing tweet"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/sit-in/twitter-post",
    "publisherUrl": "https://clawhub.ai/sit-in/twitter-post",
    "owner": "sit-in",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/twitter-post",
    "downloadUrl": "https://openagent3.xyz/downloads/twitter-post",
    "agentUrl": "https://openagent3.xyz/skills/twitter-post/agent",
    "manifestUrl": "https://openagent3.xyz/skills/twitter-post/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/twitter-post/agent.md"
  }
}