167 lines
5.1 KiB
Python
167 lines
5.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
WordPress 内容发布工具
|
|
简化的内容发布脚本
|
|
"""
|
|
|
|
import os
|
|
import requests
|
|
from requests.auth import HTTPBasicAuth
|
|
from dotenv import load_dotenv
|
|
from datetime import datetime
|
|
|
|
# 加载环境变量
|
|
load_dotenv()
|
|
|
|
class WordPressPublisher:
|
|
def __init__(self):
|
|
self.wp_url = os.getenv('WORDPRESS_URL')
|
|
self.wp_user = os.getenv('WORDPRESS_USERNAME')
|
|
self.wp_password = os.getenv('WORDPRESS_APP_PASSWORD')
|
|
|
|
if self.wp_password:
|
|
self.wp_password = self.wp_password.replace(" ", "")
|
|
|
|
if not all([self.wp_url, self.wp_user, self.wp_password]):
|
|
raise ValueError("请在 .env 文件中配置 WORDPRESS_URL, WORDPRESS_USERNAME, WORDPRESS_APP_PASSWORD")
|
|
|
|
self.api_url = f"{self.wp_url.rstrip('/')}/wp-json/wp/v2"
|
|
self.auth = HTTPBasicAuth(self.wp_user, self.wp_password)
|
|
|
|
def publish_post(self, title, content, excerpt="", categories=None, tags=None, status="publish"):
|
|
"""
|
|
发布文章
|
|
|
|
Args:
|
|
title (str): 文章标题
|
|
content (str): 文章内容 (HTML)
|
|
excerpt (str): 文章摘要
|
|
categories (list): 分类ID列表
|
|
tags (list): 标签ID列表
|
|
status (str): 文章状态 (draft, publish, private)
|
|
|
|
Returns:
|
|
dict: 创建的文章信息
|
|
"""
|
|
post_data = {
|
|
'title': title,
|
|
'content': content,
|
|
'excerpt': excerpt,
|
|
'status': status
|
|
}
|
|
|
|
if categories:
|
|
post_data['categories'] = categories
|
|
if tags:
|
|
post_data['tags'] = tags
|
|
|
|
response = requests.post(
|
|
f"{self.api_url}/posts",
|
|
json=post_data,
|
|
auth=self.auth
|
|
)
|
|
|
|
if response.status_code == 201:
|
|
post = response.json()
|
|
print(f"✅ 文章发布成功!")
|
|
print(f" 标题: {post['title']['rendered']}")
|
|
print(f" 链接: {post['link']}")
|
|
print(f" 状态: {post['status']}")
|
|
return post
|
|
else:
|
|
print(f"❌ 文章发布失败: {response.status_code}")
|
|
print(f" 错误信息: {response.text}")
|
|
return None
|
|
|
|
def get_categories(self):
|
|
"""获取所有分类"""
|
|
response = requests.get(f"{self.api_url}/categories")
|
|
if response.status_code == 200:
|
|
return response.json()
|
|
return []
|
|
|
|
def get_tags(self):
|
|
"""获取所有标签"""
|
|
response = requests.get(f"{self.api_url}/tags")
|
|
if response.status_code == 200:
|
|
return response.json()
|
|
return []
|
|
|
|
def create_category(self, name, description=""):
|
|
"""创建新分类"""
|
|
category_data = {
|
|
'name': name,
|
|
'description': description
|
|
}
|
|
|
|
response = requests.post(
|
|
f"{self.api_url}/categories",
|
|
json=category_data,
|
|
auth=self.auth
|
|
)
|
|
|
|
if response.status_code == 201:
|
|
category = response.json()
|
|
print(f"✅ 分类创建成功: {category['name']} (ID: {category['id']})")
|
|
return category
|
|
else:
|
|
print(f"❌ 分类创建失败: {response.status_code}")
|
|
return None
|
|
|
|
def create_tag(self, name, description=""):
|
|
"""创建新标签"""
|
|
tag_data = {
|
|
'name': name,
|
|
'description': description
|
|
}
|
|
|
|
response = requests.post(
|
|
f"{self.api_url}/tags",
|
|
json=tag_data,
|
|
auth=self.auth
|
|
)
|
|
|
|
if response.status_code == 201:
|
|
tag = response.json()
|
|
print(f"✅ 标签创建成功: {tag['name']} (ID: {tag['id']})")
|
|
return tag
|
|
else:
|
|
print(f"❌ 标签创建失败: {response.status_code}")
|
|
return None
|
|
|
|
def main():
|
|
"""示例用法"""
|
|
try:
|
|
wp = WordPressPublisher()
|
|
|
|
# 示例:发布一篇文章
|
|
title = f"测试文章 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
|
content = """
|
|
<h2>这是一个测试文章</h2>
|
|
<p>这是文章的内容。你可以使用 HTML 标签来格式化内容。</p>
|
|
<ul>
|
|
<li>支持列表</li>
|
|
<li>支持链接和图片</li>
|
|
<li>支持各种 HTML 元素</li>
|
|
</ul>
|
|
"""
|
|
excerpt = "这是一个通过 API 发布的测试文章"
|
|
|
|
# 发布为草稿,避免直接发布到生产环境
|
|
result = wp.publish_post(
|
|
title=title,
|
|
content=content,
|
|
excerpt=excerpt,
|
|
status="draft" # 使用 "publish" 来直接发布
|
|
)
|
|
|
|
if result:
|
|
print(f"\n📝 文章ID: {result['id']}")
|
|
print(f"🔗 编辑链接: {result['link'].replace('?preview=true', '')}")
|
|
|
|
except Exception as e:
|
|
print(f"❌ 错误: {e}")
|
|
|
|
if __name__ == "__main__":
|
|
main() |