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         }}  # 发送文本消息27     # 发送请求
28     try:
29         result = requests.post(url, headers=headers, json=msg)
30         return True
31     except Exception as e:
32         # print("Requset Failed:", e)
33         return False

 

二、发送图片

 

图片类型

 

{
    "msgtype": "image",
    "image": {
        "base64": "DATA",
		"md5": "MD5"
    }
}
 
参数是否必填说明
msgtype 消息类型,此时固定为image
base64 图片内容的base64编码
md5 图片内容(base64编码前)的md5值

 

注:图片(base64编码前)最大不能超过2M,支持JPG,PNG格式
基于API文档,我们需要用python中特定模块得到图片的base64编码以及md5值,具体示例代码如下:
import os,re,time,datetime,base64,requests,json,json,hashlib
from requests_toolbelt import MultipartEncoder
from urllib import parse

def sendImg(imgPath,webHookUrl):
    """
    发送微信群组机器人图片
    图片支持jpg,png两种格式,大小不能超过2Mb
    :param imgPath: 图片的本地路径
    :param webHookUrl: 群组机器人WebHook
    :return:
    """
    # url为群组机器人WebHook,配置项
    url = webHookUrl
    with open(imgPath,"rb") as f:
        fd=f.read()
        base64Content=str(base64.b64encode(fd),"utf-8")
    with open(imgPath,"rb") as f:
        fd=f.read()
        md = hashlib.md5()
        md.update(fd)
        md5Content = md.hexdigest()
    headers = {"content-type": "application/json"}
    msg = {"msgtype": "image","image": {"base64": base64Content,"md5": md5Content}}
    # 发送请求
    try:
        result = requests.post(url, headers=headers, json=msg)
        return True
    except Exception as e:
        # print("Requset Failed:", e)
        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 QYWXSendGroupFile(filepath, url):
    """
    发送微信群组机器人文件
    :param filepath: 文件路径
    :param url: 群组机器人WebHook
    :return:
    """
    # url为群组机器人WebHook,配置项
    url = url
    headers = {
        "content-type": "application/json"
    }
    # 发送文件需要先上传文件获取media_id
    media_id = UploadFile(filepath, url)
    msg={"msgtype":"file","file":{"media_id":media_id}}
    # 发送请求
    try:
        result = requests.post(url, headers=headers, json=msg)
        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'][0]
    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 ""

  感兴趣的童鞋,快动手试试吧!

  快来扫码关注我的公众号 获取更多爬虫、数据分析的知识!

posted @ 2023-02-03 16:40  NewJune  阅读(11590)  评论(0编辑  收藏  举报