GB-Power-Market-JJ ghost
Manage Ghost CMS blog posts via Admin API. Supports creating, updating, deleting, and listing posts. NEW: Upload images and set feature images for posts. Use when the user needs to programmatically manage Ghost blog content. Requires a JSON configuration file with API credentials.
git clone https://github.com/GeorgeDoors888/GB-Power-Market-JJ
T=$(mktemp -d) && git clone --depth=1 https://github.com/GeorgeDoors888/GB-Power-Market-JJ "$T" && mkdir -p ~/.claude/skills && cp -r "$T/openclaw-skills/skills/alphafactor/ghost" ~/.claude/skills/georgedoors888-gb-power-market-jj-ghost && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/GeorgeDoors888/GB-Power-Market-JJ "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/openclaw-skills/skills/alphafactor/ghost" ~/.openclaw/skills/georgedoors888-gb-power-market-jj-ghost && rm -rf "$T"
openclaw-skills/skills/alphafactor/ghost/SKILL.mdGhost CMS Admin API
Manage your Ghost blog posts programmatically through the Admin API.
Features
- 📝 Create/Update/Delete posts - Full CRUD operations
- 🖼️ Upload images - Upload images to Ghost and get URL
- 🎨 Feature images - Set cover images for posts
- 📊 List posts - View recent posts with status
- 🏷️ Tags support - Add tags to posts
Prerequisites
1. Get Admin API Key
- Log in to your Ghost Admin panel (
)https://your-blog.com/ghost/ - Go to Settings → Integrations
- Click "Add custom integration"
- Copy the Admin API Key (format:
)id:secret
2. Create Configuration File
唯一调用方式:自定义配置文件路径(项目隔离)
Create a JSON config file for your site:
Example:
/Users/ethan/.openclaw/workspace/projects/fuye/ghost-admin.config.json
{ "api_url": "https://fu-ye.com/ghost/api/admin", "admin_api_key": "your-id:your-secret" }
CLI Usage
Method: Custom Config Path (唯一方式)
python3 scripts/ghost.py list --config "../../projects/fuye/ghost-admin.config.json" python3 scripts/ghost.py create "Title" "Content" --config "../../projects/fuye/ghost-admin.config.json" python3 scripts/ghost.py upload image.png --config "../../projects/fuye/ghost-admin.config.json"
Python API Usage
Method: Custom Config Path (唯一方式)
import sys import os sys.path.insert(0, os.path.expanduser("~/.openclaw/workspace/skills/ghost/scripts")) import ghost # 唯一方式:通过配置文件路径获取配置 config = ghost.get_config(config_path="../../projects/fuye/ghost-admin.config.json") # Create post result = ghost.create_post( config=config, title="My Article Title", content="<h1>Title</h1><p>Content...</p>", status="published", tags=["tech", "news"] )
3. Install Dependencies
pip3 install requests pyjwt --user
Python API Usage
Create a Post
import sys import os sys.path.insert(0, os.path.expanduser("~/.openclaw/workspace/skills/ghost/scripts")) import ghost # 通过配置文件路径获取配置(唯一方式) config = ghost.get_config(config_path="../../projects/fuye/ghost-admin.config.json") # Create post with HTML content result = ghost.create_post( config=config, title="My Article Title", content="<h1>Title</h1><p>Content...</p>", # HTML format status="published", # or "draft" tags=["tech", "news"] )
Upload Image
# Upload image and get URL image_url = ghost.upload_image(config, "/path/to/image.jpg") print(f"Image URL: {image_url}")
Create Post with Feature Image
# Upload cover image first cover_image_url = ghost.upload_image(config, "cover.jpg") # Create post with feature image result = ghost.create_post( config=config, title="Article with Cover", content="<p>Article content...</p>", status="published", feature_image=cover_image_url, # Set cover image tags=["featured"] )
List Posts
posts = ghost.list_posts(config, limit=20) for post in posts: print(f"{post['title']} - {post['status']}")
Update Post
ghost.update_post( config=config, post_id="post-id-here", title="New Title", status="published" )
CLI Usage
Setup
# Install dependencies pip3 install requests pyjwt --user
Create a Post
As draft (default):
python3 scripts/ghost.py create "My Article Title" "<p>Article content in HTML</p>" --config "../../projects/fuye/ghost-admin.config.json"
Publish immediately:
python3 scripts/ghost.py create "Breaking News" "<p>Content here</p>" --status published --config "../../projects/fuye/ghost-admin.config.json"
With tags:
python3 scripts/ghost.py create "Tech News" "<p>Content</p>" --status published --tags "tech,news,ai" --config "../../projects/fuye/ghost-admin.config.json"
Upload Image
python3 scripts/ghost.py upload cover.png --config "../../projects/fuye/ghost-admin.config.json"
Update a Post
# Update title python3 scripts/ghost.py update 5f8c3c2e8c3d2e1f3a4b5c6d --title "New Title" --config "../../projects/fuye/ghost-admin.config.json" # Update content python3 scripts/ghost.py update 5f8c3c2e8c3d2e1f3a4b5c6d --content "<p>New content</p>" --config "../../projects/fuye/ghost-admin.config.json" # Publish a draft python3 scripts/ghost.py update 5f8c3c2e8c3d2e1f3a4b5c6d --status published --config "../../projects/fuye/ghost-admin.config.json"
Delete a Post
python3 scripts/ghost.py delete 5f8c3c2e8c3d2e1f3a4b5c6d --config "../../projects/fuye/ghost-admin.config.json"
List Posts
# List 10 most recent posts (default) python3 scripts/ghost.py list --config "../../projects/fuye/ghost-admin.config.json" # List 20 posts python3 scripts/ghost.py list 20 --config "../../projects/fuye/ghost-admin.config.json"
Common Workflows
Publish with Cover Image
import sys import os sys.path.insert(0, os.path.expanduser("~/.openclaw/workspace/skills/ghost/scripts")) import ghost # 唯一方式:通过配置文件路径获取配置 config = ghost.get_config(config_path="../../projects/fuye/ghost-admin.config.json") # Upload cover image image_url = ghost.upload_image(config, "/path/to/cover.jpg") # Create post with cover result = ghost.create_post( config=config, title="Featured Article", content="<p>Article content...</p>", status="published", feature_image=image_url, tags=["featured", "tech"] ) print(f"Published: {result['url']}")
Batch Operations
# List all drafts python3 scripts/ghost.py list 100 --config "../../projects/fuye/ghost-admin.config.json" | grep "🟡" # Update specific post python3 scripts/ghost.py update <id> --tags "featured" --config "../../projects/fuye/ghost-admin.config.json"
API Reference
ghost.get_config(config_path)
唯一方式获取配置。
Parameters:
- Path to JSON configuration file (e.g.,config_path
)"../../projects/fuye/ghost-admin.config.json"
Returns: Config dict with api_url and admin_api_key
ghost.create_post(config, title, content, status='draft', tags=None, feature_image=None)
Create a new post.
Parameters:
- Configuration dict fromconfigget_config(config_path)
- Post titletitle
- HTML contentcontent
- 'draft' or 'published'status
- List of tag namestags
- URL of cover image (optional)feature_image
Returns: Post dict with id, url, status
ghost.upload_image(config, image_path)
Upload an image to Ghost.
Parameters:
- Configuration dictconfig
- Local path to image fileimage_path
Returns: Image URL string
ghost.list_posts(config, limit=10)
List recent posts.
Returns: List of post dicts
ghost.update_post(config, post_id, **kwargs)
Update existing post.
Parameters:
- Post ID to updatepost_id
- New title (optional)title
- New content (optional)content
- New status (optional)status
- New tags (optional)tags
ghost.delete_post(config, post_id)
Delete a post.
Troubleshooting
Error: No module named 'jwt' → Install:
pip3 install pyjwt --user
Error: 401 Unauthorized → Check your Admin API Key is correct and not expired
Error: 404 Not Found → Verify api_url in config file ends with
/ghost/api/admin
Error: Config file not found → Ensure config_path is correct relative to your working directory
Image upload fails → Check image file exists and is under 10MB → Supported formats: JPG, PNG, GIF
References
- API Documentation: references/api.md
- Ghost Official Docs: https://ghost.org/docs/admin-api/