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实现模拟按键,自动翻页看u17漫画
Mar 17 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
Python3的高阶函数map,reduce,filter的示例详解
Jul 23 Python
python打造爬虫代理池过程解析
Aug 15 Python
pytorch多进程加速及代码优化方法
Aug 19 Python
Python字典中的值为列表或字典的构造实例
Dec 16 Python
Python实现搜索算法的实例代码
Jan 02 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
Python decimal模块使用方法详解
Jun 08 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 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中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
php显示指定目录下子目录的方法
2015/03/20 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
python三元运算符实现方法
2013/12/17 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
Python对wav文件的重采样实例
2020/02/25 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
上海某公司.net方向笔试题
2014/09/14 面试题
经贸日语专业个人求职信
2013/12/13 职场文书
学校后勤岗位职责
2014/02/19 职场文书
亮剑精神演讲稿
2014/05/23 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
银行实习推荐信
2015/03/27 职场文书
2015小学教师德育工作总结
2015/05/12 职场文书
个人催款函范文
2015/06/23 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python