在微信公衆號開發中,使用api都要附加access_token內容。所以,首先須要獲取access_token。以下:json
#獲取微信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 。api
#獲取上傳文件的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的分組)。app
#返回第一個有效的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
下面的代碼用於羣發文本消息,羣發給第一個有效的分組:post
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!'
附錄:在使用微信測試訂閱號測試羣發圖片接口的時候,返回碼以下:url
{u'errcode': 45028, u'errmsg': u'has no masssend quota hint: [OKvFdA0813ge12]'}
這是由於測試訂閱號沒有羣發圖文消息的權限,並非由於接口調用有誤。spa