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登录Dr.com思路以及代码分享
Jun 25 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
PyQt5每天必学之切换按钮
Aug 20 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
python自动发送测试报告邮件功能的实现
Jan 22 Python
Python TestCase中的断言方法介绍
May 02 Python
python向字符串中添加元素的实例方法
Jun 28 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 Python
pandas数值排序的实现实例
Jul 25 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实现MVC开发得最简单的方法――模型
2007/04/10 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
php自动加载方式集合
2016/04/04 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
js下弹出窗口的变通
2007/04/18 Javascript
Ext面向对象开发实践(续)
2008/11/18 Javascript
csdn 批量接受好友邀请
2009/02/19 Javascript
ie focus bug 解决方法
2009/09/03 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
python实现排序算法
2014/02/14 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
Python中pillow知识点学习
2018/04/30 Python
浅谈Python爬虫基本套路
2019/03/25 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
Python logging模块原理解析及应用
2020/08/13 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
倩碧美国官网:Clinique美国
2016/07/20 全球购物
态度决定一切演讲稿
2014/05/20 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
学生个人评语大全
2015/01/04 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL