zoukankan      html  css  js  c++  java
  • 利用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]'}

      这是因为测试订阅号没有群发图文消息的权限,并不是因为接口调用有误。

      

  • 相关阅读:
    Javascript中的sort()语法浅谈
    Javascript变量提升解释
    ES5中新增的Array方法详细说明
    Codewars-Javascript训练手册:正则表达式(Regular Expressions)
    Codewars-Javascript训练手册:Date 对象
    JavaScript与Java的关系(联系与区别)
    《Javascript秘密花园》学习笔记(终)
    (转)深入理解最强桌面地图控件GMAP.NET ---高德地图
    (转)深入理解最强桌面地图控件GMAP.NET --- 原理篇
    (转)深入理解最强桌面地图控件GMAP.NET --- SOSO地图
  • 原文地址:https://www.cnblogs.com/zhoudayang/p/5301918.html
Copyright © 2011-2022 走看看