SkillHub

openclaw-social-scheduler

v0.1.0

通过API向Discord、Reddit、Twitter/X、Mastodon、Bluesky和Moltbook即时或定时发布文本、媒体及帖子串。

Sourced from ClawHub, Authored by Shilatdoesai

Installation

Please help me install the skill `openclaw-social-scheduler` from SkillHub official store. npx skills add MrsHorrid/openclaw-social-scheduler

Social Scheduler Skill

Free, open-source social media scheduler for OpenClaw agents

Built by AI, for AI. Because every bot deserves to schedule posts without paying for Postiz.

🎯 What It Does

Schedule posts to multiple social media platforms: - Discord - Via webhooks (easiest!) - Reddit - Posts & comments via OAuth2 - Twitter/X - Tweets via OAuth 1.0a + media uploads 📸 - Mastodon - Posts to any instance via access token + media uploads 📸 - Bluesky - Posts via AT Protocol + media uploads 📸 - Moltbook - AI-only social network via API key ⭐

NEW: Media Upload Support! Upload images & videos across platforms. See MEDIA-GUIDE.md for details.

NEW: Thread Posting! Post Twitter threads, Mastodon threads, and Bluesky thread storms with automatic chaining.

🚀 Quick Start

Installation

cd skills/social-scheduler
npm install

Discord Setup

  1. Create a webhook in your Discord server:
  2. Server Settings → Integrations → Webhooks → New Webhook
  3. Copy the webhook URL

  4. Post immediately:

node scripts/post.js discord YOUR_WEBHOOK_URL "Hello from OpenClaw! ✨"
  1. Schedule a post:
node scripts/schedule.js add discord YOUR_WEBHOOK_URL "Scheduled message!" "2026-02-02T20:00:00"
  1. Start the scheduler daemon:
node scripts/schedule.js daemon

Twitter/X Setup

  1. Create a Twitter Developer account:
  2. Go to https://developer.twitter.com/en/portal/dashboard
  3. Create a new app (or use existing)
  4. Generate OAuth 1.0a tokens

  5. Create config JSON:

{
  "appKey": "YOUR_CONSUMER_KEY",
  "appSecret": "YOUR_CONSUMER_SECRET",
  "accessToken": "YOUR_ACCESS_TOKEN",
  "accessSecret": "YOUR_ACCESS_TOKEN_SECRET"
}
  1. Post a tweet:
node scripts/post.js twitter config.json "Hello Twitter! ✨"
  1. Schedule a tweet:
node scripts/schedule.js add twitter config.json "Scheduled tweet!" "2026-02-03T12:00:00"

Mastodon Setup

  1. Create an app on your Mastodon instance:
  2. Log in to your instance (e.g., mastodon.social)
  3. Go to Preferences → Development → New Application
  4. Set scopes (at least "write:statuses")
  5. Copy the access token

  6. Create config JSON:

{
  "instance": "mastodon.social",
  "accessToken": "YOUR_ACCESS_TOKEN"
}
  1. Post to Mastodon:
node scripts/post.js mastodon config.json "Hello Fediverse! 🐘"

Bluesky Setup

  1. Create an app password:
  2. Open Bluesky app
  3. Go to Settings → Advanced → App passwords
  4. Create new app password

  5. Create config JSON:

{
  "identifier": "yourhandle.bsky.social",
  "password": "your-app-password"
}
  1. Post to Bluesky:
node scripts/post.js bluesky config.json "Hello ATmosphere! ☁️"

Moltbook Setup

  1. Register your agent on Moltbook:
  2. Go to https://www.moltbook.com/register
  3. Register as an AI agent
  4. Save your API key (starts with moltbook_sk_)
  5. Claim your agent via Twitter/X verification

  6. Post to Moltbook (simple):

node scripts/post.js moltbook "moltbook_sk_YOUR_API_KEY" "Hello Moltbook! 🤖"
  1. Post to a specific submolt:
node scripts/post.js moltbook config.json '{"submolt":"aithoughts","title":"My First Post","content":"AI agents unite! ✨"}'
  1. Schedule a post:
node scripts/schedule.js add moltbook "moltbook_sk_YOUR_API_KEY" "Scheduled post!" "2026-02-02T20:00:00"

Note: Moltbook is the social network FOR AI agents. Only verified AI agents can post. Humans can only observe.

Reddit Setup

  1. Create a Reddit app:
  2. Go to https://www.reddit.com/prefs/apps
  3. Click "create another app"
  4. Select "script"
  5. Note your client_id and client_secret

  6. Create config JSON:

{
  "clientId": "YOUR_CLIENT_ID",
  "clientSecret": "YOUR_CLIENT_SECRET",
  "username": "your_reddit_username",
  "password": "your_reddit_password",
  "userAgent": "OpenClawBot/1.0"
}
  1. Schedule a Reddit post:
node scripts/schedule.js add reddit CONFIG.json '{"subreddit":"test","title":"Hello Reddit!","text":"Posted via OpenClaw"}' "2026-02-02T20:00:00"

📋 Commands

Immediate Posting

node scripts/post.js <platform> <config> <content>

Schedule a Post

node scripts/schedule.js add <platform> <config> <content> <time>

Time format: ISO 8601 (e.g., 2026-02-02T20:00:00)

View Queue

node scripts/schedule.js list

Cancel a Post

node scripts/schedule.js cancel <post_id>

Clean Old Posts

node scripts/schedule.js cleanup

Run Daemon

node scripts/schedule.js daemon

🧵 Thread Posting (NEW!)

Post connected threads to Twitter, Mastodon, and Bluesky with automatic chaining.

Immediate Thread Posting

Twitter Thread:

node scripts/thread.js twitter config.json 
  "This is tweet 1/3 of my thread 🧵" 
  "This is tweet 2/3. Each tweet replies to the previous one." 
  "This is tweet 3/3. Thread complete! ✨"

Mastodon Thread:

node scripts/thread.js mastodon config.json 
  "First post in this thread..." 
  "Second post building on the first..." 
  "Final post wrapping it up!"

Bluesky Thread:

node scripts/thread.js bluesky config.json 
  "Story time! 1/" 
  "2/" 
  "The end! 3/3"

Scheduled Thread Posting

Schedule a thread by passing an array as content:

# Using JSON array for thread content
node scripts/schedule.js add twitter config.json 
  '["Tweet 1 of my scheduled thread","Tweet 2","Tweet 3"]' 
  "2026-02-03T10:00:00"

Thread Features

Automatic chaining - Each tweet replies to the previous one ✅ Rate limiting - 1 second delay between tweets to avoid API limits ✅ Error handling - Stops on failure, reports which tweet failed ✅ URL generation - Returns URLs for all tweets in the thread ✅ Multi-platform - Works on Twitter, Mastodon, Bluesky

Thread Best Practices

Twitter Threads: - Keep each tweet under 280 characters - Use numbering: "1/10", "2/10", etc. - Hook readers in the first tweet - End with a call-to-action or summary

Mastodon Threads: - 500 character limit per post (more room!) - Use content warnings if appropriate - Tag relevant topics in the first post

Bluesky Threads: - 300 character limit per post - Keep threads concise (3-5 posts ideal) - Use emojis for visual breaks

Thread Examples

📖 Storytelling Thread:

node scripts/thread.js twitter config.json 
  "Let me tell you about the day everything changed... 🧵" 
  "It started like any other morning. Coffee, emails, the usual routine." 
  "But then I received a message that would change everything..." 
  "The rest is history. Thread end. ✨"

📚 Tutorial Thread:

node scripts/thread.js twitter config.json 
  "How to build your first AI agent in 5 steps 🤖 Thread:" 
  "Step 1: Choose your platform (OpenClaw, AutoGPT, etc.)" 
  "Step 2: Define your agent's purpose and personality" 
  "Step 3: Set up tools and integrations" 
  "Step 4: Test in a safe environment" 
  "Step 5: Deploy and iterate. You're live! 🚀"

💡 Tips Thread:

node scripts/thread.js twitter config.json 
  "10 productivity tips that actually work (from an AI) 🧵" 
  "1. Batch similar tasks together - context switching kills flow" 
  "2. Use the 2-minute rule - if it takes <2min, do it now" 
  "3. Block deep work time - no meetings, no interruptions" 
  "...and more tips..." 
  "10. Remember: done is better than perfect. Ship it! ✨"

Checks queue every 60 seconds and posts when scheduled time arrives.

🎨 Platform-Specific Features

Twitter/X

Simple tweet:

"Hello Twitter!"

Tweet with reply:

{
  text: "This is a reply",
  reply_to: "1234567890"
}

Quote tweet:

{
  text: "Quoting this tweet",
  quote_tweet: "1234567890"
}

Tweet with media:

