Python藉助企業微信羣機器人推送消息和文件

  企業微信功能日益強大,騰訊官方也提供了豐富的API供開發者實現企業微信的很多自動化場景。比如,如何給某個企業微信羣發送消息、圖片或者文件,甚至@指定羣用戶?別急,看小爬君輕鬆教會大家。

Step1:在企業微信PC端或者移動端找幾個用戶創建一個企業微信羣(步驟略過);

STEP2:在企業微信羣中添加一個【羣機器人】;

  點擊企業微信羣聊天界面,點擊右上角【···】按鈕,然後點擊【添加羣機器人】,如下圖所示:

  

 

 

 

   然後,我們在該企業微信羣就能看到羣成員【羣機器人】了,在羣成員界面,鼠標懸停在該【羣機器人】位置,就可以看到該機器人的具體信息,如下圖所示:

 

   有了上面的兩個步驟,這樣一個專屬的羣機器人就創建好了,其中上圖中的Webhook屬性(url地址)是該機器人的關鍵信息,類似於機器人ID。

現在我們來看下如何用該羣機器人往羣裏發消息,發圖片,發文件。想要看完整的企業微信API文檔的,請移步【騰訊企業微信開發者中心】頁面:羣機器人配置說明 - 文檔 - 企業微信開發者中心 (qq.com)

一、發送文本類型數據

{
    "msgtype": "text",
    "text": {
        "content": "廣州今日天氣:29度,大部分多雲,降雨概率:60%",
        "mentioned_list":["wangqing","@all"],
        "mentioned_mobile_list":["13800001111","@all"]
    }
}
參數是否必填說明
msgtype 消息類型,此時固定爲text
content 文本內容,最長不超過2048個字節,必須是utf8編碼
mentioned_list userid的列表,提醒羣中的指定成員(@某個成員),@all表示提醒所有人,如果開發者獲取不到userid,可以使用mentioned_mobile_list
mentioned_mobile_list 手機號列表,提醒手機號對應的羣成員(@某個成員),@all表示提醒所有人

 

用python來實現的代碼示例如下:

 1 import os,re,time,datetime,base64,requests,json
 2 from requests_toolbelt import MultipartEncoder
 3 import json
 4 
 5 def SendGroupMsg(textContent, webHookUrl, mentioned_list=[],mentioned_mobile_list=[]):
 6     """
 7     發送微信羣組機器人消息
 8     :param textContent: 消息內容
 9     :param webHookUrl: 羣組機器人WebHook
10     :param mentioned_list: userid的列表,提醒羣中的指定成員(@某個成員),@all表示提醒所有人
11     :param mentioned_mobile_list: 手機號列表,提醒手機號對應的羣成員(@某個成員),@all表示提醒所有人
12     :return:
13     """
14     # url爲羣組機器人WebHook,配置項
15     url = webHookUrl
16     headers = {
17         "content-type": "application/json"
18     }
19     msg = {"msgtype": "text", 
20     "text": {
21         "content": textContent, 
22         "mentioned_list":mentioned_list,
23         "mentioned_mobile_list": mentioned_mobile_list
24         }}  # 發送文本消息
25     # 由於API接收的是json字符串,故需要轉化一下
26     data = json.dumps(msg, ensure_ascii=False).encode('utf-8')
27     # 發送請求
28     try:
29         result = requests.post(url, headers=headers, data=data)
30         return True
31     except Exception as e:
32         # print("Requset Failed:", e)
33         return False

二、發送羣文件

{
    "msgtype": "file",
    "file": {
         "media_id": "3a8asd892asd8asd"
    }
}

在發送文件之前,我們需要請求如下接口,獲取到media_id參數。

文件上傳接口

素材上傳得到media_id,該media_id僅三天內有效
media_id只能是對應上傳文件的機器人可以使用

請求方式:POST(HTTPS
請求地址:https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=KEY&type=TYPE

使用multipart/form-data POST上傳文件, 文件標識名爲"media"
參數說明:

參數必須說明
key 調用接口憑證, 機器人webhookurl中的key參數
type 固定傳file

POST的請求包中,form-data中媒體文件標識,應包含有 filename、filelength、content-type等信息

filename標識文件展示的名稱。比如,使用該media_id發消息時,展示的文件名由該字段控制

有了這兩個接口的API,用python來實現【發送羣文件】就不是難題了:

import os,re,time,datetime,base64,requests,json
from requests_toolbelt import MultipartEncoder
from urllib import parse
import json

def SendGroupFile(filepath, webHookUrl): """ 發送微信羣組機器人文件 :param filepath: 文件路徑 :param webHookUrl: 羣組機器人WebHook :return: """ # url爲羣組機器人WebHook,配置項 url = webHookUrl headers = { "content-type": "application/json" } # 發送文件需要先上傳文件獲取media_id media_id = UploadFile(filepath, url) req_json = dict() req_json["msgtype"] = "file" req_json["file"] = dict() req_json["file"]["media_id"] = media_id # 發送請求 try: result = requests.post(url, headers=headers, json=req_json) return True except Exception as e: print("企業微信機器人發送文件失敗,詳細信息:" + str(e)) return False def UploadFile(filepath, webHookUrl): """ 企業微信機器人上傳文件,發送文件前需要先上傳--要求文件大小在5B~20M之間 :param filepath: 文件路徑 :param webHookUrl: 羣組機器人WebHook :return: media_id """ # url爲羣組機器人WebHook,配置項 url = webHookUrl params = parse.parse_qs( parse.urlparse( webHookUrl ).query ) webHookKey=params['key'] upload_url = f'https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key={webHookKey}&type=file' headers = {"Accept": "application/json, text/plain, */*", "Accept-Encoding": "gzip, deflate", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36"} filename = os.path.basename(filepath) try: multipart = MultipartEncoder( fields={'filename': filename, 'filelength': '', 'name': 'media', 'media': (filename, open(filepath, 'rb'), 'application/octet-stream')}, boundary='-------------------------acebdf13572468') headers['Content-Type'] = multipart.content_type resp = requests.post(upload_url, headers=headers, data=multipart) json_res = resp.json() if json_res.get('media_id'): # print(f"企業微信機器人上傳文件成功,file:{filepath}") return json_res.get('media_id') except Exception as e: # print(f"企業微信機器人上傳文件失敗,file: {filepath}, 詳情:{e}") print("企業微信機器人上傳文件失敗,詳細信息:" + str(e)) return ""

  感興趣的童鞋,快動手試試吧!

  快來掃碼關注我的公衆號 獲取更多爬蟲、數據分析的知識!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章