{
  "schemaVersion": "1.0",
  "item": {
    "slug": "openclaw-social-post",
    "name": "OpenClaw Social Post",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/teeclaw/openclaw-social-post",
    "canonicalUrl": "https://clawhub.ai/teeclaw/openclaw-social-post",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/openclaw-social-post",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=openclaw-social-post",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "CHANGELOG.md",
      "README.md",
      "SKILL.md",
      "lib/farcaster.sh",
      "lib/links.sh",
      "lib/threads.sh"
    ],
    "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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-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/openclaw-social-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/openclaw-social-post",
    "agentPageUrl": "https://openagent3.xyz/skills/openclaw-social-post/agent",
    "manifestUrl": "https://openagent3.xyz/skills/openclaw-social-post/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/openclaw-social-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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Social Post",
        "body": "Post to Twitter and/or Farcaster with automatic character limit validation and image upload handling.\n\nRepository: github.com/teeclaw/social-post"
      },
      {
        "title": "Features",
        "body": "✅ Dynamic Twitter tier detection - auto-detects Basic vs Premium accounts (cached 24h)\n✅ Multi-account support - manage multiple Twitter accounts from one skill\n✅ Auto-variation - avoid Twitter's duplicate content detection with --vary flag\n✅ Premium account support - post up to 25k characters in single tweet\n✅ Interactive threading choice - Premium users can choose single post or thread\n✅ Post to Twitter only\n✅ Post to Farcaster only\n✅ Post to both platforms simultaneously\n✅ Reply to tweets and casts - respond to specific posts on both platforms\n✅ Draft preview - shows exactly what will be posted before confirmation\n✅ Character/byte limit validation (dynamic per account tier)\n✅ Image upload support (for posts and replies)\n✅ Thread support - automatically split long text into numbered posts\n✅ Link shortening - compress URLs using TinyURL (saves characters)\n✅ Auto-truncate on overflow (optional)"
      },
      {
        "title": "Dynamic Twitter Limits (Auto-Detected)",
        "body": "The skill automatically detects your Twitter account tier and adjusts character limits:\n\nBasic/Free accounts: 252 characters (280 with 10% safety buffer)\nPremium/Premium+ accounts: 22,500 characters (25,000 with 10% safety buffer)"
      },
      {
        "title": "Farcaster Limits",
        "body": "288 bytes (320 with 10% safety buffer)"
      },
      {
        "title": "How Tier Detection Works",
        "body": "First Use: On your first post, the skill calls Twitter API to detect your subscription tier\nCaching: Tier is cached for 24 hours to minimize API calls\nAuto-Refresh: Cache expires after 24 hours, then re-checks on next post\nManual Refresh: Use --refresh-tier flag to force immediate re-check\n\nPremium Posting Behavior:\n\nWhen posting with a Premium account:\n\nText ≤ 280 chars → posts normally (single tweet)\nText > 280 but ≤ 22,500 chars → shows draft as single long post first\n\nPrompts: \"Thread this instead? (y/n)\"\nIf YES → splits into threaded posts for review\nIf NO → posts as single long tweet\n\n\nText > 22,500 chars → auto-threads (exceeds Premium limit)\n\nForce Threading:\n\nUse --thread flag to skip prompt and force threading\nUse --auto-confirm to skip all prompts (uses best format automatically)"
      },
      {
        "title": "X/Twitter Setup",
        "body": "Required credentials (stored in /home/phan_harry/.openclaw/.env):\n\nX_CONSUMER_KEY=your_consumer_key\nX_CONSUMER_SECRET=your_consumer_secret\nX_ACCESS_TOKEN=your_access_token\nX_ACCESS_TOKEN_SECRET=your_access_token_secret\nX_USERNAME=your_username\nX_USER_ID=your_user_id\n\nHow to get credentials:\n\nApply for X Developer Account\n\nGo to https://developer.twitter.com/en/portal/dashboard\nApply for Developer Access\nWait for approval (usually 1-2 days)\n\n\n\nEnable Consumption-Based Billing\n\nSet up payment method (credit card) in Developer Portal\nNo subscription tiers - you pay only for actual API usage\nCharged per API request (posts, reads, etc.)\nNo monthly minimums or fees\n\n\n\nCreate an App\n\nIn Developer Portal, create a new App\nName: \"Social Post Bot\" (or any name)\nSet permissions to \"Read and Write\"\n\n\n\nGenerate Keys\n\nConsumer Key & Secret: In \"Keys and tokens\" tab\nAccess Token & Secret: Click \"Generate\" under \"Authentication Tokens\"\nSave all 4 credentials securely\n\n\n\nAdd to .env file\necho \"X_CONSUMER_KEY=xxx\" >> ~/.openclaw/.env\necho \"X_CONSUMER_SECRET=xxx\" >> ~/.openclaw/.env\necho \"X_ACCESS_TOKEN=xxx\" >> ~/.openclaw/.env\necho \"X_ACCESS_TOKEN_SECRET=xxx\" >> ~/.openclaw/.env\n\nTest your credentials:\n\n# Dry run (won't post)\nscripts/post.sh --twitter --dry-run \"Test message\""
      },
      {
        "title": "Multi-Account Setup (Optional)",
        "body": "You can manage multiple Twitter accounts by adding additional credentials with custom prefixes.\n\nExample: Adding a second account\n\n# Add credentials with custom prefix (e.g., MYACCOUNT_)\necho \"MYACCOUNT_API_KEY=xxx\" >> ~/.openclaw/.env\necho \"MYACCOUNT_API_KEY_SECRET=xxx\" >> ~/.openclaw/.env\necho \"MYACCOUNT_ACCESS_TOKEN=xxx\" >> ~/.openclaw/.env\necho \"MYACCOUNT_ACCESS_TOKEN_SECRET=xxx\" >> ~/.openclaw/.env\n\nUsage:\n\n# Post from default account (X_*)\nscripts/post.sh --twitter \"Message from default account\"\n\n# Post from custom account\nscripts/post.sh --account myaccount --twitter \"Message from second account\"\n\n# Reply from custom account\nscripts/reply.sh --account myaccount --twitter TWEET_ID \"Reply from second account\"\n\nNaming convention:\n\nDefault account: X_CONSUMER_KEY, X_CONSUMER_SECRET, etc.\nCustom accounts: {PREFIX}_API_KEY, {PREFIX}_API_KEY_SECRET, {PREFIX}_ACCESS_TOKEN, {PREFIX}_ACCESS_TOKEN_SECRET\nUse lowercase prefix name in --account flag"
      },
      {
        "title": "Farcaster Setup",
        "body": "Required credentials (stored in /home/phan_harry/.openclaw/farcaster-credentials.json):\n\n{\n  \"fid\": \"your_farcaster_id\",\n  \"custodyAddress\": \"0x...\",\n  \"custodyPrivateKey\": \"0x...\",\n  \"signerPublicKey\": \"0x...\",\n  \"signerPrivateKey\": \"0x...\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}\n\nHow to get credentials:\n\nUse farcaster-agent skill to create account\n# This will guide you through:\n# - Creating a wallet\n# - Registering FID\n# - Adding signer key\n# - Automatically saving credentials\n\n# See: /skills/farcaster-agent/SKILL.md\n\n\n\nOr use existing credentials\n\nIf you already have a Farcaster account\nExport your custody wallet private key\nExport your signer private key\nManually create the JSON file\n\n\n\nFund the custody wallet (REQUIRED)\n# Check current balance\nscripts/check-balance.sh\n\n# Send USDC to custody address on Base chain\n# Minimum: 0.1 USDC (~100 casts)\n# Recommended: 1-5 USDC (1000-5000 casts)\n\n\n\nVerify setup\n# Check credentials exist\nls -la ~/.openclaw/farcaster-credentials.json\n\n# Check wallet balance\nscripts/check-balance.sh\n\n# Test posting (dry run)\nscripts/post.sh --farcaster --dry-run \"Test message\"\n\nSecurity Notes:\n\n⚠️ Never share your private keys\n⚠️ Credentials are stored as plain text - secure your system\n⚠️ .env file should have 600 permissions (read/write owner only)\n⚠️ Back up your credentials securely"
      },
      {
        "title": "Posting",
        "body": "Text only\n\n# Post to both platforms\nscripts/post.sh \"Your message here\"\n\n# Twitter only\nscripts/post.sh --twitter \"Your message\"\n\n# Farcaster only\nscripts/post.sh --farcaster \"Your message\"\n\nWith image\n\n# Post to both platforms with image\nscripts/post.sh --image /path/to/image.jpg \"Your caption\"\n\n# Twitter only with image\nscripts/post.sh --twitter --image /path/to/image.jpg \"Caption\"\n\n# Farcaster only with image\nscripts/post.sh --farcaster --image /path/to/image.jpg \"Caption\""
      },
      {
        "title": "Replying",
        "body": "Reply to Twitter\n\n# Reply to a tweet\nscripts/reply.sh --twitter TWEET_ID \"Your reply\"\n\n# Reply with image\nscripts/reply.sh --twitter TWEET_ID --image /path/to/image.jpg \"Reply with image\"\n\n# Get tweet ID from URL: twitter.com/user/status/[TWEET_ID]\nscripts/reply.sh --twitter 1234567890123456789 \"Great point!\"\n\nReply to Farcaster\n\n# Reply to a cast\nscripts/reply.sh --farcaster CAST_HASH \"Your reply\"\n\n# Reply with image\nscripts/reply.sh --farcaster 0xabcd1234... --image /path/to/image.jpg \"Reply with image\"\n\n# Get cast hash from URL: farcaster.xyz/~/conversations/[HASH]\nscripts/reply.sh --farcaster 0xa1b2c3d4e5f6... \"Interesting perspective!\"\n\nReply to both platforms\n\n# Reply to both (if you have corresponding IDs on both platforms)\nscripts/reply.sh --twitter 123456 --farcaster 0xabcd... \"Great discussion!\""
      },
      {
        "title": "Options",
        "body": "For post.sh (posting)\n\n--twitter - Post to Twitter only\n--farcaster - Post to Farcaster only\n--account <name> - Twitter account to use (lowercase prefix from .env)\n--vary - Auto-vary text to avoid duplicate content detection\n--image <path> - Attach image\n--thread - Force thread mode (split into multiple posts)\n--refresh-tier - Force refresh Twitter account tier cache (Basic vs Premium)\n--shorten-links - Shorten URLs to save characters\n--truncate - Auto-truncate if over limit\n--dry-run - Preview without posting\n-y, --yes - Skip ALL confirmation prompts (auto-confirm, no threading prompt)\n\nFor reply.sh (replying)\n\n--twitter <tweet_id> - Reply to Twitter tweet with this ID\n--farcaster <cast_hash> - Reply to Farcaster cast with this hash\n--account <name> - Twitter account to use (lowercase prefix from .env)\n--image <path> - Attach image to reply\n--shorten-links - Shorten URLs to save characters\n--truncate - Auto-truncate if over limit\n--dry-run - Preview without replying\n-y, --yes - Skip confirmation prompt (auto-confirm)"
      },
      {
        "title": "Posting Examples",
        "body": "# Quick post to both (default account)\nscripts/post.sh \"gm! Building onchain 🦞\"\n\n# Post from specific Twitter account\nscripts/post.sh --account myaccount --twitter \"Message from my second account\"\n\n# Auto-vary text to avoid duplicate content detection\nscripts/post.sh --vary --twitter \"Same text, subtle variations added automatically\"\n\n# Premium account - post long text (interactive choice for threading)\nscripts/post.sh --twitter \"Very long text that exceeds 280 characters but is under 25k... \n(The skill will detect Premium tier and ask: 'Thread this instead? (y/n)')\"\n\n# Premium account - force threading (skip prompt)\nscripts/post.sh --twitter --thread \"Long text that will be split into thread regardless of Premium status\"\n\n# Premium account - force single long post (skip prompt)\nscripts/post.sh --twitter --auto-confirm \"Long text that will post as single tweet on Premium account\"\n\n# Refresh account tier cache (if you just upgraded to Premium)\nscripts/post.sh --refresh-tier --twitter \"First post after upgrading to Premium\"\n\n# Twitter announcement with image\nscripts/post.sh --twitter --image ~/screenshot.png \"New feature shipped! 🚀\"\n\n# Farcaster only\nscripts/post.sh --farcaster \"Just published credential-manager to ClawHub!\"\n\n# Long text as thread (auto-numbered)\nscripts/post.sh --thread \"This is a very long announcement that exceeds the character limit. It will be automatically split into multiple numbered posts. Each part will be posted sequentially to create a thread. (1/3), (2/3), (3/3)\"\n\n# Shorten URLs to save characters\nscripts/post.sh --shorten-links \"Check out this amazing project: https://github.com/very-long-organization-name/very-long-repository-name\"\n\n# Combine thread + link shortening\nscripts/post.sh --thread --shorten-links \"Long text with multiple links that will be shortened and split into a thread if needed\"\n\n# Both platforms, auto-truncate long text\nscripts/post.sh --truncate \"Very long message that might exceed limits...\"\n\n# Preview without confirmation (for automated workflows)\nscripts/post.sh --yes \"Automated post from CI/CD\""
      },
      {
        "title": "Reply Examples",
        "body": "# Reply to a Twitter thread\nscripts/reply.sh --twitter 1234567890123456789 \"Totally agree with this take! 💯\"\n\n# Reply from specific Twitter account\nscripts/reply.sh --account myaccount --twitter 1234567890 \"Replying from my second account\"\n\n# Reply to Farcaster cast\nscripts/reply.sh --farcaster 0xa1b2c3d4e5f6... \"Great insight! Have you considered...?\"\n\n# Reply with shortened links\nscripts/reply.sh --twitter 123456 --shorten-links \"Here's more info: https://example.com/very-long-article-url\"\n\n# Reply with image\nscripts/reply.sh --twitter 123456 --image ~/chart.png \"Here's the data to support this\"\n\n# Reply to both platforms (same message)\nscripts/reply.sh --twitter 123456 --farcaster 0xabc123 \"This is exactly right 🎯\"\n\n# Quick reply without confirmation\nscripts/reply.sh --twitter 123456 --yes \"Quick acknowledgment\"\n\n# Dry run to preview reply\nscripts/reply.sh --twitter 123456 --dry-run \"Test reply preview\""
      },
      {
        "title": "Draft Preview",
        "body": "The script now shows a draft preview before posting:\n\n=== Draft Preview ===\n\nText to post:\n─────────────────────────────────────────────\nYour message here\n─────────────────────────────────────────────\n\nTargets:\n  • Twitter\n  • Farcaster\n\nProceed with posting? (y/n):\n\nInteractive mode: Prompts for confirmation\nNon-interactive/automated: Use --yes flag to skip prompt\nDry run: Use --dry-run to preview without any posting"
      },
      {
        "title": "Requirements",
        "body": "Twitter credentials in .env (X_CONSUMER_KEY, X_CONSUMER_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET)\nFarcaster credentials in /home/phan_harry/.openclaw/farcaster-credentials.json\nUSDC on Base chain (custody wallet): 0.001 USDC per Farcaster cast\nFor images: curl, jq"
      },
      {
        "title": "X/Twitter",
        "body": "100% Consumption-based - NO subscription tiers (tiers have been eliminated)\nPay per API request - charged for each call (post, read, etc.)\nNo monthly fees, no minimums, no tier upgrades to worry about\nAutomatic billing based on actual usage\nPayment via credit card through X Developer portal\nUses OAuth 1.0a (no blockchain/USDC required)\nRequires approved X Developer account + enabled billing\n\nOfficial pricing: https://developer.twitter.com/#pricing\n\nCritical: X API completely eliminated subscription tiers (Basic, Pro, etc.). The model is now purely pay-per-use - you are charged only for the API requests you actually make."
      },
      {
        "title": "Farcaster",
        "body": "Each Farcaster cast costs 0.001 USDC (paid via x402 protocol):\n\nDeducted from custody wallet on Base chain\nSent to Neynar Hub: 0xA6a8736f18f383f1cc2d938576933E5eA7Df01A1\n~$1 USDC = 1000 casts\n\nCheck balance:\n\n# Quick check\nscripts/check-balance.sh\n\n# Manual check\njq -r '.custodyAddress' ~/.openclaw/farcaster-credentials.json\n# View on basescan.org\n\nFund wallet:\nSend USDC to custody address on Base chain. Bridge from other chains if needed."
      },
      {
        "title": "Image Hosting",
        "body": "Twitter: Direct upload via Twitter API\nFarcaster: Uploads to imgur for public URL (embeds automatically)"
      },
      {
        "title": "Error Handling",
        "body": "Shows character/byte count before posting\nWarns if exceeding limits\nOption to truncate or abort\nValidates credentials before attempting post"
      }
    ],
    "body": "Social Post\n\nPost to Twitter and/or Farcaster with automatic character limit validation and image upload handling.\n\nRepository: github.com/teeclaw/social-post\n\nFeatures\n✅ Dynamic Twitter tier detection - auto-detects Basic vs Premium accounts (cached 24h)\n✅ Multi-account support - manage multiple Twitter accounts from one skill\n✅ Auto-variation - avoid Twitter's duplicate content detection with --vary flag\n✅ Premium account support - post up to 25k characters in single tweet\n✅ Interactive threading choice - Premium users can choose single post or thread\n✅ Post to Twitter only\n✅ Post to Farcaster only\n✅ Post to both platforms simultaneously\n✅ Reply to tweets and casts - respond to specific posts on both platforms\n✅ Draft preview - shows exactly what will be posted before confirmation\n✅ Character/byte limit validation (dynamic per account tier)\n✅ Image upload support (for posts and replies)\n✅ Thread support - automatically split long text into numbered posts\n✅ Link shortening - compress URLs using TinyURL (saves characters)\n✅ Auto-truncate on overflow (optional)\nPlatform Limits\nDynamic Twitter Limits (Auto-Detected)\n\nThe skill automatically detects your Twitter account tier and adjusts character limits:\n\nBasic/Free accounts: 252 characters (280 with 10% safety buffer)\nPremium/Premium+ accounts: 22,500 characters (25,000 with 10% safety buffer)\nFarcaster Limits\n288 bytes (320 with 10% safety buffer)\nHow Tier Detection Works\nFirst Use: On your first post, the skill calls Twitter API to detect your subscription tier\nCaching: Tier is cached for 24 hours to minimize API calls\nAuto-Refresh: Cache expires after 24 hours, then re-checks on next post\nManual Refresh: Use --refresh-tier flag to force immediate re-check\n\nPremium Posting Behavior:\n\nWhen posting with a Premium account:\n\nText ≤ 280 chars → posts normally (single tweet)\nText > 280 but ≤ 22,500 chars → shows draft as single long post first\nPrompts: \"Thread this instead? (y/n)\"\nIf YES → splits into threaded posts for review\nIf NO → posts as single long tweet\nText > 22,500 chars → auto-threads (exceeds Premium limit)\n\nForce Threading:\n\nUse --thread flag to skip prompt and force threading\nUse --auto-confirm to skip all prompts (uses best format automatically)\nSetup & Credentials\nX/Twitter Setup\n\nRequired credentials (stored in /home/phan_harry/.openclaw/.env):\n\nX_CONSUMER_KEY=your_consumer_key\nX_CONSUMER_SECRET=your_consumer_secret\nX_ACCESS_TOKEN=your_access_token\nX_ACCESS_TOKEN_SECRET=your_access_token_secret\nX_USERNAME=your_username\nX_USER_ID=your_user_id\n\n\nHow to get credentials:\n\nApply for X Developer Account\n\nGo to https://developer.twitter.com/en/portal/dashboard\nApply for Developer Access\nWait for approval (usually 1-2 days)\n\nEnable Consumption-Based Billing\n\nSet up payment method (credit card) in Developer Portal\nNo subscription tiers - you pay only for actual API usage\nCharged per API request (posts, reads, etc.)\nNo monthly minimums or fees\n\nCreate an App\n\nIn Developer Portal, create a new App\nName: \"Social Post Bot\" (or any name)\nSet permissions to \"Read and Write\"\n\nGenerate Keys\n\nConsumer Key & Secret: In \"Keys and tokens\" tab\nAccess Token & Secret: Click \"Generate\" under \"Authentication Tokens\"\nSave all 4 credentials securely\n\nAdd to .env file\n\necho \"X_CONSUMER_KEY=xxx\" >> ~/.openclaw/.env\necho \"X_CONSUMER_SECRET=xxx\" >> ~/.openclaw/.env\necho \"X_ACCESS_TOKEN=xxx\" >> ~/.openclaw/.env\necho \"X_ACCESS_TOKEN_SECRET=xxx\" >> ~/.openclaw/.env\n\n\nTest your credentials:\n\n# Dry run (won't post)\nscripts/post.sh --twitter --dry-run \"Test message\"\n\nMulti-Account Setup (Optional)\n\nYou can manage multiple Twitter accounts by adding additional credentials with custom prefixes.\n\nExample: Adding a second account\n\n# Add credentials with custom prefix (e.g., MYACCOUNT_)\necho \"MYACCOUNT_API_KEY=xxx\" >> ~/.openclaw/.env\necho \"MYACCOUNT_API_KEY_SECRET=xxx\" >> ~/.openclaw/.env\necho \"MYACCOUNT_ACCESS_TOKEN=xxx\" >> ~/.openclaw/.env\necho \"MYACCOUNT_ACCESS_TOKEN_SECRET=xxx\" >> ~/.openclaw/.env\n\n\nUsage:\n\n# Post from default account (X_*)\nscripts/post.sh --twitter \"Message from default account\"\n\n# Post from custom account\nscripts/post.sh --account myaccount --twitter \"Message from second account\"\n\n# Reply from custom account\nscripts/reply.sh --account myaccount --twitter TWEET_ID \"Reply from second account\"\n\n\nNaming convention:\n\nDefault account: X_CONSUMER_KEY, X_CONSUMER_SECRET, etc.\nCustom accounts: {PREFIX}_API_KEY, {PREFIX}_API_KEY_SECRET, {PREFIX}_ACCESS_TOKEN, {PREFIX}_ACCESS_TOKEN_SECRET\nUse lowercase prefix name in --account flag\nFarcaster Setup\n\nRequired credentials (stored in /home/phan_harry/.openclaw/farcaster-credentials.json):\n\n{\n  \"fid\": \"your_farcaster_id\",\n  \"custodyAddress\": \"0x...\",\n  \"custodyPrivateKey\": \"0x...\",\n  \"signerPublicKey\": \"0x...\",\n  \"signerPrivateKey\": \"0x...\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}\n\n\nHow to get credentials:\n\nUse farcaster-agent skill to create account\n\n# This will guide you through:\n# - Creating a wallet\n# - Registering FID\n# - Adding signer key\n# - Automatically saving credentials\n\n# See: /skills/farcaster-agent/SKILL.md\n\n\nOr use existing credentials\n\nIf you already have a Farcaster account\nExport your custody wallet private key\nExport your signer private key\nManually create the JSON file\n\nFund the custody wallet (REQUIRED)\n\n# Check current balance\nscripts/check-balance.sh\n\n# Send USDC to custody address on Base chain\n# Minimum: 0.1 USDC (~100 casts)\n# Recommended: 1-5 USDC (1000-5000 casts)\n\n\nVerify setup\n\n# Check credentials exist\nls -la ~/.openclaw/farcaster-credentials.json\n\n# Check wallet balance\nscripts/check-balance.sh\n\n# Test posting (dry run)\nscripts/post.sh --farcaster --dry-run \"Test message\"\n\n\nSecurity Notes:\n\n⚠️ Never share your private keys\n⚠️ Credentials are stored as plain text - secure your system\n⚠️ .env file should have 600 permissions (read/write owner only)\n⚠️ Back up your credentials securely\nUsage\nPosting\nText only\n# Post to both platforms\nscripts/post.sh \"Your message here\"\n\n# Twitter only\nscripts/post.sh --twitter \"Your message\"\n\n# Farcaster only\nscripts/post.sh --farcaster \"Your message\"\n\nWith image\n# Post to both platforms with image\nscripts/post.sh --image /path/to/image.jpg \"Your caption\"\n\n# Twitter only with image\nscripts/post.sh --twitter --image /path/to/image.jpg \"Caption\"\n\n# Farcaster only with image\nscripts/post.sh --farcaster --image /path/to/image.jpg \"Caption\"\n\nReplying\nReply to Twitter\n# Reply to a tweet\nscripts/reply.sh --twitter TWEET_ID \"Your reply\"\n\n# Reply with image\nscripts/reply.sh --twitter TWEET_ID --image /path/to/image.jpg \"Reply with image\"\n\n# Get tweet ID from URL: twitter.com/user/status/[TWEET_ID]\nscripts/reply.sh --twitter 1234567890123456789 \"Great point!\"\n\nReply to Farcaster\n# Reply to a cast\nscripts/reply.sh --farcaster CAST_HASH \"Your reply\"\n\n# Reply with image\nscripts/reply.sh --farcaster 0xabcd1234... --image /path/to/image.jpg \"Reply with image\"\n\n# Get cast hash from URL: farcaster.xyz/~/conversations/[HASH]\nscripts/reply.sh --farcaster 0xa1b2c3d4e5f6... \"Interesting perspective!\"\n\nReply to both platforms\n# Reply to both (if you have corresponding IDs on both platforms)\nscripts/reply.sh --twitter 123456 --farcaster 0xabcd... \"Great discussion!\"\n\nOptions\nFor post.sh (posting)\n--twitter - Post to Twitter only\n--farcaster - Post to Farcaster only\n--account <name> - Twitter account to use (lowercase prefix from .env)\n--vary - Auto-vary text to avoid duplicate content detection\n--image <path> - Attach image\n--thread - Force thread mode (split into multiple posts)\n--refresh-tier - Force refresh Twitter account tier cache (Basic vs Premium)\n--shorten-links - Shorten URLs to save characters\n--truncate - Auto-truncate if over limit\n--dry-run - Preview without posting\n-y, --yes - Skip ALL confirmation prompts (auto-confirm, no threading prompt)\nFor reply.sh (replying)\n--twitter <tweet_id> - Reply to Twitter tweet with this ID\n--farcaster <cast_hash> - Reply to Farcaster cast with this hash\n--account <name> - Twitter account to use (lowercase prefix from .env)\n--image <path> - Attach image to reply\n--shorten-links - Shorten URLs to save characters\n--truncate - Auto-truncate if over limit\n--dry-run - Preview without replying\n-y, --yes - Skip confirmation prompt (auto-confirm)\nExamples\nPosting Examples\n# Quick post to both (default account)\nscripts/post.sh \"gm! Building onchain 🦞\"\n\n# Post from specific Twitter account\nscripts/post.sh --account myaccount --twitter \"Message from my second account\"\n\n# Auto-vary text to avoid duplicate content detection\nscripts/post.sh --vary --twitter \"Same text, subtle variations added automatically\"\n\n# Premium account - post long text (interactive choice for threading)\nscripts/post.sh --twitter \"Very long text that exceeds 280 characters but is under 25k... \n(The skill will detect Premium tier and ask: 'Thread this instead? (y/n)')\"\n\n# Premium account - force threading (skip prompt)\nscripts/post.sh --twitter --thread \"Long text that will be split into thread regardless of Premium status\"\n\n# Premium account - force single long post (skip prompt)\nscripts/post.sh --twitter --auto-confirm \"Long text that will post as single tweet on Premium account\"\n\n# Refresh account tier cache (if you just upgraded to Premium)\nscripts/post.sh --refresh-tier --twitter \"First post after upgrading to Premium\"\n\n# Twitter announcement with image\nscripts/post.sh --twitter --image ~/screenshot.png \"New feature shipped! 🚀\"\n\n# Farcaster only\nscripts/post.sh --farcaster \"Just published credential-manager to ClawHub!\"\n\n# Long text as thread (auto-numbered)\nscripts/post.sh --thread \"This is a very long announcement that exceeds the character limit. It will be automatically split into multiple numbered posts. Each part will be posted sequentially to create a thread. (1/3), (2/3), (3/3)\"\n\n# Shorten URLs to save characters\nscripts/post.sh --shorten-links \"Check out this amazing project: https://github.com/very-long-organization-name/very-long-repository-name\"\n\n# Combine thread + link shortening\nscripts/post.sh --thread --shorten-links \"Long text with multiple links that will be shortened and split into a thread if needed\"\n\n# Both platforms, auto-truncate long text\nscripts/post.sh --truncate \"Very long message that might exceed limits...\"\n\n# Preview without confirmation (for automated workflows)\nscripts/post.sh --yes \"Automated post from CI/CD\"\n\nReply Examples\n# Reply to a Twitter thread\nscripts/reply.sh --twitter 1234567890123456789 \"Totally agree with this take! 💯\"\n\n# Reply from specific Twitter account\nscripts/reply.sh --account myaccount --twitter 1234567890 \"Replying from my second account\"\n\n# Reply to Farcaster cast\nscripts/reply.sh --farcaster 0xa1b2c3d4e5f6... \"Great insight! Have you considered...?\"\n\n# Reply with shortened links\nscripts/reply.sh --twitter 123456 --shorten-links \"Here's more info: https://example.com/very-long-article-url\"\n\n# Reply with image\nscripts/reply.sh --twitter 123456 --image ~/chart.png \"Here's the data to support this\"\n\n# Reply to both platforms (same message)\nscripts/reply.sh --twitter 123456 --farcaster 0xabc123 \"This is exactly right 🎯\"\n\n# Quick reply without confirmation\nscripts/reply.sh --twitter 123456 --yes \"Quick acknowledgment\"\n\n# Dry run to preview reply\nscripts/reply.sh --twitter 123456 --dry-run \"Test reply preview\"\n\nDraft Preview\n\nThe script now shows a draft preview before posting:\n\n=== Draft Preview ===\n\nText to post:\n─────────────────────────────────────────────\nYour message here\n─────────────────────────────────────────────\n\nTargets:\n  • Twitter\n  • Farcaster\n\nProceed with posting? (y/n):\n\nInteractive mode: Prompts for confirmation\nNon-interactive/automated: Use --yes flag to skip prompt\nDry run: Use --dry-run to preview without any posting\nRequirements\nTwitter credentials in .env (X_CONSUMER_KEY, X_CONSUMER_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET)\nFarcaster credentials in /home/phan_harry/.openclaw/farcaster-credentials.json\nUSDC on Base chain (custody wallet): 0.001 USDC per Farcaster cast\nFor images: curl, jq\nCosts\nX/Twitter\n100% Consumption-based - NO subscription tiers (tiers have been eliminated)\nPay per API request - charged for each call (post, read, etc.)\nNo monthly fees, no minimums, no tier upgrades to worry about\nAutomatic billing based on actual usage\nPayment via credit card through X Developer portal\nUses OAuth 1.0a (no blockchain/USDC required)\nRequires approved X Developer account + enabled billing\n\nOfficial pricing: https://developer.twitter.com/#pricing\n\nCritical: X API completely eliminated subscription tiers (Basic, Pro, etc.). The model is now purely pay-per-use - you are charged only for the API requests you actually make.\n\nFarcaster\n\nEach Farcaster cast costs 0.001 USDC (paid via x402 protocol):\n\nDeducted from custody wallet on Base chain\nSent to Neynar Hub: 0xA6a8736f18f383f1cc2d938576933E5eA7Df01A1\n~$1 USDC = 1000 casts\n\nCheck balance:\n\n# Quick check\nscripts/check-balance.sh\n\n# Manual check\njq -r '.custodyAddress' ~/.openclaw/farcaster-credentials.json\n# View on basescan.org\n\n\nFund wallet: Send USDC to custody address on Base chain. Bridge from other chains if needed.\n\nImage Hosting\nTwitter: Direct upload via Twitter API\nFarcaster: Uploads to imgur for public URL (embeds automatically)\nError Handling\nShows character/byte count before posting\nWarns if exceeding limits\nOption to truncate or abort\nValidates credentials before attempting post"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/teeclaw/openclaw-social-post",
    "publisherUrl": "https://clawhub.ai/teeclaw/openclaw-social-post",
    "owner": "teeclaw",
    "version": "1.5.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/openclaw-social-post",
    "downloadUrl": "https://openagent3.xyz/downloads/openclaw-social-post",
    "agentUrl": "https://openagent3.xyz/skills/openclaw-social-post/agent",
    "manifestUrl": "https://openagent3.xyz/skills/openclaw-social-post/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/openclaw-social-post/agent.md"
  }
}