Python实现企业微信群机器人创建与交互的详细教程

这是一份关于如何使用 Python 创建和交互企业微信群机器人的教程。

企业微信群机器人简介

企业微信允许在内部群聊中添加机器人(Bot),这些机器人可以通过接收特定格式的 HTTP POST 请求(Webhook)来发送消息到群里。这使得我们可以通过编程(例如使用 Python)自动发送通知、报告、提醒等到指定的企业微信群。

核心步骤

  1. 在企业微信群中添加机器人并获取 Webhook 地址。
  2. 使用 Python 编写代码,向该 Webhook 地址发送 HTTP POST 请求。
  3. 根据企业微信机器人 API 的要求,构造不同类型的消息(文本、Markdown、图片等)。

教程详解

第一步:在企业微信群中创建机器人并获取 Webhook 地址

  1. 选择群聊: 在你的企业微信客户端(PC 或 移动端)中,选择你想要添加机器人的那个内部群聊。
  2. 添加机器人:
  3. PC 端: 点击群聊右上角的 “…” 图标 -> 选择 “添加机器人” -> 选择 “新创建一个机器人”。
  4. 移动端: 点击群聊右上角的群成员/设置图标 -> 选择 “群机器人” -> 点击 “添加机器人”。
  5. 设置机器人: 给你的机器人起一个名字,(可选)设置一个头像。
  6. 获取 Webhook 地址: 创建成功后,你会看到一个 Webhook地址这个地址非常重要,相当于机器人的唯一标识和通信入口,请务必复制并妥善保管,不要泄露给他人。 任何人拿到这个地址都能向你的群聊发送消息。
  7. 完成: 点击 “完成”。此时机器人就已经添加到群聊中了。

第二步:准备 Python 环境

你需要安装 requests 库来发送 HTTP 请求。如果尚未安装,可以使用 pip 安装:

pip install requests

第三步:使用 Python 发送消息

企业微信机器人接收的是 JSON 格式的数据。你需要构造符合其规范的 JSON,并通过 POST 请求发送。

1. 发送文本消息 (Text)

这是最简单的消息类型。

import requests
import json

# 1. 替换为你的 Webhook 地址
webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_UNIQUE_ROBOT_KEY" # <--- 把这里换成你机器人的实际 Webhook Key

# 2. 构建请求数据(文本类型)
#    参考文档: https://developer.work.weixin.qq.com/document/path/91770#%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF
payload = {
    "msgtype": "text",
    "text": {
        "content": "大家好,我是Python机器人!\nHello from Python Bot!",
        # 可以 @ 指定成员 (@all 表示 @所有人)
        # "mentioned_list": ["wangqing", "@all"], # 成员 企业微信帐号列表
        # "mentioned_mobile_list": ["13800001111", "@all"] # 成员 手机号列表 (注意: 手机号必须在企业通讯录内)
    }
}

# 3. 设置请求头
headers = {
    'Content-Type': 'application/json'
}

# 4. 发送 POST 请求
try:
    response = requests.post(webhook_url, headers=headers, data=json.dumps(payload))
    response.raise_for_status() # 如果请求失败 (状态码不是 2xx), 会抛出异常
    # 5. 检查响应结果 (企业微信返回的 JSON)
    result = response.json()
    if result.get("errcode") == 0:
        print("消息发送成功!")
    else:
        print(f"消息发送失败,错误码:{result.get('errcode')},错误信息:{result.get('errmsg')}")

except requests.exceptions.RequestException as e:
    print(f"请求发送失败:{e}")
except json.JSONDecodeError:
    print(f"无法解析服务器响应:{response.text}")

