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完全新手教程
Feb 08 Python
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
python中的随机函数小结
Jan 27 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
Django 缓存配置Redis使用详解
Jul 23 Python
python实现图片上添加图片
Nov 26 Python
Python 简单计算要求形状面积的实例
Jan 18 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
Jan 25 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
Mar 10 Python
降低python版本的操作方法
Sep 11 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
Oct 10 Python
梳理总结Python开发中需要摒弃的18个坏习惯
Jan 22 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
谈一谈收音机的高放电路
2021/03/02 无线电
PHPlet在Windows下的安装
2006/10/09 PHP
比较strtr, str_replace和preg_replace三个函数的效率
2013/06/26 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
在vue中使用jointjs的方法
2018/03/24 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
python切换hosts文件代码示例
2013/12/31 Python
提升Python程序运行效率的6个方法
2015/03/31 Python
python实现红包裂变算法
2016/02/16 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
使用Python对Excel进行读写操作
2017/03/30 Python
python处理按钮消息的实例详解
2017/07/11 Python
python计算日期之间的放假日期
2018/06/05 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
文科毕业生自荐书范文
2014/04/17 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
物业接待员岗位职责
2015/04/15 职场文书
刑事法律意见书
2015/06/04 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
2019年幼儿园家长接送责任书
2019/10/29 职场文书
Javascript设计模式之原型模式详细
2021/10/05 Javascript