{"id":"09fc9546-e2e1-4ea3-afc5-44e850f127ff","entityType":"agent","slug":"clawhub-phy041-phy-social-post","name":"Phy Social Post","canonicalUrl":"https://www.xpersona.co/agent/clawhub-phy041-phy-social-post","canonicalPath":"/agent/clawhub-phy041-phy-social-post","generatedAt":"2026-10-12T17:39:40.350Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T23:35:43.372Z","emptyReason":null},"description":"Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Th... Skill: Phy Social Post Owner: phy041 Summary: Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Th... Tags: cross-platform:1.0.0, latest:1.0.2, social-media:1.0.0 Version history: v1.0.2 | 2026-03-22T14:04:37.741Z | auto - Added \"Author\" section with links to Canlah AI, GitHub, and Clawhub profile. - No functional","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 975 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s175g2rty8e4mw6h9zcwwgxmfn884t23:phy-social-post","sourceUrl":"https://clawhub.ai/phy041/phy-social-post","homepage":"https://clawhub.ai/phy041/skills/phy-social-post","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/phy041/phy-social-post","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/phy041/skills/phy-social-post","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Th..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:35:43.372Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:35:43.372Z","emptyReason":null},"stars":null,"forks":null,"downloads":975,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.0.2","tractionLabel":"975 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:35:43.306Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T23:35:43.372Z","lastCrawledAt":"2026-10-11T23:35:43.306Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T23:35:43.306Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.2","createdAt":"2026-03-22T14:04:37.741Z","changelog":"- Added \"Author\" section with links to Canlah AI, GitHub, and Clawhub profile. - No functional changes to the API or usage instructions. - Documentation updated only, with new contact and credit links at the end of SKILL.md.","fileCount":3,"zipByteSize":3989},{"version":"1.0.1","createdAt":"2026-03-22T12:14:03.565Z","changelog":"- Added a homepage field with the URL https://canlah.ai to the skill metadata. - No functional or usage changes; documentation update only.","fileCount":2,"zipByteSize":2684},{"version":"1.0.0","createdAt":"2026-03-08T07:36:02.292Z","changelog":"Initial release","fileCount":2,"zipByteSize":2668}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s175g2rty8e4mw6h9zcwwgxmfn884t23:phy-social-post","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-phy041-phy-social-post/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-phy041-phy-social-post/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-phy041-phy-social-post/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-phy041-phy-social-post/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-phy041-phy-social-post/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-phy041-phy-social-post/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T17:39:40.350Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-phy041-phy-social-post/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-phy041-phy-social-post/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-phy041-phy-social-post/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-phy041-phy-social-post/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T23:35:43.372Z","emptyReason":null},"readme":"Skill: Phy Social Post\n\nOwner: phy041\n\nSummary: Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Th...\n\nTags: cross-platform:1.0.0, latest:1.0.2, social-media:1.0.0\n\nVersion history:\n\nv1.0.2 | 2026-03-22T14:04:37.741Z | auto\n\n- Added \"Author\" section with links to Canlah AI, GitHub, and Clawhub profile.\n- No functional changes to the API or usage instructions.\n- Documentation updated only, with new contact and credit links at the end of SKILL.md.\n\nv1.0.1 | 2026-03-22T12:14:03.565Z | auto\n\n- Added a homepage field with the URL https://canlah.ai to the skill metadata.\n- No functional or usage changes; documentation update only.\n\nv1.0.0 | 2026-03-08T07:36:02.292Z | user\n\nInitial release\n\nArchive index:\n\nArchive v1.0.2: 3 files, 3989 bytes\n\nFiles: skill-card.md (2203b), SKILL.md (6515b), _meta.json (134b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: social-post\ndescription: Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Threads, or Bluesky. Triggers on \"post to twitter\", \"post to instagram\", \"social media post\", \"share on linkedin\", \"publish to social\", or any social posting request.\nhomepage: https://canlah.ai\nmetadata: {\"openclaw\": {\"emoji\": \"📱\", \"os\": [\"darwin\", \"linux\"]}}\n---\n\n# Social Posting Skill\n\nPost to multiple social media platforms via the unified social posting API with automatic provider fallback.\n\n---\n\n## Setup\n\n**Location:** `[your-project-root]/social-posting-api/`\n\n**Environment:**\n```bash\ncd [your-project-root]/social-posting-api\nsource venv/bin/activate\n```\n\n**Required env vars in `.env`:**\n- `POSTFORME_API_KEY` - Primary provider (PostForMe)\n- `LATE_API_KEY` - Fallback provider (LATE)\n\n---\n\n## Quick Commands\n\n### Check Connected Accounts\n```python\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\n\nclient = SocialPostingClient()\nprint(\"Providers:\", client.available_providers)\nfor acc in client.get_accounts():\n    print(f\"  {acc.platform}: {acc.username}\")\n```\n\n### Post Text Only\n```python\nresult = client.post(\n    content=\"Your post content here\",\n    platforms=[\"twitter\", \"linkedin\"]\n)\nprint(f\"Success: {result.success}, Provider: {result.provider}\")\n```\n\n### Post with Images\n```python\nresult = client.post(\n    content=\"Check out these photos!\",\n    platforms=[\"instagram\"],\n    media_urls=[\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\"\n    ]\n)\n```\n\n### Schedule a Post\n```python\nfrom datetime import datetime\n\nresult = client.post(\n    content=\"Scheduled post\",\n    platforms=[\"linkedin\"],\n    scheduled_for=datetime(2025, 1, 15, 9, 0)  # UTC\n)\n```\n\n---\n\n## Supported Platforms\n\n| Platform | Text Only | With Media | Notes |\n|----------|-----------|------------|-------|\n| Twitter/X | ✅ | ✅ | 280 char limit |\n| LinkedIn | ✅ | ✅ | Best for professional content |\n| Instagram | ❌ | ✅ | **Requires media** |\n| Facebook | ✅ | ✅ | |\n| TikTok | ❌ | ✅ | Video preferred |\n| Threads | ✅ | ✅ | |\n| Bluesky | ✅ | ✅ | |\n| Pinterest | ❌ | ✅ | Requires media |\n| YouTube | ❌ | ✅ | Video only |\n\n---\n\n## Complete Posting Script\n\n```python\n#!/usr/bin/env python\n\"\"\"Post to social media platforms.\"\"\"\n\nimport sys\nsys.path.insert(0, '[your-project-root]/social-posting-api')\n\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv('[your-project-root]/social-posting-api/.env')\n\ndef post_to_social(content: str, platforms: list, media_urls: list = None):\n    \"\"\"Post content to specified platforms.\"\"\"\n    client = SocialPostingClient()\n\n    # Check which platforms are connected\n    accounts = client.get_accounts()\n    connected = [a.platform for a in accounts]\n\n    # Filter to only connected platforms\n    valid_platforms = [p for p in platforms if p in connected]\n\n    if not valid_platforms:\n        print(f\"No connected accounts for: {platforms}\")\n        print(f\"Connected: {connected}\")\n        return None\n\n    # Post\n    result = client.post(\n        content=content,\n        platforms=valid_platforms,\n        media_urls=media_urls\n    )\n\n    if result.success:\n        print(f\"Posted via {result.provider}\")\n        print(f\"   Post ID: {result.post_id}\")\n    else:\n        print(f\"Failed: {result.error}\")\n\n    return result\n\n# Example usage\nif __name__ == \"__main__\":\n    post_to_social(\n        content=\"Hello from the social posting API!\",\n        platforms=[\"instagram\"],\n        media_urls=[\"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080\"]\n    )\n```\n\n---\n\n## Workflow for Posting\n\n### Step 1: Check Connected Accounts\n\nAlways check what's connected first:\n```bash\ncd [your-project-root]/social-posting-api\nsource venv/bin/activate && python -c \"\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\nclient = SocialPostingClient()\nfor acc in client.get_accounts():\n    print(f'{acc.platform}: {acc.username}')\n\"\n```\n\n### Step 2: Prepare Content\n\n- **Twitter**: Keep under 280 chars\n- **LinkedIn**: Can be longer, professional tone\n- **Instagram**: Needs at least 1 image\n- **小红书**: Use xiaohongshu-gtm skill for Chinese content\n\n### Step 3: Execute Post\n\n```bash\nsource venv/bin/activate && python -c \"\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\n\nclient = SocialPostingClient()\nresult = client.post(\n    content='''Your content here''',\n    platforms=['platform1', 'platform2'],\n    media_urls=['https://example.com/image.jpg']  # Optional\n)\nprint(f'Success: {result.success}')\nprint(f'Provider: {result.provider}')\nprint(f'Post ID: {result.post_id}')\n\"\n```\n\n---\n\n## Connecting New Accounts\n\nTo connect Twitter or other platforms:\n\n### Via PostForMe (Primary)\n1. Go to https://postforme.dev/dashboard\n2. Click \"Connect Account\"\n3. Select platform and authorize\n\n### Via LATE (Fallback)\n1. Go to https://getlate.dev/dashboard\n2. Connect social accounts\n3. API key in `.env` will auto-detect new accounts\n\n---\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|---------|\n| \"No connected accounts\" | Platform not linked | Connect via provider dashboard |\n| \"Instagram requires media\" | Text-only post | Add at least 1 image URL |\n| \"HTTP 401\" | Invalid API key | Check `.env` file |\n| \"All providers failed\" | Both providers down | Try again later |\n\n---\n\n## Cross-Posting Strategy\n\n**For open source announcements:**\n```python\n# Post to developer platforms\nresult = client.post(\n    content=\"Just open-sourced my multi-provider social posting API!\\n\\nFeatures:\\n- Automatic fallback between providers\\n- Supports 9+ platforms\\n- Simple Python interface\\n\\nGitHub: https://github.com/[your-username]/social-posting-api\",\n    platforms=[\"twitter\", \"linkedin\"]\n)\n```\n\n**For visual content:**\n```python\n# Instagram carousel\nresult = client.post(\n    content=\"Behind the scenes of building [Your Product]\",\n    platforms=[\"instagram\"],\n    media_urls=[\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\",\n        \"https://example.com/image3.jpg\"\n    ]\n)\n```\n\n---\n\n## Author\n\n**[Canlah AI](https://canlah.ai)** — Run performance marketing without breaking your brand.\n\n- GitHub: [github.com/PHY041](https://github.com/PHY041)\n- All Skills: [clawhub.ai/PHY041](https://clawhub.ai/PHY041)\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn7fdhcxytgt3k2vvnc24c8ke581g5j1\",\n  \"slug\": \"phy-social-post\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1774188277741\n}\n\nFile v1.0.2:skill-card.md\n\n## Description:\n\nPosts text, media, and scheduled content to supported social media platforms through a multi-provider social posting API.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[phy041](https://clawhub.ai/user/phy041)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, operators, and external users use this skill to check connected social accounts, prepare platform-appropriate content, and publish or schedule posts across supported social channels.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The workflow can publish or schedule content to connected public social accounts.\n\nMitigation: Require a preview and explicit confirmation before executing posting commands, and verify the selected platforms and accounts first.\n\nRisk: The documented inline python -c pattern can execute injected content if user-supplied post text is pasted into the command.\n\nMitigation: Use a fixed script, stdin, JSON, or argument-array execution so post content is handled as data rather than executable code.\n\nRisk: The skill depends on API keys for third-party posting providers.\n\nMitigation: Keep provider keys in the environment or a local .env file, limit their account permissions where possible, and rotate them if exposed.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/phy041/skills/phy-social-post)\n- [Canlah AI](https://canlah.ai)\n- [PostForMe dashboard](https://postforme.dev/dashboard)\n- [LATE dashboard](https://getlate.dev/dashboard)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with Python and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May result in API calls that publish or schedule content when the generated commands are executed.]\n\n## Skill Version(s):\n\n1.0.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.1: 2 files, 2684 bytes\n\nFiles: SKILL.md (6285b), _meta.json (134b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: social-post\ndescription: Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Threads, or Bluesky. Triggers on \"post to twitter\", \"post to instagram\", \"social media post\", \"share on linkedin\", \"publish to social\", or any social posting request.\nhomepage: https://canlah.ai\nmetadata: {\"openclaw\": {\"emoji\": \"📱\", \"os\": [\"darwin\", \"linux\"]}}\n---\n\n# Social Posting Skill\n\nPost to multiple social media platforms via the unified social posting API with automatic provider fallback.\n\n---\n\n## Setup\n\n**Location:** `[your-project-root]/social-posting-api/`\n\n**Environment:**\n```bash\ncd [your-project-root]/social-posting-api\nsource venv/bin/activate\n```\n\n**Required env vars in `.env`:**\n- `POSTFORME_API_KEY` - Primary provider (PostForMe)\n- `LATE_API_KEY` - Fallback provider (LATE)\n\n---\n\n## Quick Commands\n\n### Check Connected Accounts\n```python\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\n\nclient = SocialPostingClient()\nprint(\"Providers:\", client.available_providers)\nfor acc in client.get_accounts():\n    print(f\"  {acc.platform}: {acc.username}\")\n```\n\n### Post Text Only\n```python\nresult = client.post(\n    content=\"Your post content here\",\n    platforms=[\"twitter\", \"linkedin\"]\n)\nprint(f\"Success: {result.success}, Provider: {result.provider}\")\n```\n\n### Post with Images\n```python\nresult = client.post(\n    content=\"Check out these photos!\",\n    platforms=[\"instagram\"],\n    media_urls=[\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\"\n    ]\n)\n```\n\n### Schedule a Post\n```python\nfrom datetime import datetime\n\nresult = client.post(\n    content=\"Scheduled post\",\n    platforms=[\"linkedin\"],\n    scheduled_for=datetime(2025, 1, 15, 9, 0)  # UTC\n)\n```\n\n---\n\n## Supported Platforms\n\n| Platform | Text Only | With Media | Notes |\n|----------|-----------|------------|-------|\n| Twitter/X | ✅ | ✅ | 280 char limit |\n| LinkedIn | ✅ | ✅ | Best for professional content |\n| Instagram | ❌ | ✅ | **Requires media** |\n| Facebook | ✅ | ✅ | |\n| TikTok | ❌ | ✅ | Video preferred |\n| Threads | ✅ | ✅ | |\n| Bluesky | ✅ | ✅ | |\n| Pinterest | ❌ | ✅ | Requires media |\n| YouTube | ❌ | ✅ | Video only |\n\n---\n\n## Complete Posting Script\n\n```python\n#!/usr/bin/env python\n\"\"\"Post to social media platforms.\"\"\"\n\nimport sys\nsys.path.insert(0, '[your-project-root]/social-posting-api')\n\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv('[your-project-root]/social-posting-api/.env')\n\ndef post_to_social(content: str, platforms: list, media_urls: list = None):\n    \"\"\"Post content to specified platforms.\"\"\"\n    client = SocialPostingClient()\n\n    # Check which platforms are connected\n    accounts = client.get_accounts()\n    connected = [a.platform for a in accounts]\n\n    # Filter to only connected platforms\n    valid_platforms = [p for p in platforms if p in connected]\n\n    if not valid_platforms:\n        print(f\"No connected accounts for: {platforms}\")\n        print(f\"Connected: {connected}\")\n        return None\n\n    # Post\n    result = client.post(\n        content=content,\n        platforms=valid_platforms,\n        media_urls=media_urls\n    )\n\n    if result.success:\n        print(f\"Posted via {result.provider}\")\n        print(f\"   Post ID: {result.post_id}\")\n    else:\n        print(f\"Failed: {result.error}\")\n\n    return result\n\n# Example usage\nif __name__ == \"__main__\":\n    post_to_social(\n        content=\"Hello from the social posting API!\",\n        platforms=[\"instagram\"],\n        media_urls=[\"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080\"]\n    )\n```\n\n---\n\n## Workflow for Posting\n\n### Step 1: Check Connected Accounts\n\nAlways check what's connected first:\n```bash\ncd [your-project-root]/social-posting-api\nsource venv/bin/activate && python -c \"\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\nclient = SocialPostingClient()\nfor acc in client.get_accounts():\n    print(f'{acc.platform}: {acc.username}')\n\"\n```\n\n### Step 2: Prepare Content\n\n- **Twitter**: Keep under 280 chars\n- **LinkedIn**: Can be longer, professional tone\n- **Instagram**: Needs at least 1 image\n- **小红书**: Use xiaohongshu-gtm skill for Chinese content\n\n### Step 3: Execute Post\n\n```bash\nsource venv/bin/activate && python -c \"\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\n\nclient = SocialPostingClient()\nresult = client.post(\n    content='''Your content here''',\n    platforms=['platform1', 'platform2'],\n    media_urls=['https://example.com/image.jpg']  # Optional\n)\nprint(f'Success: {result.success}')\nprint(f'Provider: {result.provider}')\nprint(f'Post ID: {result.post_id}')\n\"\n```\n\n---\n\n## Connecting New Accounts\n\nTo connect Twitter or other platforms:\n\n### Via PostForMe (Primary)\n1. Go to https://postforme.dev/dashboard\n2. Click \"Connect Account\"\n3. Select platform and authorize\n\n### Via LATE (Fallback)\n1. Go to https://getlate.dev/dashboard\n2. Connect social accounts\n3. API key in `.env` will auto-detect new accounts\n\n---\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|---------|\n| \"No connected accounts\" | Platform not linked | Connect via provider dashboard |\n| \"Instagram requires media\" | Text-only post | Add at least 1 image URL |\n| \"HTTP 401\" | Invalid API key | Check `.env` file |\n| \"All providers failed\" | Both providers down | Try again later |\n\n---\n\n## Cross-Posting Strategy\n\n**For open source announcements:**\n```python\n# Post to developer platforms\nresult = client.post(\n    content=\"Just open-sourced my multi-provider social posting API!\\n\\nFeatures:\\n- Automatic fallback between providers\\n- Supports 9+ platforms\\n- Simple Python interface\\n\\nGitHub: https://github.com/[your-username]/social-posting-api\",\n    platforms=[\"twitter\", \"linkedin\"]\n)\n```\n\n**For visual content:**\n```python\n# Instagram carousel\nresult = client.post(\n    content=\"Behind the scenes of building [Your Product]\",\n    platforms=[\"instagram\"],\n    media_urls=[\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\",\n        \"https://example.com/image3.jpg\"\n    ]\n)\n```\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7fdhcxytgt3k2vvnc24c8ke581g5j1\",\n  \"slug\": \"phy-social-post\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1774181643565\n}\n\nArchive v1.0.0: 2 files, 2668 bytes\n\nFiles: SKILL.md (6257b), _meta.json (134b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: social-post\ndescription: Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Threads, or Bluesky. Triggers on \"post to twitter\", \"post to instagram\", \"social media post\", \"share on linkedin\", \"publish to social\", or any social posting request.\nmetadata: {\"openclaw\": {\"emoji\": \"📱\", \"os\": [\"darwin\", \"linux\"]}}\n---\n\n# Social Posting Skill\n\nPost to multiple social media platforms via the unified social posting API with automatic provider fallback.\n\n---\n\n## Setup\n\n**Location:** `[your-project-root]/social-posting-api/`\n\n**Environment:**\n```bash\ncd [your-project-root]/social-posting-api\nsource venv/bin/activate\n```\n\n**Required env vars in `.env`:**\n- `POSTFORME_API_KEY` - Primary provider (PostForMe)\n- `LATE_API_KEY` - Fallback provider (LATE)\n\n---\n\n## Quick Commands\n\n### Check Connected Accounts\n```python\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\n\nclient = SocialPostingClient()\nprint(\"Providers:\", client.available_providers)\nfor acc in client.get_accounts():\n    print(f\"  {acc.platform}: {acc.username}\")\n```\n\n### Post Text Only\n```python\nresult = client.post(\n    content=\"Your post content here\",\n    platforms=[\"twitter\", \"linkedin\"]\n)\nprint(f\"Success: {result.success}, Provider: {result.provider}\")\n```\n\n### Post with Images\n```python\nresult = client.post(\n    content=\"Check out these photos!\",\n    platforms=[\"instagram\"],\n    media_urls=[\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\"\n    ]\n)\n```\n\n### Schedule a Post\n```python\nfrom datetime import datetime\n\nresult = client.post(\n    content=\"Scheduled post\",\n    platforms=[\"linkedin\"],\n    scheduled_for=datetime(2025, 1, 15, 9, 0)  # UTC\n)\n```\n\n---\n\n## Supported Platforms\n\n| Platform | Text Only | With Media | Notes |\n|----------|-----------|------------|-------|\n| Twitter/X | ✅ | ✅ | 280 char limit |\n| LinkedIn | ✅ | ✅ | Best for professional content |\n| Instagram | ❌ | ✅ | **Requires media** |\n| Facebook | ✅ | ✅ | |\n| TikTok | ❌ | ✅ | Video preferred |\n| Threads | ✅ | ✅ | |\n| Bluesky | ✅ | ✅ | |\n| Pinterest | ❌ | ✅ | Requires media |\n| YouTube | ❌ | ✅ | Video only |\n\n---\n\n## Complete Posting Script\n\n```python\n#!/usr/bin/env python\n\"\"\"Post to social media platforms.\"\"\"\n\nimport sys\nsys.path.insert(0, '[your-project-root]/social-posting-api')\n\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv('[your-project-root]/social-posting-api/.env')\n\ndef post_to_social(content: str, platforms: list, media_urls: list = None):\n    \"\"\"Post content to specified platforms.\"\"\"\n    client = SocialPostingClient()\n\n    # Check which platforms are connected\n    accounts = client.get_accounts()\n    connected = [a.platform for a in accounts]\n\n    # Filter to only connected platforms\n    valid_platforms = [p for p in platforms if p in connected]\n\n    if not valid_platforms:\n        print(f\"No connected accounts for: {platforms}\")\n        print(f\"Connected: {connected}\")\n        return None\n\n    # Post\n    result = client.post(\n        content=content,\n        platforms=valid_platforms,\n        media_urls=media_urls\n    )\n\n    if result.success:\n        print(f\"Posted via {result.provider}\")\n        print(f\"   Post ID: {result.post_id}\")\n    else:\n        print(f\"Failed: {result.error}\")\n\n    return result\n\n# Example usage\nif __name__ == \"__main__\":\n    post_to_social(\n        content=\"Hello from the social posting API!\",\n        platforms=[\"instagram\"],\n        media_urls=[\"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080\"]\n    )\n```\n\n---\n\n## Workflow for Posting\n\n### Step 1: Check Connected Accounts\n\nAlways check what's connected first:\n```bash\ncd [your-project-root]/social-posting-api\nsource venv/bin/activate && python -c \"\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\nclient = SocialPostingClient()\nfor acc in client.get_accounts():\n    print(f'{acc.platform}: {acc.username}')\n\"\n```\n\n### Step 2: Prepare Content\n\n- **Twitter**: Keep under 280 chars\n- **LinkedIn**: Can be longer, professional tone\n- **Instagram**: Needs at least 1 image\n- **小红书**: Use xiaohongshu-gtm skill for Chinese content\n\n### Step 3: Execute Post\n\n```bash\nsource venv/bin/activate && python -c \"\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\n\nclient = SocialPostingClient()\nresult = client.post(\n    content='''Your content here''',\n    platforms=['platform1', 'platform2'],\n    media_urls=['https://example.com/image.jpg']  # Optional\n)\nprint(f'Success: {result.success}')\nprint(f'Provider: {result.provider}')\nprint(f'Post ID: {result.post_id}')\n\"\n```\n\n---\n\n## Connecting New Accounts\n\nTo connect Twitter or other platforms:\n\n### Via PostForMe (Primary)\n1. Go to https://postforme.dev/dashboard\n2. Click \"Connect Account\"\n3. Select platform and authorize\n\n### Via LATE (Fallback)\n1. Go to https://getlate.dev/dashboard\n2. Connect social accounts\n3. API key in `.env` will auto-detect new accounts\n\n---\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|---------|\n| \"No connected accounts\" | Platform not linked | Connect via provider dashboard |\n| \"Instagram requires media\" | Text-only post | Add at least 1 image URL |\n| \"HTTP 401\" | Invalid API key | Check `.env` file |\n| \"All providers failed\" | Both providers down | Try again later |\n\n---\n\n## Cross-Posting Strategy\n\n**For open source announcements:**\n```python\n# Post to developer platforms\nresult = client.post(\n    content=\"Just open-sourced my multi-provider social posting API!\\n\\nFeatures:\\n- Automatic fallback between providers\\n- Supports 9+ platforms\\n- Simple Python interface\\n\\nGitHub: https://github.com/[your-username]/social-posting-api\",\n    platforms=[\"twitter\", \"linkedin\"]\n)\n```\n\n**For visual content:**\n```python\n# Instagram carousel\nresult = client.post(\n    content=\"Behind the scenes of building [Your Product]\",\n    platforms=[\"instagram\"],\n    media_urls=[\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\",\n        \"https://example.com/image3.jpg\"\n    ]\n)\n```\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7fdhcxytgt3k2vvnc24c8ke581g5j1\",\n  \"slug\": \"phy-social-post\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1772955362292\n}","readmeExcerpt":"Skill: Phy Social Post Owner: phy041 Summary: Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Th... Tags: cross-platform:1.0.0, latest:1.0.2, social-media:1.0.0 Version history: v1.0.2 | 2026-03-22T14:04:37.741Z | auto - Added \"Author\" section with links to Canlah AI, GitHub, and Clawhub profile. - No functional","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"cd [your-project-root]/social-posting-api\nsource venv/bin/activate"},{"language":"python","snippet":"from social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\n\nclient = SocialPostingClient()\nprint(\"Providers:\", client.available_providers)\nfor acc in client.get_accounts():\n    print(f\"  {acc.platform}: {acc.username}\")"},{"language":"python","snippet":"result = client.post(\n    content=\"Your post content here\",\n    platforms=[\"twitter\", \"linkedin\"]\n)\nprint(f\"Success: {result.success}, Provider: {result.provider}\")"},{"language":"python","snippet":"result = client.post(\n    content=\"Check out these photos!\",\n    platforms=[\"instagram\"],\n    media_urls=[\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\"\n    ]\n)"},{"language":"python","snippet":"from datetime import datetime\n\nresult = client.post(\n    content=\"Scheduled post\",\n    platforms=[\"linkedin\"],\n    scheduled_for=datetime(2025, 1, 15, 9, 0)  # UTC\n)"},{"language":"python","snippet":"#!/usr/bin/env python\n\"\"\"Post to social media platforms.\"\"\"\n\nimport sys\nsys.path.insert(0, '[your-project-root]/social-posting-api')\n\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv('[your-project-root]/social-posting-api/.env')\n\ndef post_to_social(content: str, platforms: list, media_urls: list = None):\n    \"\"\"Post content to specified platforms.\"\"\"\n    client = SocialPostingClient()\n\n    # Check which platforms are connected\n    accounts = client.get_accounts()\n    connected = [a.platform for a in accounts]\n\n    # Filter to only connected platforms\n    valid_platforms = [p for p in platforms if p in connected]\n\n    if not valid_platforms:\n        print(f\"No connected accounts for: {platforms}\")\n        print(f\"Connected: {connected}\")\n        return None\n\n    # Post\n    result = client.post(\n        content=content,\n        platforms=valid_platforms,\n        media_urls=media_urls\n    )\n\n    if result.success:\n        print(f\"Posted via {result.provider}\")\n        print(f\"   Post ID: {result.post_id}\")\n    else:\n        print(f\"Failed: {result.error}\")\n\n    return result\n\n# Example usage\nif __name__ == \"__main__\":\n    post_to_social(\n        content=\"Hello from the social posting API!\",\n        platforms=[\"instagram\"],\n        media_urls=[\"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080\"]\n    )"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: social-post\ndescription: Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Threads, or Bluesky. Triggers on \"post to twitter\", \"post to instagram\", \"social media post\", \"share on linkedin\", \"publish to social\", or any social posting request.\nhomepage: https://canlah.ai\nmetadata: {\"openclaw\": {\"emoji\": \"📱\", \"os\": [\"darwin\", \"linux\"]}}\n---\n\n# Social Posting Skill\n\nPost to multiple social media platforms via the unified social posting API with automatic provider fallback.\n\n---\n\n## Setup\n\n**Location:** `[your-project-root]/social-posting-api/`\n\n**Environment:**\n```bash\ncd [your-project-root]/social-posting-api\nsource venv/bin/activate\n```\n\n**Required env vars in `.env`:**\n- `POSTFORME_API_KEY` - Primary provider (PostForMe)\n- `LATE_API_KEY` - Fallback provider (LATE)\n\n---\n\n## Quick Commands\n\n### Check Connected Accounts\n```python\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv()\n\nclient = SocialPostingClient()\nprint(\"Providers:\", client.available_providers)\nfor acc in client.get_accounts():\n    print(f\"  {acc.platform}: {acc.username}\")\n```\n\n### Post Text Only\n```python\nresult = client.post(\n    content=\"Your post content here\",\n    platforms=[\"twitter\", \"linkedin\"]\n)\nprint(f\"Success: {result.success}, Provider: {result.provider}\")\n```\n\n### Post with Images\n```python\nresult = client.post(\n    content=\"Check out these photos!\",\n    platforms=[\"instagram\"],\n    media_urls=[\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\"\n    ]\n)\n```\n\n### Schedule a Post\n```python\nfrom datetime import datetime\n\nresult = client.post(\n    content=\"Scheduled post\",\n    platforms=[\"linkedin\"],\n    scheduled_for=datetime(2025, 1, 15, 9, 0)  # UTC\n)\n```\n\n---\n\n## Supported Platforms\n\n| Platform | Text Only | With Media | Notes |\n|----------|-----------|------------|-------|\n| Twitter/X | ✅ | ✅ | 280 char limit |\n| LinkedIn | ✅ | ✅ | Best for professional content |\n| Instagram | ❌ | ✅ | **Requires media** |\n| Facebook | ✅ | ✅ | |\n| TikTok | ❌ | ✅ | Video preferred |\n| Threads | ✅ | ✅ | |\n| Bluesky | ✅ | ✅ | |\n| Pinterest | ❌ | ✅ | Requires media |\n| YouTube | ❌ | ✅ | Video only |\n\n---\n\n## Complete Posting Script\n\n```python\n#!/usr/bin/env python\n\"\"\"Post to social media platforms.\"\"\"\n\nimport sys\nsys.path.insert(0, '[your-project-root]/social-posting-api')\n\nfrom social_posting import SocialPostingClient\nfrom dotenv import load_dotenv\nload_dotenv('[your-project-root]/social-posting-api/.env')\n\ndef post_to_social(content: str, platforms: list, media_urls: list = None):\n    \"\"\"Post content to specified platforms.\"\"\"\n    client = SocialPostingClient()\n\n    # Check which platforms are connected\n    accounts = client.get_accounts()\n    connected = [a.platform for a in accounts]\n\n    # Filter to only connected platforms\n    valid_platforms = [p for p in platforms if p in connected]\n\n    if not vali"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7fdhcxytgt3k2vvnc24c8ke581g5j1\",\n  \"slug\": \"phy-social-post\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1774188277741\n}"},{"path":"skill-card.md","content":"## Description:\n\nPosts text, media, and scheduled content to supported social media platforms through a multi-provider social posting API.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[phy041](https://clawhub.ai/user/phy041)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, operators, and external users use this skill to check connected social accounts, prepare platform-appropriate content, and publish or schedule posts across supported social channels.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The workflow can publish or schedule content to connected public social accounts.\n\nMitigation: Require a preview and explicit confirmation before executing posting commands, and verify the selected platforms and accounts first.\n\nRisk: The documented inline python -c pattern can execute injected content if user-supplied post text is pasted into the command.\n\nMitigation: Use a fixed script, stdin, JSON, or argument-array execution so post content is handled as data rather than executable code.\n\nRisk: The skill depends on API keys for third-party posting providers.\n\nMitigation: Keep provider keys in the environment or a local .env file, limit their account permissions where possible, and rotate them if exposed.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/phy041/skills/phy-social-post)\n- [Canlah AI](https://canlah.ai)\n- [PostForMe dashboard](https://postforme.dev/dashboard)\n- [LATE dashboard](https://getlate.dev/dashboard)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with Python and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May result in API calls that publish or schedule content when the generated commands are executed.]\n\n## Skill Version(s):\n\n1.0.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Th... Skill: Phy Social Post Owner: phy041 Summary: Post to social media platforms using the multi-provider social posting API. Use when user wants to post to Twitter, LinkedIn, Instagram, Facebook, TikTok, Th... Tags: cross-platform:1.0.0, latest:1.0.2, social-media:1.0.0 Version history: v1.0.2 | 2026-03-22T14:04:37.741Z | auto - Added \"Author\" section with links to Canlah AI, GitHub, and Clawhub profile. - No functional","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":986,"uniquenessScore":50,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:35:43.372Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:35:43.372Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T17:39:40.350Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}