title: 结尾推荐文章

最近,我在公众号上注意到有些账号每天发布的内容非常相似,就像是新闻简报一样,如下图所示,这让我好奇,这些内容是不是通过某种自动化方式发布的呢?

带着这些疑问,我满怀好奇地打开了微信公众号的开发文档。令人高兴的是,文档中详细介绍了一些用于图文创建和发布的接口功能。

有了这些接口,实现您想要的功能就会变得轻松许多啦。废话不多说,跟着我教程一起来实现吧。

分析实现原理

  1. 可以通过使用现有的API接口或自己动手编写爬虫程序来收集你感兴趣的内容哦。
  2. 然后呢,可以将这些内容转换成HTML格式,让它们看起来更加美观易读。
  3. 接下来就是根据微信公众号开发文档,编写一些接口,实现自动创建图文和发送图文功能。
  4. 最后一步就是设置定时任务,让你的精彩图文能够按时自动发布出去!

代码实现

获取最新热点

为了更高效地完成任务,我选择利用一些现有的API接口。今天我想分享一个我经常使用且非常实用的免费API资源。这个网站提供了多种类型的接口服务,覆盖了生活信息、新闻资讯等多个领域,真的非常全面且方便!

我们采用该网址中的每日早报接口,该接口会返回15条全球新闻速报,每日微语数据。而且该接口是免费,每天有100次的请求,足够我们使用了。

使用方式也很简单,先个人中心->token管理中创建一个token,如下图所示:

有了token,就可以编写函数调用该接口了。关键代码如下:

import requests
url = "https://v3.alapi.cn/api/zaobao"
payload = {
    "token": "请在token管理生成token",
    "format": "json"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.json())

创建一个微信公众号工具类

利用Python语言编写一个微信公众号工具类,功能包括获取access_token、上传图片、创建图文和发布图文功能。

  • 操作微信公众号所有功能前提,先要获取access_token,如下是获取access_token的关键代码
def get_access_token(self, force_refresh=False):
    """获取微信access_token,带缓存机制"""
    # 如果token未过期且不需要强制刷新,则返回现有token
    if not force_refresh and self.access_token and time.time() < self.token_expires:
        return self.access_token

        url = "https://api.weixin.qq.com/cgi-bin/token"
    params = {
        "grant_type": "client_credential",
        "appid": self.appid,
        "secret": self.appsecret
    }

    try:
        response = requests.get(url, params=params)
        response.raise_for_status()
        data = response.json()

        if "access_token" in data:
            self.access_token = data["access_token"]
            # 提前5分钟过期,防止边界情况
            self.token_expires = time.time() + data["expires_in"] - 300
            return self.access_token
        else:
            raise Exception(f"获取access_token失败: {data}")
    except Exception as e:
        raise Exception(f"获取access_token异常: {str(e)}")

获取access_token需要在微信公众号后台,添加白名单的。设置如下图

  • 创建公众号图文信息,需要封面图片,如下是把封面图上传到公众号的素材库中,上传成功后会返回两个参数,一个是media_id,另外一个是url
def upload_image(self, image_path, is_online=False):
    """上传永久图片素材,返回media_id和url"""
    url = "https://api.weixin.qq.com/cgi-bin/material/add_material"
    params = {
        "access_token": self.get_access_token(),
        "type": "image"
    }

    try:
        if is_online:
            # 处理在线图片
            response = requests.get(image_path)
            response.raise_for_status()
            files = {"media": (Path(image_path).name, response.content)}
        else:
            # 处理本地图片
            with open(image_path, "rb") as f:
                files = {"media": (Path(image_path).name, f)}

            response = requests.post(url, params=params, files=files)
        response.raise_for_status()
        data = response.json()

        if "media_id" in data:
            return {
                "media_id": data["media_id"],
                "url": data.get("url", "")
            }
        else:
            raise Exception(f"上传图片失败: {data}")
    except Exception as e:
        raise Exception(f"上传图片异常: {str(e)}")
  • 有了封面图片,我们就可以创建图文草稿。以下是创建图文的关键代码:
    def create_draft(self, articles):
        """创建图文草稿"""
        url = "https://api.weixin.qq.com/cgi-bin/draft/add"
        params = {
            "access_token": self.get_access_token()
        }
        
        payload = {
            "articles": articles
        }
        
        try:
            response = requests.post(
                url,
                params=params,
                data=json.dumps(payload, ensure_ascii=False).encode("utf-8")
            )
            response.raise_for_status()
            data = response.json()
            
            if data.get("errcode", 0) == 0:
                return data["media_id"]
            else:
                raise Exception(f"创建草稿失败: {data}")
        except Exception as e:
            raise Exception(f"创建草稿异常: {str(e)}")
  • 创建好图文草稿,我们就可以编写发布图文草稿的接口了。以下是关键代码
    def public_article(self, media_id):
        """发布草稿为正式文章"""
        url = "https://api.weixin.qq.com/cgi-bin/material/publish_draft"
        params = {
            "access_token": self.get_access_token()
        }
        
        payload = {
            "media_id": media_id
        }
        
        try:
            response = requests.post(
                url,
                params=params,
                data=payload
            )
            response.raise_for_status()
            data = response.json()
        except requests.exceptions.RequestException as e:
            raise Exception(f"发布草稿异常: {str(e)}")

渲染成HMTL内容

在之前的文章介绍过一款MD2CARD的软件,我们可以利用它这些好看的卡片样式。选择一款自己喜欢的样式,把它导出为html格式,如下图所示:

然后,编写一个把工具类,把获取的内容渲染成好看的样式。关键代码如下:

# 新增模板渲染模块
class TemplateRenderer:
    def __init__(self):
        # 设置模板目录
        self.env = Environment(
            loader=FileSystemLoader("templates"),
            autoescape=True,
            trim_blocks=True,
            lstrip_blocks=True
        )
        
    def render_news(self, data: dict) -> str:
        """渲染新闻模板"""
        template = self.env.get_template("template_2.html")
        return template.render(**data)

项目演示

本项目会全部开源的,感兴趣的小伙伴可以关注后私信回复“脚本链接”即可获取。

该项目的目录结构如下:

.
├── main.py
├── templates
│   ├── card_template.html
│   ├── template_1.html
│   └── template_2.html
└── utils
    ├── WeChatOfficialAccount.py
    ├── __init__.py
    └── zaobao.py

使用之前,在该项目根目录添加一个.env文件添加微信公众号的APP_IDAPP_SECRET,还有ALAPI_TOKEN等信息,内容如下:

APP_ID=""
APP_SECRET=""
ALAPI_TOKEN =""r

执行如下命令:

python3 main.py

执行成功后,会输出如下结果

2025-04-26 17:17:25,325 - INFO - 成功获取新的 access_token
2025-04-26 17:17:26,994 - INFO - 图片上传成功,media_id: SZ1CVdaOa4k4y5g_OyoRPYl41CTXDs6WIzf3f9f3AyHbNfzo6xaD_zYafsCSf_Zg
2025-04-26 17:17:27,000 - INFO - 使用缓存的 access_token
2025-04-26 17:17:29,372 - INFO - 草稿创建成功,media_id: SZ1CVdaOa4k4y5g_OyoRPeq0Lvh6C8-uh-uF1vn5btYuURZyEjyx9HJ7x2Oowb7M

然后,登录公众号后台会看出新增了一个图文信息。如下:

推荐文章