Python实现自动写文章发微信公众号

一、项目概述

随着 DeepSeek 等 AI 大模型的普及,我们有了更多有趣的玩法。本文将介绍如何利用 Python 脚本,结合 AI 大模型(以 DeepSeek 为例)和微信公众号 API,实现从文章创作到发布的全自动化流程

核心流程

  1. AI 创作:调用 DeepSeek API,根据热点或指定主题生成文章。
  2. 公众号对接:通过微信公众号 API,获取凭证、上传素材并发布文章。
  3. 自动化整合:将以上步骤串联,实现一键生成并发布。

二、第一步:接入 AI 创作引擎(DeepSeek)

2.1 获取 DeepSeek API Key

  1. 访问 DeepSeek 官方平台
  2. 登录后,进入 API 管理页面,创建一个新的 API Key 并妥善保存。

2.2 创建调用 DeepSeek API 的函数

以下 Python 函数 get_article_from_deepseek 用于向 DeepSeek 发送请求并获取生成的文本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import requests

# DeepSeek API 配置
DEEPSEEK_API_URL = "https://api.deepseek.com/v1/chat/completions"
DEEPSEEK_API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 替换为你的 API Key

def get_article_from_deepseek(my_describe):
"""
调用 DeepSeek API 生成文章。
:param my_describe: 给 AI 的提示词,描述文章要求。
:return: 生成的文本内容,失败则返回 None。
"""
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {DEEPSEEK_API_KEY}"
}
data = {
"model": "deepseek-chat", # 指定模型
"messages": [
{
"role": "user",
"content": my_describe
}
]
}
try:
response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data)
if response.status_code == 200:
result = response.json()
article = result["choices"][0]["message"]["content"]
return article
else:
print(f"DeepSeek 请求失败,状态码:{response.status_code},错误信息:{response.text}")
except requests.RequestException as e:
print(f"DeepSeek 请求发生错误:{e}")
return None

2.3 测试 AI 创作

调用函数,让 AI 根据热点生成一篇公众号风格的文章。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 示例:让 AI 基于近期热点创作
prompt = """
请查询最近三天内的热搜榜,取其中的一个热点,生成一篇公众号文章。
要求:
1. 标题要吸引人,有争议性。
2. 内容完整,结构清晰(有引言、主体、结论)。
3. 不能涉及侵权行为。
4. 输出纯文本,无需 Markdown 格式。
"""
article_content = get_article_from_deepseek(prompt)
if article_content:
print("文章生成成功!")
print(article_content[:500]) # 预览前500字符

效果与成本

  • AI 能快速生成一篇结构完整、风格贴近公众号的文章。
  • 一篇短文的生成成本(输入+输出 tokens)通常不足 1000 tokens,花费极低。


三、第二步:接入微信公众号 API

3.1 获取公众号凭证

  1. 登录 微信公众平台
  2. 进入 开发 -> 基本配置,获取 AppIDAppSecret

    新手建议:首次测试可使用 “开发者工具” 中的 “公众平台测试账号”,功能齐全且无风险。

3.2 创建公众号 API 操作函数

我们需要四个核心函数来处理公众号的访问令牌、素材上传和文章发布。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# 微信公众号配置
WECHAT_APPID = "你的AppID"
WECHAT_APPSECRET = "你的AppSecret"
WECHAT_API_URL = "https://api.weixin.qq.com"

def get_wechat_access_token():
"""获取微信公众号的 access_token。"""
url = f"{WECHAT_API_URL}/cgi-bin/token?grant_type=client_credential&appid={WECHAT_APPID}&secret={WECHAT_APPSECRET}"
try:
response = requests.get(url)
if response.status_code == 200:
result = response.json()
if 'access_token' in result:
return result['access_token']
else:
print(f"获取 access_token 失败,错误信息:{result}")
except requests.RequestException as e:
print(f"获取 access_token 发生错误:{e}")
return None

def upload_cover_image(access_token, image_path):
"""上传封面图片并获取 media_id。"""
url = f"{WECHAT_API_URL}/cgi-bin/media/upload?access_token={access_token}&type=image"
with open(image_path, 'rb') as file:
files = {'media': file}
try:
response = requests.post(url, files=files)
if response.status_code == 200:
result = response.json()
if 'media_id' in result:
return result['media_id']
else:
print(f"上传封面图片失败,错误信息:{result}")
except requests.RequestException as e:
print(f"上传封面图片发生错误:{e}")
return None

def create_article_material(access_token, article, thumb_media_id):
"""将文章内容创建为公众号素材,并返回素材 media_id。"""
url = f"{WECHAT_API_URL}/cgi-bin/media/uploadnews?access_token={access_token}"
# 注意:公众号文章内容需要是 HTML 格式
data = {
"articles": [
{
"title": "AI生成的热点文章", # 文章标题
"thumb_media_id": thumb_media_id, # 封面图片素材 ID
"author": "AI Writer", # 作者
"digest": article[:100] + "...", # 文章摘要(取前100字符)
"show_cover_pic": 0, # 是否在正文显示封面图片
"content": article,
"content_source_url": "" # 原文链接(可留空)
}
]
}
try:
response = requests.post(url, json=data)
if response.status_code == 200:
result = response.json()
if 'media_id' in result:
return result['media_id']
else:
print(f"创建文章素材失败,错误信息:{result}")
except requests.RequestException as e:
print(f"创建文章素材发生错误:{e}")
return None