代码解释:

  • webhook_url: 替换成你第一步获取到的完整 Webhook 地址。
  • payload: 一个 Python 字典,包含了要发送的数据。
  • msgtype: 指定消息类型,这里是 text
  • text: 包含文本消息具体内容的对象。
  • content: 消息正文,支持换行 (\n)。
  • mentioned_list / mentioned_mobile_list: 可选字段,用于在群里 @ 成员。使用成员的企业微信账号(userid)或已在企业通讯录登记的手机号。@all 可以 @ 所有人。
  • headers: 设置请求头,指明我们发送的是 JSON 数据。
  • requests.post(): 发送 POST 请求。
  • webhook_url: 目标地址。
  • headers: 请求头。
  • data=json.dumps(payload): 将 Python 字典转换为 JSON 字符串作为请求体发送。
  • response.raise_for_status(): 检查 HTTP 状态码,如果不是 200 OK 等成功状态,会抛出异常。
  • response.json(): 解析企业微信服务器返回的 JSON 响应。
  • 检查 errcode: 企业微信 API 通过 errcode 字段告知调用结果,0 表示成功。
  • 2. 发送 Markdown 消息

    Markdown 格式支持更丰富的文本样式。

    import requests
    import json
    
    # 1. 替换为你的 Webhook 地址
    webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_UNIQUE_ROBOT_KEY" # <--- 换成你的 Key
    
    # 2. 构建 Markdown 消息内容
    #    参考文档: https://developer.work.weixin.qq.com/document/path/91770#markdown%E7%B1%BB%E5%9E%8B
    markdown_content = """
    **实时通知** <font color="warning">请注意</font>!
    > 任务状态:<font color="info">进行中</font>
    > 负责人:张三 (@zhangsan)  <font color="#008000">(请使用实际存在的 userid)</font>
    
    请相关同事注意跟进。
    [点击查看详情](http://work.weixin.qq.com)
    """
    # 注意:
    # 1. Markdown @成员需要使用 userid,例如 <@userid> 格式,如 <@zhangsan>
    # 2. 目前仅支持部分 Markdown 语法: 标题, 加粗, 斜体, 删除线, 引用, 链接, 字体颜色 (info, comment, warning)
    
    payload = {
        "msgtype": "markdown",
        "markdown": {
            "content": markdown_content
            # Markdown 消息中 @ 成员需要直接在 content 中写入 <@userid>
            # 例如: "提醒: <@wangqing> 请处理一下这个 Bug"
        }
    }
    
    # 3. 设置请求头
    headers = {
        'Content-Type': 'application/json'
    }
    
    # 4. 发送 POST 请求
    try:
        response = requests.post(webhook_url, headers=headers, data=json.dumps(payload))
        response.raise_for_status()
        result = response.json()
        if result.get("errcode") == 0:
            print("Markdown 消息发送成功!")
        else:
            print(f"Markdown 消息发送失败,错误码:{result.get('errcode')},错误信息:{result.get('errmsg')}")
    
    except requests.exceptions.RequestException as e:
        print(f"请求发送失败:{e}")
    except json.JSONDecodeError:
        print(f"无法解析服务器响应:{response.text}")
    

    Markdown 注意事项:

  • msgtypemarkdown
  • 内容在 markdown.content 字段中。
  • 支持的 Markdown 语法有限,具体请参考企业微信官方文档。
  • 在 Markdown 中 @ 成员,需要使用 <@userid> 的格式,例如 <@wangqing>不能像 text 类型那样使用 mentioned_list
  • 支持的字体颜色:info (蓝色), comment (灰色), warning (橙红色)。也可以用 #RRGGBB 格式。
  • 3. 发送图片消息 (Image)

    发送图片需要先将图片读取为二进制数据,进行 Base64 编码,并计算其 MD5 值。

    import requests
    import json
    import base64
    import hashlib
    
    # 1. 替换为你的 Webhook 地址
    webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_UNIQUE_ROBOT_KEY" # <--- 换成你的 Key
    
    # 2. 准备图片文件
    image_path = "path/to/your/image.png" # <--- 替换为你的图片路径
    
    try:
        # 3. 读取图片 -> Base64 编码 -> 计算 MD5
        with open(image_path, 'rb') as f:
            image_data = f.read()
            base64_data = base64.b64encode(image_data).decode('utf-8') # 编码后需要解码为 utf-8 字符串
            md5_hash = hashlib.md5(image_data).hexdigest()
    
        # 4. 构建请求数据(图片类型)
        #    参考文档: https://developer.work.weixin.qq.com/document/path/91770#%E5%9B%BE%E7%89%87%E7%B1%BB%E5%9E%8B
        payload = {
            "msgtype": "image",
            "image": {
                "base64": base64_data,
                "md5": md5_hash
            }
        }
    
        # 5. 设置请求头
        headers = {
            'Content-Type': 'application/json'
        }
    
        # 6. 发送 POST 请求
        response = requests.post(webhook_url, headers=headers, data=json.dumps(payload))
        response.raise_for_status()
        result = response.json()
        if result.get("errcode") == 0:
            print("图片消息发送成功!")
        else:
            print(f"图片消息发送失败,错误码:{result.get('errcode')},错误信息:{result.get('errmsg')}")
    
    except FileNotFoundError:
        print(f"错误:找不到图片文件 '{image_path}'")
    except requests.exceptions.RequestException as e:
        print(f"请求发送失败:{e}")
    except json.JSONDecodeError:
        print(f"无法解析服务器响应:{response.text}")
    except Exception as e:
        print(f"处理图片时发生错误: {e}")
    
    

    图片消息注意事项:

  • msgtypeimage
  • image.base64: 图片内容的 Base64 编码字符串。
  • image.md5: 图片内容的 MD5 值。
  • 图片大小限制:Base64 编码前 不超过 2MB
  • 支持的图片格式:JPG, PNG。
  • 4. 发送图文消息 (News)

    可以发送包含标题、描述、链接和图片的卡片式消息。

    import requests
    import json
    
    # 1. 替换为你的 Webhook 地址
    webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_UNIQUE_ROBOT_KEY" # <--- 换成你的 Key
    
    # 2. 构建请求数据(图文类型)
    #    参考文档: https://developer.work.weixin.qq.com/document/path/91770#%E5%9B%BE%E6%96%87%E7%B1%BB%E5%9E%8B
    payload = {
        "msgtype": "news",
        "news": {
           "articles" : [ # 最多支持 8 条图文
               {
                   "title" : "重要通知:系统更新公告",
                   "description" : "系统将于今晚 22:00 - 24:00 进行升级维护...",
                   "url" : "http://example.com/announcement/123", # 点击图文后跳转的链接
                   "picurl" : "http://res.example.com/images/update_icon.png" # 图文消息的图片链接,支持 JPG, PNG,大图 1068*455,小图 150*150
               },
               {
                   "title" : "本周工作报告",
                   "description" : "点击查看详细报告内容",
                   "url" : "http://example.com/report/weekly",
                   "picurl" : "http://res.example.com/images/report_icon.png"
               }
            ]
        }
    }
    
    # 3. 设置请求头
    headers = {
        'Content-Type': 'application/json'
    }
    
    # 4. 发送 POST 请求
    try:
        response = requests.post(webhook_url, headers=headers, data=json.dumps(payload))
        response.raise_for_status()
        result = response.json()
        if result.get("errcode") == 0:
            print("图文消息发送成功!")
        else:
            print(f"图文消息发送失败,错误码:{result.get('errcode')},错误信息:{result.get('errmsg')}")
    
    except requests.exceptions.RequestException as e:
        print(f"请求发送失败:{e}")
    except json.JSONDecodeError:
        print(f"无法解析服务器响应:{response.text}")
    
    

    图文消息注意事项:

  • msgtypenews
  • news.articles: 是一个列表,包含一个或多个图文条目(最多 8 条)。
  • 每个 article 包含:
  • title: 标题(必填)。
  • description: 描述(可选)。
  • url: 点击后跳转的链接(必填)。
  • picurl: 图文消息配图的 URL(可选)。图片需要能被企业微信服务器访问到。

  • 进阶与建议

  • 封装成函数/类: 如果你需要频繁发送消息或发送不同类型的消息,建议将发送逻辑封装成函数或类,提高代码复用性。
  • 配置管理: 不要将 Webhook URL 硬编码在代码中,尤其是在版本控制系统里。可以考虑使用环境变量、配置文件(如 config.ini, config.yaml)等方式管理。
  • 错误处理: 完善错误处理逻辑,例如记录失败日志、重试机制等。
  • 频率限制: 企业微信对机器人发送消息的频率有限制(单个机器人发送速度不能超过 20 条/分钟),过度频繁发送可能导致暂时禁用。
  • 安全性: 再次强调,Webhook 地址非常敏感,务必保密。如果泄露,应尽快在企业微信中重新生成一个新的 Webhook 地址并替换掉旧的。
  • 查阅官方文档: 企业微信官方文档是最新、最权威的信息来源,当需要了解更多细节或遇到问题时,请查阅:群机器人配置说明
  • 希望这个教程对你有帮助!你可以根据自己的需求选择合适的消息类型,并开始用 Python 与你的企业微信群机器人进行交互了。

    作者:hiquant

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python实现企业微信群机器人创建与交互的详细教程

    发表回复