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


Posted in Python onJune 30, 2017

本文实例讲述了Python实现的微信公众号群发图片与文本消息功能。分享给大家供大家参考,具体如下:

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

#获取微信access_token
def 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_ID
def 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 分组id
def 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

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

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_token
import json
#获取微信access_token
def 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_ID
def 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 分组id
def 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
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()
  print result
  #根据返回码的内容是否为0判断是否成功
  return result['errcode']==0
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
if(send_txt_to_first_group("祝你合家欢乐,幸福美满!")):
  print 'success!'
else:
  print 'fail!'

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

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

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

PS:

作者的github: https://github.com/zhoudayang

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
Python函数式编程
Jul 20 Python
Python编程之序列操作实例详解
Jul 22 Python
python将回车作为输入内容的实例
Jun 23 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
python小白切忌乱用表达式
May 29 Python
Python logging自定义字段输出及打印颜色
Nov 30 Python
Python加密与解密模块hashlib与hmac
Jun 05 Python
python实现给微信公众号发送消息的方法
Jun 30 #Python
Python信息抽取之乱码解决办法
Jun 29 #Python
python urllib urlopen()对象方法/代理的补充说明
Jun 29 #Python
python笔记:mysql、redis操作方法
Jun 28 #Python
老生常谈Python序列化和反序列化
Jun 28 #Python
python flask实现分页效果
Jun 27 #Python
Django自定义分页效果
Jun 27 #Python
You might like
用函数读出数据表内容放入二维数组
2006/10/09 PHP
一个取得文件扩展名的函数
2006/10/09 PHP
一个好用的分页函数
2006/11/16 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
PHP中“=>
2019/03/01 PHP
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
一看就懂:jsonp详解
2015/06/01 Javascript
javascript创建含数字字母的随机字符串方法总结
2016/08/01 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
vue调用高德地图实例代码
2017/04/28 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
python uuid模块使用实例
2015/04/08 Python
Python中用于返回绝对值的abs()方法
2015/05/14 Python
python用户管理系统
2018/03/13 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
python创建学生管理系统
2019/11/22 Python
Pycharm IDE的安装和使用教程详解
2020/04/30 Python
python SOCKET编程基础入门
2021/02/27 Python
电气专业推荐信范文
2013/11/18 职场文书
自荐书封面下载
2013/11/29 职场文书
学习党课思想汇报
2013/12/29 职场文书
转党组织关系介绍信
2014/01/08 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
简单租房协议书
2014/10/21 职场文书
师德师风个人总结
2015/02/06 职场文书
民事起诉书范本
2015/05/19 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python