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中常用的九种预处理方法分享
Sep 11 Python
Python 在字符串中加入变量的实例讲解
May 02 Python
tensorflow使用神经网络实现mnist分类
Sep 08 Python
Python构建图像分类识别器的方法
Jan 12 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
pytorch 加载(.pth)格式的模型实例
Aug 20 Python
Python-openCV读RGB通道图实例
Jan 17 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
python中线程和进程有何区别
Jun 17 Python
Python如何实现Paramiko的二次封装
Jan 30 Python
python 实现mysql自动增删分区的方法
Apr 01 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
PHP中GET变量的使用
2006/10/09 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
php数组使用规则分析
2015/02/27 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
Python中的作用域规则详解
2015/01/30 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
python自动化生成IOS的图标
2018/11/13 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
Python操作Jira库常用方法解析
2020/04/10 Python
Python 如何创建一个线程池
2020/07/28 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
Python Django路径配置实现过程解析
2020/11/05 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
2014年三八妇女节活动总结
2014/03/01 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
运动会通讯稿600字
2015/07/20 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
oracle重置序列从0开始递增1
2022/02/28 Oracle