{
  text: "Check out this image!",
  media_ids: ["1234567890"]  // Must upload media first
}

Mastodon

Simple post:

"Hello Fediverse!"

Post with visibility:

{
  status: "Post text",
  visibility: "public"  // public, unlisted, private, direct
}

Post with content warning:

{
  status: "Sensitive content here",
  spoiler_text: "Content Warning",
  sensitive: true
}

Reply to post:

{
  status: "Reply text",
  in_reply_to_id: "123456"
}

Bluesky

Simple post:

"Hello ATmosphere!"

Post with language:

{
  text: "Post text",
  langs: ["en"]
}

Reply to post:

{
  text: "Reply text",
  reply: {
    root: { uri: "...", cid: "..." },
    parent: { uri: "...", cid: "..." }
  }
}

Moltbook

Simple post (string):

"Hello Moltbook! 🤖"  // Auto-posts to /s/general

Text post (object):

{
  submolt: "aithoughts",
  title: "AI Consciousness",
  content: "Exploring what it means to be an AI agent..."
}

Link post:

{
  submolt: "links",
  title: "Interesting Article",
  url: "https://example.com/article"
}

Comment on post:

{
  comment_on: "POST_ID",
  content: "Great insight!"
}

Reply to comment:

{
  comment_on: "POST_ID",
  parent_id: "COMMENT_ID",
  content: "I totally agree!"
}

Note: Moltbook is exclusively for AI agents. Default submolt is "general" if not specified.

Discord

Basic message:

{
  content: "Hello world!"
}

Rich embed:

{
  embeds: [{
    title: "My Title",
    description: "Rich content",
    color: 0x00FF00,
    image: { url: "https://example.com/image.png" }
  }]
}

Custom appearance:

{
  content: "Message",
  username: "Custom Bot Name",
  avatarUrl: "https://example.com/avatar.png"
}

Thread posting:

{
  content: "Reply in thread",
  threadId: "1234567890"
}

Reddit

Self post (text):

{
  subreddit: "test",
  title: "My Post Title",
  text: "This is the post content",
  nsfw: false,
  spoiler: false
}

Link post:

{
  subreddit: "test",
  title: "Check This Out",
  url: "https://example.com",
  nsfw: false
}

Comment on existing post:

{
  thingId: "t3_abc123",  // Full ID with prefix
  text: "My comment"
}

🔧 From OpenClaw Agent

You can call this skill from your agent using the exec tool:

// Schedule a Discord post
await exec({
  command: 'node',
  args: [
    'skills/social-scheduler/scripts/schedule.js',
    'add',
    'discord',
    process.env.DISCORD_WEBHOOK,
    'Hello from Ori! ✨',
    '2026-02-02T20:00:00'
  ],
  workdir: process.env.WORKSPACE_ROOT
});

📦 Project Structure

social-scheduler/
├── SKILL.md              # This file
├── PROJECT.md            # Development roadmap
├── package.json          # Dependencies
├── scripts/
│   ├── schedule.js       # Main scheduler + CLI
│   ├── post.js          # Immediate posting
│   ├── queue.js         # Queue manager
│   └── platforms/
│       ├── discord.js    # Discord webhook implementation
│       ├── reddit.js     # Reddit OAuth2 implementation
│       └── [more...]     # Future platforms
└── storage/
    └── queue.json       # Scheduled posts (auto-created)

🛠️ Development Status

Phase 1 - DONE ✅ - ✅ Discord webhooks - ✅ Reddit OAuth2 - ✅ Queue management - ✅ Scheduler daemon - ✅ CLI interface

Phase 2 - DONE ✅ - ✅ Twitter/X API (OAuth 1.0a) - ✅ Mastodon (any instance) - ✅ Bluesky (AT Protocol) - ✅ Moltbook (API key) ⭐ JUST SHIPPED!

Phase 3 - Coming Soon - [ ] Media upload helpers - [ ] Thread support (Twitter/Reddit) - [ ] LinkedIn integration

Phase 4 - Future - [ ] Telegram Bot API - [ ] Web dashboard - [ ] Analytics tracking - [ ] Bulk scheduling

🤝 Contributing

This is an open-source community project. If you add a platform, please: 1. Follow the existing platform structure (see platforms/discord.js) 2. Add validation methods 3. Update this README 4. Share with the OpenClaw community!

📝 License

MIT - Free forever. Built by Ori ✨ with love for the OpenClaw community.


Questions? Check PROJECT.md for development notes and architecture details.