单机版、定时生成文章和分平台发布,以下是优化后的解决方案及代码示例:
---
### **推荐方案:APScheduler + 内置调度逻辑**
选择 **APScheduler** 是最佳方案,原因:
1. **轻量级**:纯 Python 实现,无需额外服务(如 Redis/Celery Worker)。
2. **精准调度**:支持 Cron 式定时任务(如每天 3 点生成、8 点发布)。
3. **单机友好**:直接嵌入代码中,适合打包成 exe。
4. **可控性**:能直接操作 SQLite 数据库,处理不同平台的参数化需求。
---
### **代码实现框架**
#### 1. 项目结构
```bash
your_tool/
├── main.py # 主程序入口
├── scheduler.py # 调度器配置
├── article_generator.py # 生成文章模块
├── wechat_publisher.py # 微信发布模块
├── other_publisher.py # 其他平台发布模块
└── database.db # SQLite 数据库
```
#### 2. 核心代码实现
##### 2.1 主程序 (`main.py`)
```python
import logging
from apscheduler.schedulers.blocking import BlockingScheduler
from scheduler import setup_scheduler
if __name__ == "__main__":
# 配置日志
logging.basicConfig(level=logging.INFO)
# 初始化调度器
scheduler = BlockingScheduler()
setup_scheduler(scheduler)
try:
scheduler.start()
except KeyboardInterrupt:
scheduler.shutdown()
logging.info("程序已安全退出")
```
##### 2.2 调度器配置 (`scheduler.py`)
```python
from apscheduler.triggers.cron import CronTrigger
from article_generator import generate_articles
from wechat_publisher import wechat_publish_job
from other_publisher import other_platform_publish_job
def setup_scheduler(scheduler):
# 每天 3:00 生成文章
scheduler.add_job(
generate_articles,
trigger=CronTrigger(hour=3, minute=0),
kwargs={"max_articles": 5} # 生成数量可配置
)
# 微信每天 8:00 发布(每天最多 2 篇)
scheduler.add_job(
wechat_publish_job,
trigger=CronTrigger(hour=8, minute=0),
kwargs={"max_per_day": 2, "interval_minutes": 30}
)
# 其他平台(如知乎)每天 9:00 发布(参数不同)
scheduler.add_job(
other_platform_publish_job,
trigger=CronTrigger(hour=9, minute=0),
kwargs={"platform": "zhihu", "max_per_day": 3}
)
```
##### 2.3 文章生成模块 (`article_generator.py`)
```python
import sqlite3
from datetime import datetime
def generate_articles(max_articles=5):
conn = sqlite3.connect('database.db', check_same_thread=False)
cursor = conn.cursor()
# 生成 AI 文章的逻辑(示例)
for _ in range(max_articles):
article_content = "AI 生成的文章内容..." # 实际调用你的 AI 生成代码
cursor.execute('''
INSERT INTO articles (content, generated_time, is_published, platform)
VALUES (?, ?, 0, 'unassigned')
''', (article_content, datetime.now()))
conn.commit()
conn.close()
```
##### 2.4 微信发布模块 (`wechat_publisher.py`)
```python
import sqlite3
import time
def wechat_publish_job(max_per_day=2, interval_minutes=30):
conn = sqlite3.connect('database.db', check_same_thread=False)
cursor = conn.cursor()
# 查找未发布的微信文章
cursor.execute('''
SELECT id, content FROM articles
WHERE is_published = 0 AND platform = 'wechat'
LIMIT ?
''', (max_per_day,))
articles = cursor.fetchall()
for idx, (article_id, content) in enumerate(articles):
# 调用微信 API 发布(伪代码)
publish_to_wechat(content)
# 标记为已发布
cursor.execute('''
UPDATE articles SET is_published = 1 WHERE id = ?
''', (article_id,))
# 间隔等待(如 30 分钟)
if idx < len(articles) - 1:
time.sleep(interval_minutes * 60)
conn.commit()
conn.close()
def publish_to_wechat(content):
# 实际调用微信 SDK 的代码
print(f"[微信] 发布文章: {content[:20]}...")
```
---
### **关键设计说明**
1. **集中式调度**
使用 `APScheduler` 统一管理所有任务,避免各模块自己控制时间,提高可维护性。
2. **参数化配置**
- 通过 `kwargs` 传递不同平台的参数(如 `max_per_day`、`interval_minutes`)。
- 平台差异通过数据库字段 `platform` 区分。
3. **数据库线程安全**
SQLite 连接时设置 `check_same_thread=False`,确保多线程任务能安全访问。
4. **打包成 exe 的注意事项**
- 使用 `pyinstaller` 打包时添加 `--hidden-import=apscheduler.schedulers.blocking`。
- 测试后台运行是否稳定(无界面模式可通过 `pythonw.exe` 运行)。
---
### **替代方案对比**
| 方案 | 优点 | 缺点 | 适合场景 |
|---------------------|--------------------------|--------------------------|---------------------|
| **APScheduler** | 轻量、易嵌入、Cron 支持 | 需保持主进程运行 | 单机 exe 小工具 |
| Windows 任务计划 | 无需代码修改 | 跨平台兼容性差 | 仅 Windows 环境 |
| 代码内 Sleep 轮询 | 简单 | 精度低、资源占用高 | 极简单需求 |
---
### **最终建议**
- 选择 **APScheduler**,代码清晰且可扩展。
- 在打包 exe 时,确保主程序以 `BlockingScheduler` 运行(阻塞主线程保持进程活跃)。
- 不同平台的发布逻辑通过 `platform` 字段和独立 Job 函数分离。