大家好,我是淘小白~

最新接了一个更新公众号的订单,根据客户要求来写的,因为是第一次根据公众号进行api进行开发,避免以后遗忘,现整理一篇文章出来,方便自己以后查阅,有感兴趣的朋友可以收藏一下!

1、编程语言:Python

2、获取Access token

必要操作:提取 AppSecret、AppID;把自己的ip加入到白名单

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

Access token有时效性,需要定时刷新,编写代码的时候,直接每次都获取一次即可。

2.1获取Access token方法代码如下:
def get_access_token(AppSecret, AppID):
    url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}'.format(
        AppID, AppSecret)
    response = requests.get(url)
    res_html = response.json()
    # print(res_html)
    access_token = res_html['access_token']
    return access_token
2.2官方对于Access token的具体说明:

公众平台的API调用所需的access_token的使用及生成方式说明:

1、建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;

2、目前access_token的有效期通过返回的expires_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;

3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

4、对于可能存在风险的调用,在开发者进行获取 access_token调用时进入风险调用确认流程,需要用户管理员确认后才可以成功获取。具体流程为:

开发者通过某IP发起调用->平台返回错误码[89503]并同时下发模板消息给公众号管理员->公众号管理员确认该IP可以调用->开发者使用该IP再次发起调用->调用成功。

如公众号管理员第一次拒绝该IP调用,用户在1个小时内将无法使用该IP再次发起调用,如公众号管理员多次拒绝该IP调用,该IP将可能长期无法发起调用。平台建议开发者在发起调用前主动与管理员沟通确认调用需求,或请求管理员开启IP白名单功能并将该IP加入IP白名单列表。

公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-设置与开发--基本配置”页中获得(需要已经成为开发者,且账号没有异常状态)。**调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。**小程序无需配置IP白名单。

如长期无AppSecret的使用需求,开发者可以使用管理员账号登录公众平台,在“设置与开发-基本配置”中对AppSeceret进行冻结,提高账号的安全性。AppSecret冻结后,开发者无法使用AppSecret获取Access token(接口返回错误码40243),不影响账号基本功能的正常使用,不影响通过第三方授权调用后台接口,不影响云开发调用后台接口。开发者可以随时使用管理员账号登录公众平台,在“设置与开发-基本配置”中对AppSecret进行解冻。

 

3、上传图片素材(永久素材)

3.1 官方说明:

对于常用的素材,开发者可通过本接口上传到微信服务器,永久使用。新增的永久素材也可以在公众平台官网素材管理模块中查询管理。

请注意:

1、最近更新:永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。

2、公众号的素材库保存总数量有上限:图文消息素材、图片素材上限为100000,其他类型为1000。

3、素材的格式大小等要求与公众平台官网一致:

图片(image): 10M,支持bmp/png/jpeg/jpg/gif格式

语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr格式

视频(video):10MB,支持MP4格式

缩略图(thumb):64KB,支持JPG格式

4、图文消息的具体内容中,微信后台将过滤外部的图片链接,图片url需通过"上传图文消息内的图片获取URL"接口上传图片获取。

5、"上传图文消息内的图片获取URL"接口所上传的图片,不占用公众号的素材库中图片数量的100000个的限制,图片仅支持jpg/png格式,大小必须在1MB以下。

6、图文消息支持正文中插入自己账号和其他公众号已群发文章链接的能力。

上传图文消息内的图片获取URL


本接口所上传的图片不占用公众号的素材库中图片数量的100000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。

接口调用请求说明:


http请求方式: POST,https协议 https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN 调用示例(使用curl命令,用FORM表单方式上传一个图片): curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"

3.2 Python图片上传代码方法:
ef push_image(access_token, image_path):
    media_type = "image"
    upload_url = f"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={access_token}&type={media_type}"

    with open(image_path, 'rb') as file:
        response = requests.post(upload_url, files={'media': (image_path, file)})

    # 解析响应
    result = response.json()
    # print(result)
    if 'media_id' in result:
        media_id = result['media_id']
        img_url = result['url']
        print(f"上传成功,media_id: {media_id}, img_url: {img_url}")
        return media_id, img_url
    else:
        print(f"上传失败,错误信息: {result['errmsg']}")

上面方法会返回两个参数,一个是media_id ,这个是字段可以用于缩略图,而且微信公众号的图文信息,必须得有缩略图这个字段,一个是img_url,这个是图片的路径,可以用于文章内部调用。

4、必须先发布到草稿箱

开发者可新增常用的素材到草稿箱中进行使用。上传到草稿箱中的素材被群发或发布后,该素材将从草稿箱中移除。新增草稿可在公众平台官网-草稿箱中查看和管理。

4.1 接口请求说明:


http 请求方式:POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN

4.2 调用示例:
{
    "articles": [
        {
            "title":TITLE,
            "author":AUTHOR,
            "digest":DIGEST,
            "content":CONTENT,
            "content_source_url":CONTENT_SOURCE_URL,
            "thumb_media_id":THUMB_MEDIA_ID,
            "need_open_comment":0,
            "only_fans_can_comment":0,
            "pic_crop_235_1":X1_Y1_X2_Y2,
            "pic_crop_1_1":X1_Y1_X2_Y2
        }
        //若新增的是多图文素材,则此处应还有几段articles结构
    ]
}
4.3 参数说明
参数是否必须说明
title标题
author作者
digest图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前54个字。
content图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。
content_source_url图文消息的原文地址,即点击“阅读原文”后的URL
thumb_media_id图文消息的封面图片素材id(必须是永久MediaID)
need_open_commentUint32 是否打开评论,0不打开(默认),1打开
only_fans_can_commentUint32 是否粉丝才可评论,0所有人可评论(默认),1粉丝才可评论
pic_crop_235_1封面裁剪为2.35:1规格的坐标字段。以原始图片(thumb_media_id)左上角(0,0),右下角(1,1)建立平面坐标系,经过裁剪后的图片,其左上角所在的坐标即为(X1,Y1),右下角所在的坐标则为(X2,Y2),用分隔符_拼接为X1_Y1_X2_Y2,每个坐标值的精度为不超过小数点后6位数字。示例见下图,图中(X1,Y1) 等于(0.1945,0),(X2,Y2)等于(1,0.5236),所以请求参数值为0.1945_0_1_0.5236。
pic_crop_1_1封面裁剪为1:1规格的坐标字段,裁剪原理同pic_crop_235_1,裁剪后的图片必须符合规格要求。

4.4 返回参数

{
   "media_id":MEDIA_ID
}

这个media_id 一定要保存,想要后面把文章发布出去,需要用到这个media_id

4.5 python代码方法:
def push_draft(access_token, title, content, media_id):
    url = 'https://api.weixin.qq.com/cgi-bin/draft/add?access_token={}'.format(access_token)
    data = {
        "articles": [
            {
                "title": title,
                "content": content,
                "thumb_media_id": media_id,
                "need_open_comment": 0,
                "only_fans_can_comment": 0
            }
        ]
    }
    headers = {'Content-Type': 'application/json'}
    response = requests.post(url, data=json.dumps(data, ensure_ascii=False).encode('utf-8'), headers=headers)
    rt_data = response.json()
    # print(rt_data)
    tw_media_id = rt_data['media_id']
    return tw_media_id

access_token:access_token

 title:文章标题

content,:文章内容

media_id:缩略图media_id,这里不是img_url

5、草稿箱文章发布

前面我们新建到草稿箱之后,会返回一个media_id ,我们拿着这个media_id,在把文章发布出去。

5.1 接口说明:

开发者需要先将图文素材以草稿的形式保存(见“草稿箱/新建草稿”,如需从已保存的草稿中选择,见“草稿箱/获取草稿列表”),选择要发布的草稿 media_id 进行发布

http 请求方式:POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token=ACCESS_TOKEN

5.2 调用示例
{
    "media_id": MEDIA_ID
}
5.3 请求参数说明
参数是否必须说明
access_token调用接口凭证
media_id要发布的草稿的media_id
 5.4 返回示例
{
   "errcode":0,
   "errmsg":"ok",
   "publish_id":"100000001",
}
5.5 返回参数说明
参数说明
errcode错误码
errmsg错误信息
publish_id发布任务的id
msg_data_id消息的数据ID

 请注意:正常情况下调用成功时,errcode将为0,此时只意味着发布任务提交成功,并不意味着此时发布已经完成,所以,仍有可能在后续的发布过程中出现异常情况导致发布失败,如原创声明失败、平台审核不通过等。

5.6 错误码
错误码错误信息解决方案
53503该草稿未通过发布检查检查下草稿信息
53504需前往公众平台官网使用草稿
53505请手动保存成功后再发表请前往公众平台官网手动保存成功后再发表
5.7公共错误码

 微信公众号公共错误码一览表

5.8 Python代码示例:
def push_data(wz_media_id, access_token):
    url = 'https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token={}'.format(access_token)
    data = {
    "media_id": wz_media_id
}
    response = requests.post(url, json=data)
    fb_data = response.json()
    msg = fb_data['errmsg']
    return msg

通过以上方法基本可以搞定微信公众号批量发文了,还要注意一点,就是api接收的数据都是json格式的。

新建草稿箱测试成功截图!

还有,我们在通过api发布文章的时候,文章想要带样式,可以去拷贝别人的样式拿过来用,图片网址和文字替换成自己的就可以了,亲测是没有问题的!

有需要公众号批量发文定制脚本的朋友可以联系作者! ❤ TXB2196

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