官方文檔 (由於本人公眾號權限的原因,這一節的大部分例子都沒有測試)
注意:
1、對於認證訂閱號,群發接口每天可成功調用1次,此次群發可選擇發送給全部用戶或某個標簽;
2、對於認證服務號雖然開發者使用高級群發接口的每日調用限制為100次,但是用戶每月只能接收4條,無論在公眾平台網站上,還是使用接口群發,用戶每月只能接收4條群發消息,多於4條的群發將對該用戶發送失敗;
3、開發者可以使用預覽接口校對消息樣式和排版,通過預覽接口可發送編輯好的消息給指定用戶校驗效果;
4、群發過程中,微信后台會自動進行圖文消息原創校驗,請提前設置好相關參數(send_ignore等);
5、開發者可以主動設置 clientmsgid 來避免重復推送。
6、群發接口每分鍾限制請求60次,超過限制的請求會被拒絕。
7、圖文消息正文中插入自己帳號和其他公眾號已群發文章鏈接的能力
關於群發時使用is_to_all為true使其進入公眾號在微信客戶端的歷史消息列表:
1、使用is_to_all為true且成功群發,會使得此次群發進入歷史消息列表。
2、為防止異常,認證訂閱號在一天內,只能使用is_to_all為true進行群發一次,或者在公眾平台官網群發(不管本次群發是對全體還是對某個分組)一次。
以避免一天內有2條群發進入歷史消息列表。
3、類似地,服務號在一個月內,使用is_to_all為true群發的次數,加上公眾平台官網群發(不管本次群發是對全體還是對某個分組)的次數,最多只能是4次。
4、設置is_to_all為false時是可以多次群發的,但每個用戶只會收到最多4條,且這些群發不會進入歷史消息列表。
另外,請開發者注意,本接口中所有使用到media_id的地方,現在都可以使用素材管理中的永久素材media_id了。請但注意,使用同一個素材群發出去的鏈接是一樣的,
這意味着,刪除某一次群發,會導致整個鏈接失效。
群發圖文消息:
1、首先,預先將圖文消息中需要用到的圖片,使用上傳圖文消息內圖片接口,上傳成功並獲得圖片 URL;
def upload_newsurl(self,access_token,picfile): upload_url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=%s'% access_token postData ={ 'media':open(picfile,'rb') } response = requests.post(upload_url,files=postData) return json.loads(response)['url']
2.上傳圖文消息素材,需要用到圖片時,請使用上一步獲取的圖片 URL;
如果需要在群發圖文中插入小程序,則在調用上傳圖文消息素材接口時,需在content字段中添加小程序跳轉鏈接,有以下三種樣式的可供選擇。 小程序卡片跳轉小程序,代碼示例:
文字跳轉小程序,代碼示例:
圖片跳轉小程序,代碼示例:
|
3. 根據標簽進行群發:
def send_massmsg(access_token,postData): send_url ='https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=%s'% access_token response = requests.post(send_url,json.dumps(postData)) return json.loads(response.text)
mpnews | |
text | |
voice | |
image | |
mpvideo | |
卡券消息 | |
視頻消息的media_id需要通過 先上傳視頻,再從素材中獲取得到的media_id為准:
def get_uploadedvideo(self,access_token,media_id,video_title='',video_intro=''): '''為群發視頻消息使用 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html ''' upload_url = 'https://api.weixin.qq.com/cgi-bin/media/uploadvideo?access_token=%s'% access_token postData ={ 'media_id':media_id, "title": video_title, "description": video_intro } result = requests.post(upload_url,json.dumps(postData,ensure_ascii=False).encode('utf-8')) return json.loads(result.text)
返回數據示例(正確時的JSON返回結果):
{ "errcode":0, "errmsg":"send job submission success", "msg_id":34182, "msg_data_id": 206227730 #圖文消息專有 }
預覽消息:
POST數據說明 POST數據示例如下: 圖文消息(其中media_id與根據分組群發中的media_id相同): { "touser":"OPENID", "mpnews":{ "media_id":"123dsdajkasd231jhksad" }, "msgtype":"mpnews" } 文本: { "touser":"OPENID", "text":{ "content":"CONTENT" }, "msgtype":"text" } 語音(其中media_id與根據分組群發中的media_id相同): { "touser":"OPENID", "voice":{ "media_id":"123dsdajkasd231jhksad" }, "msgtype":"voice" } 圖片(其中media_id與根據分組群發中的media_id相同): { "touser":"OPENID", "image":{ "media_id":"123dsdajkasd231jhksad" }, "msgtype":"image" } 視頻(其中media_id與根據分組群發中的media_id相同): { "touser":"OPENID", "mpvideo":{ "media_id":"IhdaAQXuvJtGzwwc0abfXnzeezfO0NgPK6AQYShD8RQYMTtfzbLdBIQkQziv2XJc", }, "msgtype":"mpvideo" } 卡券: { "touser":"OPENID", "wxcard":{ "card_id":"123dsdajkasd231jhksad", "card_ext": "{"code":"","openid":"","timestamp":"1402057159","signature":"017bb17407c8e0058a66d72dcc61632b70f511ad"}" }, "msgtype":"wxcard" } 請注意,上述JSON數據中的touser字段都可以改為towxname,這樣就可以針對微信號進行預覽(而非openID),towxname和touser同時賦值時,以towxname優先。修改后JSON數據如下(以圖文消息為例): 圖文消息: { "towxname":"示例的微信號", "mpnews":{ "media_id":"123dsdajkasd231jhksad" }, "msgtype":"mpnews" }
def preview_massmsg(access_token,postData): '''預覽接口''' send_url = 'https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=%s' % access_token response = requests.post(send_url, json.dumps(postData)) return json.loads(response.text)
刪除消息:
def del_massmsg(access_token,msg_id, article_idx=0): '''只能刪除圖文和視頻消息.收到消息的用戶點擊時會顯示已被刪除''' del_url = 'https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token=%s'% access_token postData={ "msg_id": msg_id, "article_idx": article_idx } response = requests.post(del_url, json.dumps(postData)) return json.loads(response.text)
查詢群發消息發送狀態
def get_massmsg_status(access_token,msg_id): '''查看消息狀態''' send_url = 'https://api.weixin.qq.com/cgi-bin/message/mass/get?access_token=%s' % access_token postData = { "msg_id": msg_id } response = requests.post(send_url, json.dumps(postData)) return json.loads(response.text)
事件推送群發結果
由於群發任務提交后,群發任務可能在一定時間后才完成,因此,群發接口調用時,僅會給出群發任務是否提交成功的提示,若群發任務提交成功,則在群發任務結束時,會向開發者在公眾平台填寫的開發者URL(callback URL)推送事件。
需要注意,由於群發任務徹底完成需要較長時間,將會在群發任務即將完成的時候,就推送群發結果,此時的推送人數數據將會與實際情形存在一定誤差
推送的XML結構如下(發送成功時),已增加原創校驗結果和群發圖文的url:
<xml> <ToUserName><![CDATA[gh_4d00ed8d6399]]></ToUserName> <FromUserName><![CDATA[oV5CrjpxgaGXNHIQigzNlgLTnwic]]></FromUserName> <CreateTime>1481013459</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[MASSSENDJOBFINISH]]></Event> <MsgID>1000001625</MsgID> <Status><![CDATA[err(30003)]]></Status> <TotalCount>0</TotalCount> <FilterCount>0</FilterCount> <SentCount>0</SentCount> <ErrorCount>0</ErrorCount> <CopyrightCheckResult> <Count>2</Count> <ResultList> <item> <ArticleIdx>1</ArticleIdx> <UserDeclareState>0</UserDeclareState> <AuditState>2</AuditState> <OriginalArticleUrl><![CDATA[Url_1]]></OriginalArticleUrl> <OriginalArticleType>1</OriginalArticleType> <CanReprint>1</CanReprint> <NeedReplaceContent>1</NeedReplaceContent> <NeedShowReprintSource>1</NeedShowReprintSource> </item> <item> <ArticleIdx>2</ArticleIdx> <UserDeclareState>0</UserDeclareState> <AuditState>2</AuditState> <OriginalArticleUrl><![CDATA[Url_2]]></OriginalArticleUrl> <OriginalArticleType>1</OriginalArticleType> <CanReprint>1</CanReprint> <NeedReplaceContent>1</NeedReplaceContent