Install
openclaw skills install phy-social-postPost 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.
openclaw skills install phy-social-postPost to multiple social media platforms via the unified social posting API with automatic provider fallback.
Location: [your-project-root]/social-posting-api/
Environment:
cd [your-project-root]/social-posting-api
source venv/bin/activate
Required env vars in .env:
POSTFORME_API_KEY - Primary provider (PostForMe)LATE_API_KEY - Fallback provider (LATE)from social_posting import SocialPostingClient
from dotenv import load_dotenv
load_dotenv()
client = SocialPostingClient()
print("Providers:", client.available_providers)
for acc in client.get_accounts():
print(f" {acc.platform}: {acc.username}")
result = client.post(
content="Your post content here",
platforms=["twitter", "linkedin"]
)
print(f"Success: {result.success}, Provider: {result.provider}")
result = client.post(
content="Check out these photos!",
platforms=["instagram"],
media_urls=[
"https://example.com/image1.jpg",
"https://example.com/image2.jpg"
]
)
from datetime import datetime
result = client.post(
content="Scheduled post",
platforms=["linkedin"],
scheduled_for=datetime(2025, 1, 15, 9, 0) # UTC
)
| Platform | Text Only | With Media | Notes |
|---|---|---|---|
| Twitter/X | ✅ | ✅ | 280 char limit |
| ✅ | ✅ | Best for professional content | |
| ❌ | ✅ | Requires media | |
| ✅ | ✅ | ||
| TikTok | ❌ | ✅ | Video preferred |
| Threads | ✅ | ✅ | |
| Bluesky | ✅ | ✅ | |
| ❌ | ✅ | Requires media | |
| YouTube | ❌ | ✅ | Video only |
#!/usr/bin/env python
"""Post to social media platforms."""
import sys
sys.path.insert(0, '[your-project-root]/social-posting-api')
from social_posting import SocialPostingClient
from dotenv import load_dotenv
load_dotenv('[your-project-root]/social-posting-api/.env')
def post_to_social(content: str, platforms: list, media_urls: list = None):
"""Post content to specified platforms."""
client = SocialPostingClient()
# Check which platforms are connected
accounts = client.get_accounts()
connected = [a.platform for a in accounts]
# Filter to only connected platforms
valid_platforms = [p for p in platforms if p in connected]
if not valid_platforms:
print(f"No connected accounts for: {platforms}")
print(f"Connected: {connected}")
return None
# Post
result = client.post(
content=content,
platforms=valid_platforms,
media_urls=media_urls
)
if result.success:
print(f"Posted via {result.provider}")
print(f" Post ID: {result.post_id}")
else:
print(f"Failed: {result.error}")
return result
# Example usage
if __name__ == "__main__":
post_to_social(
content="Hello from the social posting API!",
platforms=["instagram"],
media_urls=["https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080"]
)
Always check what's connected first:
cd [your-project-root]/social-posting-api
source venv/bin/activate && python -c "
from social_posting import SocialPostingClient
from dotenv import load_dotenv
load_dotenv()
client = SocialPostingClient()
for acc in client.get_accounts():
print(f'{acc.platform}: {acc.username}')
"
source venv/bin/activate && python -c "
from social_posting import SocialPostingClient
from dotenv import load_dotenv
load_dotenv()
client = SocialPostingClient()
result = client.post(
content='''Your content here''',
platforms=['platform1', 'platform2'],
media_urls=['https://example.com/image.jpg'] # Optional
)
print(f'Success: {result.success}')
print(f'Provider: {result.provider}')
print(f'Post ID: {result.post_id}')
"
To connect Twitter or other platforms:
.env will auto-detect new accounts| Error | Cause | Solution |
|---|---|---|
| "No connected accounts" | Platform not linked | Connect via provider dashboard |
| "Instagram requires media" | Text-only post | Add at least 1 image URL |
| "HTTP 401" | Invalid API key | Check .env file |
| "All providers failed" | Both providers down | Try again later |
For open source announcements:
# Post to developer platforms
result = client.post(
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",
platforms=["twitter", "linkedin"]
)
For visual content:
# Instagram carousel
result = client.post(
content="Behind the scenes of building [Your Product]",
platforms=["instagram"],
media_urls=[
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
"https://example.com/image3.jpg"
]
)
Canlah AI — Run performance marketing without breaking your brand.