def publish_article(access_token, media_id):
"""将已创建的素材发布给所有粉丝。"""
url = f"{WECHAT_API_URL}/cgi-bin/message/mass/sendall?access_token={access_token}"
data = {
"filter": {
"is_to_all": True # 发送给所有用户
},
"mpnews": {
"media_id": media_id
},
"msgtype": "mpnews"
}
try:
response = requests.post(url, json=data)
if response.status_code == 200:
result = response.json()
if result.get('errcode') == 0:
print("文章发布成功!")
else:
print(f"文章发布失败,错误信息:{result}")
except requests.RequestException as e:
print(f"文章发布发生错误:{e}")

四、第三步:组装自动化“工厂”

4.1 创建主函数串联流程

将 AI 创作和公众号发布流程整合到一个主函数中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import os

def main():
"""主函数:一键生成并发布文章。"""
print("开始自动创作与发布流程...")

# 1. AI 生成文章
prompt = "请以‘职场人的下班自由’为主题,写一篇800字左右的公众号文章,要求观点鲜明,引发共鸣。"
print("正在调用 AI 生成文章...")
article_content = get_article_from_deepseek(prompt)

if not article_content:
print("文章生成失败,流程终止。")
return

# 2. 处理编码与格式(防止乱码)
# 公众号 API 要求内容为 UTF-8 编码的字符串
article_content = article_content.encode('utf-8').decode('utf-8')
# 可选:将纯文本转换为简单的 HTML 段落格式,以提升公众号阅读体验
html_content = "<p>" + article_content.replace("\n", "</p><p>") + "</p>"

# 3. 获取公众号访问令牌
print("正在获取微信公众号访问令牌...")
access_token = get_wechat_access_token()
if not access_token:
print("获取访问令牌失败,流程终止。")
return

# 4. 上传封面图片(需提前准备一张 cover.jpg)
cover_image_path = "./cover.jpg"
if not os.path.exists(cover_image_path):
print(f"封面图片不存在:{cover_image_path},请准备一张封面图。")
# 此处可以改为使用默认图或跳过
return
print("正在上传封面图片...")
thumb_media_id = upload_cover_image(access_token, cover_image_path)
if not thumb_media_id:
print("上传封面图片失败,流程终止。")
return

# 5. 创建文章素材
print("正在创建公众号文章素材...")
media_id = create_article_material(access_token, html_content, thumb_media_id)
if not media_id:
print("创建文章素材失败,流程终止。")
return

# 6. 发布文章
print("正在发布文章...")
publish_article(access_token, media_id)

print("自动化流程执行完毕!")

if __name__ == "__main__":
main()

4.2 运行与测试

  1. 确保已安装 requests 库:pip install requests
  2. 将代码中的 DEEPSEEK_API_KEYWECHAT_APPIDWECHAT_APPSECRET 替换为你自己的凭证。
  3. 准备一张名为 cover.jpg 的封面图片,放在脚本同目录下。
  4. 运行脚本 python auto_publish.py

成功提示:如果一切顺利,你将在公众号后台的“素材管理”中看到新创建的文章,并且所有粉丝都会收到推送。


五、进阶优化与展望

5.1 当前流程优化

  • 内容格式化:在提示词中要求 AI 直接输出带 HTML 标签的格式,减少后期处理。
  • 错误重试:为网络请求添加重试机制,提高稳定性。
  • 日志记录:将运行状态、生成的文章内容、API 响应等记录到文件,便于排查。
  • 多热点源:结合其他 API(如微博、百度热搜)获取实时热点,作为 AI 的创作素材。

5.2 扩展为“AI 运营管家”

设想一个更强大的自动化系统:

  1. GUI 管理界面:使用 PyQtTkinter 制作可视化控制面板。
  2. 任务调度:使用 APScheduler 库,实现定时任务(如每小时抓取热点,生成文章存入素材池)。
  3. 账号矩阵管理:管理多个公众号,根据账号定位(美食、情感、科技)自动匹配不同风格的文章并发布。
  4. 数据分析与反馈:调用公众号数据接口,分析文章阅读量、点赞数,用 AI 总结规律,并自动调整后续的创作策略(如标题风格、发文时间)。
  5. 全自动化部署:将整套脚本部署到云服务器(如腾讯云、阿里云),实现 7x24 小时无人值守运营。

最终愿景:实现“一人运营百号”,运营者只需定期查看数据报告,与 AI 讨论策略,将重复性工作完全自动化。


六、注意事项

  1. 内容审核:AI 生成的内容需符合平台规范,发布前建议人工审核,避免违规风险。
  2. API 限制:关注 DeepSeek 和微信公众号的 API 调用频率、配额限制。
  3. 版权与伦理:确保生成的内容不侵犯他人版权,注明 AI 辅助创作。
  4. 凭证安全:切勿将 API KeyAppSecret 等敏感信息提交到公开的代码仓库。

通过本文的指南,你可以快速搭建一个属于自己的“AI 小编”系统,探索内容创作自动化的无限可能。