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程序中自定义异常的方法
Oct 16 Python
python中正则的使用指南
Dec 04 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
详解flask表单提交的两种方式
Jul 21 Python
在ipython notebook中使用argparse方式
Apr 20 Python
Python判断字符串是否为合法标示符操作
Sep 03 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 Python
python的setattr函数实例用法
Dec 16 Python
python 获取计算机的网卡信息
Feb 18 Python
浅谈Python列表嵌套字典转化的问题
Apr 07 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
实用函数7
2007/11/08 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
php微信支付接口开发程序
2016/08/02 PHP
Yii核心验证器api详解
2016/11/23 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
python轻松实现代码编码格式转换
2015/03/26 Python
pygame学习笔记(4):声音控制
2015/04/15 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
python3中函数参数的四种简单用法
2018/07/09 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
就业自荐信
2013/12/04 职场文书
董事长秘书职责
2014/01/31 职场文书
房屋出售协议书
2014/04/10 职场文书
小学教师师德整改措施
2014/09/29 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
CSS3常见动画的实现方式
2021/04/14 HTML / CSS
vue+spring boot实现校验码功能
2021/05/27 Vue.js
关于HTML编码导致的乱码问题
2021/09/04 HTML / CSS