今天基于客服要求, 需要主动推送一个消息外链接到H5页面, 也是做了几套方案, 做程序猿真的太难了!!!
回到正题:
注册直通车
1. 你需要注册一个微信公众平台的服务号或者订阅号, 我使用的是企业版的
2. 完成之后呢, 需要你去 :开发--基本配置--配置你的 appid 和 appsecret
3. 学会读开发文档,
开发文档
ok 一切就绪以后, 我们首要任务是先获取access_token, 获取token呢就需要用到我们刚刚配置的东西了
import requests
import json
def get_access_token():
"""
获取微信全局接口的凭证(默认有效期俩个小时)
如果不每天请求次数过多, 通过设置缓存即可, 每天的次数限制大概是2000次
"""
# 获取access_token 需要的参数
grant_type = 'client_credential' # 这个固定不变
appid= "appid"
secret="appsecret"
response = requests.get(
url="https://api.weixin.qq.com/cgi-bin/token?grant_type={}&appid={}&secret={}".format(grant_type,appid,secret))
# 如果返回的结果 errcode :40164 表示没有设置ip白名单 复制返回结果里的ip地址 去 基本设置里加上就 ok 了
print(response.json()) #输出请求返回的结果
if response.get("access_token"):
access_token = response.get('access_token')
else:
access_token = None
return access_token
拿到了我们需要的token, 就可以就行消息的推送了, 推送的类型有很多种就不一一讲了, 就演示图文消息 它的类型是 ‘news’
{
def sendmsg():
# 调用函数获取token
access_token = get_access_token()
body = {
"touser": "openid", # 用户的openid
"msgtype":"news", # 发送类型 图文消息
"news":{
"articles": [
{
"url":"url", # 用户点击跳转的外链地址
"picurl":"picurl", # 图片的地址
'title':"josiny 新款!", # 标题
'description': "text", # 内容描述
}
]
}
}
# 请求
response = requests.post(
url="https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={}".format(access_token),
data=bytes(json.dumps(body, ensure_ascii=False), encoding='utf-8')
)
# 这里可根据回执code进行判定是否发送成功(也可以根据code根据错误信息)
res = response.json()
print(res)
问题来了, 上面用户的openid 从哪儿来呢? 没关系,再写一段代码获取关注了本公众号粉丝的openid
def get_openid()
# 这里获取到的是对象, 解析出来的是list 列表包含的openid
# access_token 必须要的
# next_openid 为空的话表示从头开始获取, 不为空的话填写 openid , 也就是说从当前的openid 往后开始获取, 一次请求好像上限是10000条, 所以, 一般用不到哈哈!
openids = requests.get('https://api.weixin.qq.com/cgi-bin/user/get?access_token={}&next_openid='''.format(access_token)).json()
for openid in openids.get('data').get('openid'):
return openid
推送图片类型image , 需要获取media_id , 这里呢也把我测试的代码贴出来, 大家自己研究!
def get_media_id():
img_url = 'https://api.weixin.qq.com/cgi-bin/material/add_material'
payload_img = {
'access_token': access_token,
'type': 'image'
}
data = {'media': open (r"具体图片的path", 'rb' )}
# 请求并返回结果
r = requests.post ( url=img_url, params=payload_img, files=data )
dict = r.json ()
# 输出 media_id 并返回
media_id = dict[ 'media_id' ]
print(media_id)
return media_id
写了这么多, 其实微信最坑的地方就在于, 这一类型的消息推送, 只能限制于用户与公众号互动时间小于24小时的, 如果大于24小时, 那么就将接收不到此类消息!!!
真的是…
太难了…
但是也是有一个能解决的办法, 可以先在公众平台发送一条模板文章的消息, 这样呢也能有效的解决此类问题, 但是具体是不是我们发送了之后, 用户需要点击查看文章才能算是互动, 还是说就需要我们推送一条消息就ok , 这个问题我暂时没有去测试, 如果有大佬知道的可以分享一下经验哦!!
**
- 作者不易, 辛苦码字.... 动动小手给个赞吧!!!!