— 配置部分 —

我无法直接访问外部互联网、操作你的 WordPress 网站或写入数据库。作为一个人工智能助手,我没有执行网页抓取、图像生成或直接与 CMS 系统交互的权限。

不过,我可以为你提供完成此任务所需的 **Python 脚本逻辑** 和 **WordPress REST API 接口调用指南**。你可以将这些代码部署在本地服务器上,配合必要的库(如 `requests`, `Pillow` 等)来实现自动化流程。

以下是实现该需求的步骤和代码框架:

### 1. 前置准备
你需要安装以下 Python 库:
“`bash
pip install requests Pillow
“`

### 2. 核心逻辑说明
1. **获取仓库列表**:由于 GitHub 搜索 API 有速率限制,且 `eooce/transfer-api` 是一个特定仓库,你可能需要搜索相关的关键词(如 "transfer api", "file transfer")来获取类似的高星项目。如果仅指该单一仓库,则无法“排序”。假设你是想采集 *相关* 的高星项目,我将展示如何搜索并排序。
2. **去重检查**:连接你的 WordPress 数据库或使用 WP REST API 查询现有文章,检查 `meta_key` 中是否已包含该 GitHub URL。
3. **生成封面图**:使用 `Pillow` 库创建一个 600×450 的 JPG 图片,将仓库名称、Stars 数量和 GitHub 链接以文字形式绘制在图上。
4. **发布文章**:通过 WordPress REST API (`/wp-json/wp/v2/posts`) 创建文章,将生成的图片设置为_featured_image_(需要先上传图片),并将正文内容填入。

### 3. Python 实现代码示例

“`python
import requests
from PIL import Image, ImageDraw, ImageFont
import json
import os
import time

# — 配置部分 —
GITHUB_TOKEN = "your_github_token_here" # 建议添加 Token 以提高速率限制
WP_URL = "https://your-wordpress-site.com" # 替换为你的 WordPress 地址
WP_USER = "your_username"
WP_PASSWORD = "your_application_password" # 推荐使用应用专用密码

# 搜索关键词,因为单个仓库无法排序,这里假设搜索相关项目
SEARCH_QUERY = "transfer-api stars:>100"

def get_github_repos(query):
"""从 GitHub API 获取相关仓库并按 Stars 排序"""
headers = {"Authorization": f"token {GITHUB_TOKEN}"}
url = f"https://api.github.com/search/repositories?q={query}&sort=stars&order=desc&per_page=10"
response = requests.get(url, headers=headers)

if response.status_code == 200:
items = response.json().get('items', [])
return items
else:
print(f"GitHub API Error: {response.status_code}")
return []

def check_duplicate_in_wp(repo_url):
"""检查 WordPress 中是否已存在包含该 GitHub 链接的文章"""
# 注意:实际生产中可能需要更复杂的搜索逻辑,这里简化为查询所有文章或特定 meta 键
# 由于 WP REST API 搜索 meta 较复杂,建议先获取所有文章 ID 或通过自定义字段查询
# 这里提供一个简化的思路:查询包含该 URL 的文章
params = {
'search': repo_url,
'per_page': 100
}
auth = (WP_USER, WP_PASSWORD)
response = requests.get(f"{WP_URL}/wp-json/wp/v2/posts", params=params, auth=auth)

if response.status_code == 200:
posts = response.json()
for post in posts:
if repo_url in post.get('content', {}).get('rendered', ''):
return True
return False

def generate_cover(repo_name, stars, repo_url):
"""生成 600×450 的 JPG 封面图"""
width, height = 600, 450
image = Image.new('RGB', (width, height), color=(73, 109, 137)) # 背景色
draw = ImageDraw.Draw(image)

# 尝试加载字体,如果没有则使用默认字体
try:
font = ImageFont.truetype("arial.ttf", 20)
font_title = ImageFont.truetype("arial.ttf", 28)
except:
font = ImageFont.load_default()
font_title = font

# 绘制标题
draw.text((20, 20), repo_name, fill=(255, 255, 255), font=font_title)

# 绘制 Stars
draw.text((20, 80), f"Stars: {stars}", fill=(255, 255, 255), font=font)

# 绘制 URL (换行处理)
url_lines = [repo_url[i:i+40] for i in range(0, len(repo_url), 40)]
y_pos = 120
for line in url_lines:
draw.text((20, y_pos), line, fill=(255, 255, 255), font=font)
y_pos += 25

# 保存为 JPG
filename = f"cover_{int(time.time())}.jpg"
image.save(filename, "JPEG")
return filename

def upload_image_to_wp(image_path):
"""上传封面图到 WordPress 媒体库并返回 ID"""
auth = (WP_USER, WP_PASSWORD)
files = {'file': open(image_path, 'rb')}
response = requests.post(f"{WP_URL}/wp-json/wp/v2/media", files=files, auth=auth)

if response.status_code == 201:
return response.json().get('id')
else:
print(f"Image Upload Error: {response.status_code}, {response.text}")
return None

def create_wordpress_post(title, content, featured_image_id):
"""创建 WordPress 文章"""
auth = (WP_USER, WP_PASSWORD)
post_data = {
'title': title,
'content': content,
'status': 'publish',
'featured_media': featured_image_id
}
response = requests.post(f"{WP_URL}/wp-json/wp/v2/posts", json=post_data, auth=auth)

if response.status_code == 201:
print(f"Post created successfully with ID: {response.json().get('id')}")
return True
else:
print(f"Post Creation Error: {response.status_code}, {response.text}")
return False

def main():
print("Fetching repositories…")
repos = get_github_repos(SEARCH_QUERY)

if not repos:
return

for repo in repos:
repo_name = repo['full_name']
stars = repo['stargazers_count']
repo_url = repo['html_url']

# 1. 检查重复
if check_duplicate_in_wp(repo_url):
print(f"Skipping duplicate: {repo_url}")
continue

# 2. 生成封面
cover_path = generate_cover(repo_name, stars, repo_url)
print(f"Cover generated: {cover_path}")

# 3. 上传图片
media_id = upload_image_to_wp(cover_path)
if not media_id:
continue

# 4. 构建正文内容
content = f"""
<h2>Project: {repo_name}</h2>
<p><strong>Stars:</strong> {stars}</p>
<p><a href="{repo_url}" target="_blank">View on GitHub</a></p>
<p>{repo.get('description', 'No description available.')}</p>
"""

# 5. 发布文章
create_wordpress_post(f"GitHub Project: {repo_name}", content, media_id)

# 清理临时文件
os.remove(cover_path)
time.sleep(1) # 避免速率限制

if __name__ == "__main__":
main()
“`

### 4. 注意事项
1. **GitHub API 限制**:未认证的请求每小时仅限 60 次。建议使用个人访问令牌(Personal Access Token)。
2. **WordPress 应用密码**:从 WordPress 5.0 开始,基本身份验证已被弃用。请使用“用户 -> 个人资料 -> 应用程序密码”生成一个专用密码。
3. **数据库写入**:上述代码通过 REST API 间接写入数据库。如果需要直接写入数据库,请谨慎操作,并确保正确转义数据以防止 SQL 注入。
4. **图片处理**:`Pillow` 生成的图片是基础文本覆盖。如需更美观的设计,建议使用模板引擎或专门的图像处理服务。
5. **重复判断**:当前的重复判断是通过搜索文章正文实现的。对于大量数据,建议在 WordPress 中添加一个自定义字段(Custom Field)存储 GitHub URL,并通过 `meta_query` 进行高效查询。

请根据你的具体环境调整配置参数。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容