分享

Python实现的微信公众号群发图片与文本消息功能实例详解

 网海拾贝网络猪 2018-01-30


在微信公众号开发中,使用api都要附加access_token内容。因此,首先需要获取access_token。如下:

#获取微信access_tokendef get_token(): payload_access_token={ 'grant_type':'client_credential', 'appid':'xxxxxxxxxxxxx', 'secret':'xxxxxxxxxxxxx' } token_url='https://api.weixin.qq.com/cgi-bin/token' r=requests.get(token_url,params=payload_access_token) dict_result= (r.json()) return dict_result['access_token']

在群发图片时,需要提供已经上传图片的media_id。注意,群发图片的时候,必须使用接口:https://api.weixin.qq.com/cgi-bin/material/add_material

#获取上传文件的media_ID#群发图片的时候,必须使用该api提供的media_IDdef get_media_ID(path): img_url='https://api.weixin.qq.com/cgi-bin/material/add_material' payload_img={ 'access_token':get_token(), 'type':'image' } data ={'media':open(path,'rb')} r=requests.post(url=img_url,params=payload_img,files=data) dict =r.json() return dict['media_id']

订阅号进行群发,必须通过分组id,首先需要获取所有的用户分组情况。

#查询所有用户分组信息def get_group_id(): url='https://api.weixin.qq.com/cgi-bin/groups/get' payload_id={ 'access_token':get_token() } r=requests.get(url=url,params=payload_id) result=r.json() return result['groups']

需要选择一个分组进行群发,在这里我选择第一个有效的分组进行群发(即第一个分组用户数不为0的分组)。

#返回第一个有效的group 分组iddef get_first_group_id(): groups =get_group_id() group_id =0 for group in groups: if(group['count']!=0): group_id=group['id'] break; return group_id

下面的代码用于群发文本消息,群发给第一个有效的分组:

平台出租
短信验证码接口
订货系统
python 爬虫
订单管理系统
python学习路线
客户管理系统
手机短信验证码
def send_txt_to_first_group(str='Hello World!'): group_id =get_first_group_id() pay_send_all={ 'filter':{ 'is_to_all':False, 'group_id':group_id }, 'text':{ 'content':str }, 'msgtype':'text' } url='https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token='+get_token() #需要指定json编码的时候不会对中文转码为unicode,否则群发的消息会显示为unicode码,不能正确显示 r=requests.post(url=url,data=json.dumps(pay_send_all,ensure_ascii=False,indent=2))#此处的必须指定此参数 result=r.json() #根据返回码的内容是否为0判断是否成功 return result['errcode']==0

下面的代码用于群发图片,群发给第一个有效的分组。

def send_img_to_first_group(path='/home/fit/Desktop/test.jpg'): group_id =get_first_group_id() pay_send_all={ 'filter':{ 'is_to_all':False, 'group_id':group_id }, 'image':{ 'media_id':get_media_ID(path) }, 'msgtype':'image' } url='https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token='+get_token() r=requests.post(url=url,data=json.dumps(pay_send_all)) result=r.json() #根据返回码的内容是否为0判断是否成功 return result['errcode']==0

以下是所有代码:

# -*- coding: utf-8 -*-import requests#首先获取access_tokenimport json#获取微信access_tokendef get_token(): payload_access_token={ 'grant_type':'client_credential', 'appid':'xxxxxxxxxx', 'secret':'xxxxxxxxx' } token_url='https://api.weixin.qq.com/cgi-bin/token' r=requests.get(token_url,params=payload_access_token) dict_result= (r.json()) return dict_result['access_token']#获取上传文件的media_ID#群发图片的时候,必须使用该api提供的media_IDdef get_media_ID(path): img_url='https://api.weixin.qq.com/cgi-bin/material/add_material' payload_img={ 'access_token':get_token(), 'type':'image' } data ={'media':open(path,'rb')} r=requests.post(url=img_url,params=payload_img,files=data) dict =r.json() return dict['media_id']#查询所有用户分组信息def get_group_id(): url='https://api.weixin.qq.com/cgi-bin/groups/get' payload_id={ 'access_token':get_token() } r=requests.get(url=url,params=payload_id) result=r.json() return result['groups']#返回第一个有效的group 分组iddef get_first_group_id(): groups =get_group_id() group_id =0 for group in groups: if(group['count']!=0): group_id=group['id'] break; return group_iddef send_img_to_first_group(path='/home/fit/Desktop/test.jpg'): group_id =get_first_group_id() pay_send_all={ 'filter':{ 'is_to_all':False, 'group_id':group_id }, 'image':{ 'media_id':get_media_ID(path) }, 'msgtype':'image' } url='https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token='+get_token() r=requests.post(url=url,data=json.dumps(pay_send_all)) result=r.json() print result #根据返回码的内容是否为0判断是否成功 return result['errcode']==0def send_txt_to_first_group(str='Hello World!'): group_id =get_first_group_id() pay_send_all={ 'filter':{ 'is_to_all':False, 'group_id':group_id }, 'text':{ 'content':str }, 'msgtype':'text' } url='https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token='+get_token() #需要指定json编码的时候不会对中文转码为unicode,否则群发的消息会显示为unicode码,不能正确显示 r=requests.post(url=url,data=json.dumps(pay_send_all,ensure_ascii=False,indent=2))#此处的必须指定此参数 result=r.json() #根据返回码的内容是否为0判断是否成功 return result['errcode']==0if(send_txt_to_first_group('祝你合家欢乐,幸福美满!')): print 'success!'else: print 'fail!'

附录:在使用微信测试订阅号测试群发图片接口的时候,返回码如下:

{u'errcode': 45028, u'errmsg': u'has no masssend quota hint: [OKvFdA0813ge12]'}

这是因为测试订阅号没有群发图文消息的权限,并不是因为接口调用有误。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多