ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

企业微信群机器人Webhook完全指南:从创建到代码实战

企业微信群机器人Webhook完全指南:从创建到代码实战 1. 先搞明白群机器人Webhook到底是什么1.1 Webhook的工作方式一句话就能说清我先用最直白的方式解释一下企业微信群机器人说到底就是一个专属的URL地址你的程序只要能发HTTP请求就能往这个URL上POST一段JSON数据企业微信服务器收到之后就会帮你把这段数据渲染成一条消息推送到对应的群里。这个机制就是典型的Webhook网络钩子。你可以把它理解成群里站了一个“传话员”它只认一个暗号Webhook地址中的key只要你的程序带着正确的暗号来敲门它就帮你把话带进群。整个过程不依赖什么SDK不依赖企业微信客户端也不需要登录任何人的账号一台没有图形界面的Linux服务器只要能访问外网就能轻松完成消息推送。我当年第一次用的时候最强烈的感受就是简单到令人发指。你不需要成为企业微信开发者不需要创建应用不需要申请权限只要在群设置里点几下鼠标一个可以用的消息通道就诞生了。对比一下邮件告警、短信告警这些方案群机器人几乎零成本、零学习门槛、没有资费问题。1.2 它能干什么不能干什么先说能干什么这个清单可以拉得很长服务器CPU、内存、磁盘告警网站宕机监控自动化部署CI/CD成功或失败的通知数据库备份完成后的确认消息爬虫跑完、数据任务报错等定时任务的执行结果电商订单提醒、表单提交提醒、用户反馈提醒把内部运维平台、管理后端的操作日志推送到群每天早晨定时推送销售数据、运营日报再说不能干什么。很多人刚接触群机器人容易有个误解以为它无所不能。这里必须先泼一盆冷水第一群机器人不能主动拉人进群也不能踢人。它是群内的一个发言角色不是群管理员。第二群机器人只能主动往群里推送消息无法实时读取群里的聊天内容也监听不了群成员的消息。除非你结合企业微信的接收消息回调API另做一套应用级开发那是另一码事跟群机器人Webhook不是同一个东西。第三机器人发的消息不能被个人并触发对方的客户端强提醒虽然没有真正意义上个人的参数消息里的提及人更多是文本标记而且发送频率有明确限制。第四也是最容易忽略的群机器人必须在群内才能工作。如果机器人被移出群聊Webhook地址就立即失效你必须重新创建。1.3 适合谁用需要什么基础如果你是个运维、后端开发、测试工程师或者哪怕你只是经常处理服务器和脚本的独立开发者这篇文章里的内容基本都能直接落地上手。需要的技术基础非常低懂一点HTTP POST请求就够会用curl命令行或者会写简单的Python/JavaScript脚本你就已经具备了全部前置条件。我在后面的章节里会把每一步都写得很细包括JSON格式长什么样、Python脚本怎么封装、加签算法怎么实现都属于“复制粘贴稍微改改就能跑”的程度。2. 创建群机器人拿到Webhook地址2.1 从建群到创建的完整操作步骤创建群机器人整个流程不需要写一行代码全程在客户端里点鼠标。我按PC端和移动端的顺序各写一遍因为两个平台入口略有点不同。在PC端企业微信里的操作路径是这样先确保你已经在企业微信里创建了一个群或者加入了某个群。没有群的话右上角号选择发起群聊随便选几个同事创建一个即可。进入目标群聊窗口点击右上角的双人图标打开群设置面板。在群设置面板中往下翻找到群机器人那一栏点击添加。弹出窗口会让你选择机器人类型我们选“新创建一个机器人”。给机器人起个名字比如服务器告警、部署通知、数据日报然后点击添加。添加成功后页面会给你展示一个Webhook地址长这样https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx点击复制妥善保存。这个地址就相当于机器人钥匙泄露了别人就能往你群里发垃圾消息。在手机端企业微信APP里操作也差不多进入群聊右上角的...入口找到群机器人选择添加机器人填好名字之后同样能看到Webhook地址。手机端复制地址的时候稍微注意一下不要复制漏了最好是发到自己的文件传输助手里保存。2.2 安全设置关键词、加签和IP白名单这一步非常关键属于很多教程会一带而过、但实际出问题最多的地方。添加机器人之后界面上会有一个Webhook地址和安全设置的选项里面通常有几种保护方式我逐个解释第一种自定义关键词。你可以设置一个或多个关键词比如告警、ERROR、发布。设置之后只有消息内容中包含这些关键词机器人才会把消息发出去否则会返回一个错误码。这个机制本质是防止误发和滥用。注意关键词最多设置10个每个关键词最短1个字符最长不超过20个字符。消息内容至少要包含其中一个关键词才能发送成功。第二种加签。这是更安全的一种方式。开启加签之后系统会生成一个密钥Secret你的程序在发送消息时不仅要带Webhook地址还必须在请求中额外带上一个通过特定算法生成的签名值。后面第4章我会专门写加签的代码实现这里先记住结论加了签别人即使拿到了你的Webhook地址没有密钥也发不了消息。第三种IP白名单部分版本/配置中支持。你可以把服务器、办公网的公网IP加进去只允许这些IP来源的请求调用机器人。如果企业出口IP经常变动这个方法会比较折腾建议按需开启。从实际使用经验来看我的建议是如果是内部系统使用且服务器IP固定优先开启加签IP白名单这是最稳妥的组合如果只是自己写个小脚本玩玩至少也要设置一个关键词避免地址泄露后被别人当免费通知通道。提示Webhook地址里的key和加签用的Secret是两回事。key在URL里Secret单独生成、单独保存不要搞混一旦混淆会导致签名校验永远不通过。2.3 如何测试Webhook是否可用拿到Webhook地址之后可以先做一次最简单的连通性测试。这里不急着写代码因为标题里包含了发送消息的过程我们先手动验证一下地址本身没有问题。打开你电脑上的终端Windows就打开CMD或PowerShellmacOS/Linux打开Terminal执行下面这条命令注意把URL换成你自己的完整Webhook地址curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ -H Content-Type: application/json \ -d {msgtype: text, text: {content: hello world}}如果一切正常你会收到一条JSON格式的响应{errcode: 0, errmsg: ok}看到errcode等于0说明消息已经成功推送到了群里。此时去群里看一眼就能看到机器人发的hello world。这个测试动作虽然小但能帮你排除掉80%的初始问题。因为我见过太多人在代码里折腾了半天最后发现是Webhook地址复制多了一个空格、少了一位字符。3. 消息类型逐个拆解照着抄就行3.1 文本消息最基础也是用得最多的文本消息的JSON结构非常简单上面测试的时候已经见过{ msgtype: text, text: { content: 服务器磁盘空间不足请及时处理, mentioned_list: [wangqing, all], mentioned_mobile_list: [13800001111, all] } }字段说明msgtype固定为text表示这是文本消息。content是消息正文必填最长不超过2048字节超过会报错。mentioned_list是可选的用于通过userid提及群成员企业微信会以文本形式显示某人。mentioned_mobile_list是可选的通过手机号提及群成员。如果想所有人写法是{ msgtype: text, text: { content: 今晚10点进行服务器维护, mentioned_list: [all] } }注意mentioned_list里填的userid是成员在企业微信通讯录中的唯一标识不是你随便起的花名。一般如果不是特别需要精准某个人直接all是最省事的。实际使用中文本消息主要用来发简短告警比如nginx挂了、备份失败、磁盘使用率超过90%。如果想把服务器的命令执行结果拼进去Python里可以用字符串拼接或者模板字符串我在第4章给完整例子。3.2 Markdown消息让告警内容真正可读如果你发过几条纯文本告警你很快就会觉得单调。一堆白底黑字堆在一起重点不突出信息密度低。Markdown消息就是这时候最需要的。它的JSON结构长这样{ msgtype: markdown, markdown: { content: ## 磁盘告警\n 服务器: 192.168.1.100\n 分区: /data\n 使用率: font color\warning\92%/font\n \n 请尽快清理磁盘空间否则可能影响业务。 } }Markdown消息支持的内容包括标题#、##、加粗文本、链接 文本 、行内代码code、引用、字体颜色支持info、comment、warning三种预设颜色。注意这里不是完整的Markdown语法表格、图片这些不一定能正常渲染。我实际测试下来比较稳的有标题、引用、加粗、字体颜色、链接、代码块。一个小技巧告警消息里最好把服务器IP、告警项、当前值、阈值、时间这些关键信息用不同格式标出来。比如IP用行内代码阈值用红色warning其他文字用普通文本一眼扫过去就知道问题出在哪。别小看这个排版细节告警消息一旦多了可读性直接决定处理效率。3.3 图片消息先上传再发送图片消息比文本稍微复杂一点它需要先把图片上传到企业微信服务器拿到一个media_id然后再把media_id放进消息里去发送。这里必须注意企业微信群机器人的图片上传和素材管理里的上传接口不同群机器人有自己专门的上传地址。格式是POST https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?keyKEYtypefile注意参数里的key就是Webhook地址中的keytype必须传file。图片大小限制是2MB支持jpg、png等常见格式。上传之后会返回一个media_id。拿到media_id之后发送图片消息的JSON{ msgtype: image, image: { base64: 图片内容的base64编码, md5: 图片内容base64解码后的md5值 } }这里要特别注意企业微信的图片消息其实不是用media_id而是要求你传base64和md5。具体流程是读取图片文件的二进制内容。对二进制内容计算MD5值。对二进制内容做base64编码。把这两个值放进JSON里发送。我在Python里是这样实现的后面章节会有完整代码。但坦白说图片消息在日常告警场景中用得不多更多是用在需要把截图、图表自动推送的场景比如定时推送K线图、报表截图。3.4 图文消息、文件消息和其他类型图文消息也就是包含标题、描述、图片链接和跳转链接的卡片消息JSON结构如下{ msgtype: news, news: { articles: [ { title: 今日运营数据, description: 点击查看完整报表, url: https://example.com/report, picurl: https://example.com/cover.png } ] } }articles是一个数组最多支持8条每条可以有不同的标题和跳转链接。这个格式适合做日报汇总或者把多个相关链接聚合在一条消息里。文件消息则需要先走upload_media上传拿到media_id之后{ msgtype: file, file: { media_id: 3x_abc123... } }文件最大20MB。我一般用这个来推送日志文件、备份文件、导出的Excel。除了这些还有语音消息和模板卡片消息。语音消息同样需要先上传媒体文件模板卡片消息则比较花哨支持按钮交互但配置复杂度较高日常使用频率低这篇文章先不展开。对于绝大多数场景文本Markdown图片文件这四种已经覆盖了90%的需求。4. 直接可用的代码与配置实操4.1 curl一行搞定消息发送如果你不想写脚本或者想快速验证某个通知curl是最直接的方法。文本消息的完整命令行已经在上文测试过了。我再补一个Markdown消息的例子方便复制curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyKEY \ -H Content-Type: application/json \ -d { msgtype: markdown, markdown: { content: ## 部署成功\nfont color\info\项目: order-service/font\n环境: production\n时间: 2025-01-15 10:30 } }注意在bash的-d参数里写多行JSON时引号嵌套比较繁琐如果JSON里有单引号建议把请求体写到一个文件里再用-d filename方式读取cat payload.json EOF { msgtype: text, text: {content: disk alert} } EOF curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyKEY \ -H Content-Type: application/json \ -d payload.json这个方式在写复杂消息体时能避免很多转义错误强烈建议养成习惯。4.2 Python脚本封装做成可复用工具Python是我日常最常用的脚本语言这里写一个简单的封装类把发送文本和Markdown的能力打包好以后任何脚本需要通知直接import就能用。import requests import json import time import hmac import hashlib import base64 class WeComRobot: def __init__(self, webhook_url, secretNone): self.webhook_url webhook_url self.secret secret def _sign(self, timestamp): if not self.secret: return None string_to_sign f{timestamp}\n{self.secret} hmac_code hmac.new( string_to_sign.encode(utf-8), digestmodhashlib.sha256 ).digest() sign base64.b64encode(hmac_code).decode(utf-8) return sign staticmethod def _request(url, payload): resp requests.post(url, jsonpayload, timeout10) result resp.json() if result.get(errcode) ! 0: raise RuntimeError(fsend failed: {result}) return result def send_text(self, content, mentioned_listNone, mentioned_mobile_listNone): payload { msgtype: text, text: { content: content } } if mentioned_list: payload[text][mentioned_list] mentioned_list if mentioned_mobile_list: payload[text][mentioned_mobile_list] mentioned_mobile_list self._send(payload) def send_markdown(self, content): payload { msgtype: markdown, markdown: {content: content} } self._send(payload) def _send(self, payload): url self.webhook_url if self.secret: timestamp str(int(time.time())) sign self._sign(timestamp) separator if ? in url else ? url f{url}{separator}timestamp{timestamp}sign{sign} self._request(url, payload) if __name__ __main__: robot WeComRobot( webhook_urlhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyKEY, secret你的加签密钥没有就不传 ) robot.send_text(hello from python, mentioned_list[all]) robot.send_markdown(## 测试标题\n正文内容)这里的加密部分我提前把加签算法也写进去了。如果没开加签只传webhook_url就行内部会自动跳过签名逻辑。如果开了加签会把当前时间戳和签名追加到URL的参数里企业微信服务器验证通过才会转发消息。我实际用下来这个封装类几乎不需要改动往服务器一扔配合cron定时任务就能撑起日常告警体系。4.3 加签算法的完整实现与参数说明加签这块是企业微信群里比较容易踩坑的环节很多人在这一步卡住。我再把加签的公式拆开揉碎讲一遍。官方文档给的签名算法是获取当前时间戳精确到秒。把时间戳和加签密钥用换行符拼接成字符串timestamp \n secret。用HMAC-SHA256算法对拼接字符串做签名。对签名结果做base64编码。把时间戳和签名作为URL参数拼接到Webhook地址后面。需要强调的是密钥不是Webhook地址里的key是你在安全设置里开启加签之后单独生成的一串字符。拼接时用的是换行符\n不是空格、不是逗号。很多实现出错都是把这里的拼接符写错了。另外要注意的一点是发送请求时需要在URL上带上两个参数timestamp秒级时间戳和sign签名值。服务器会校验时间戳与当前时间是否偏差过大如果偏差超过一定范围会拒绝请求所以你的服务器系统时间必须保持准确。我遇到过一台内网服务器时间漂移了5分钟怎么发都不成功一查NTP服务停了。Node.js版本的加签实现也放出来方便前端同学参考const crypto require(crypto); function generateSign(timestamp, secret) { const stringToSign ${timestamp}\n${secret}; const hmac crypto.createHmac(sha256, stringToSign).digest(); return hmac.toString(base64); } async function sendMessage(webhookUrl, secret, payload) { let url webhookUrl; if (secret) { const timestamp Math.floor(Date.now() / 1000).toString(); const sign generateSign(timestamp, secret); url timestamp${timestamp}sign${encodeURIComponent(sign)}; } const resp await fetch(url, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify(payload) }); return resp.json(); }这个版本用原生fetchNode 18以上的版本可以直接跑。4.4 把Webhook配置到项目中的三种思路第一种写死在脚本里。适合个人小工具缺点是密钥泄漏风险大而且换地址就得改代码。第二种放到环境变量或配置文件里。我自己的习惯是放在.env文件、config.yaml或者Kubernetes的ConfigMap里代码通过环境变量读取。这样换地址、换密钥都不需要重新编译或改代码。配置示例# config.yaml wecom: webhook_url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyKEY secret: your-secret-here然后在代码里解析import os webhook_url os.getenv(WECOM_WEBHOOK_URL) secret os.getenv(WECOM_SECRET)第三种封装成独立的通知服务。如果你的团队里有多套系统都需要发企业微信通知可以单独部署一个极简的HTTP服务统一暴露一个接口内部再转发到企业微信Webhook。好处是所有调用方只需要对接你自己这一个地址密钥只保存在通知服务这一处未来如果要从企业微信换成钉钉或者飞书调用方完全无感知。5. 常见报错与排查技巧实录5.1 错误码速查表遇到别慌企业微信Webhook接口错误码不算多我碰到比较频繁的整理成一个表方便对号入座错误码含义常见原因与处理方式0成功无需处理93000机器人webhook请求不合法签名校验失败检查secret、timestamp拼接格式或IP不在白名单内93001机器人webhook配置不合法检查Webhook地址是否完整是否缺key参数93002机器人webhook已失效机器人被移出群、被删除或群解散进入群设置重新添加93003机器人webhook已限制触犯安全规则检查关键词是否正确消息是否包含关键词40001无效的access_token这是应用API的错误和群机器人Webhook没关系如果出现可能是调用错接口40013无效的corpid同上属于应用API确认自己调的是不是Webhook45009接口调用超过限额发送频率超过限制稍后重试或做节流40035缺少参数检查JSON字段比如content为空、msgtype缺失40058参数不合法检查消息内容长度是否超限字段类型是否正确41001缺少access_token和40001类似确认调用对象40097参数类型错误检查JSON结构比如image消息有没有把base64和md5写对注意90000系列开头的基本是群机器人Webhook专用错误码其余4xxxx/5xxxx大多是企业微信应用API的错误码遇到时要先确认自己调用的到底是哪个接口别被错误码搞混方向。5.2 关键词为什么没生效这是群里问得最多的一个问题明明设置了关键词消息里也包含了为什么还是返回93003我排查过几个典型的案例把原因列出来第一消息类型不支持关键词校验。关键词规则只对text和markdown类型生效如果你是发图片、文件、图文消息关键词不会参与校验这时候返回的限制报错通常是别的原因。第二关键词匹配的是发送内容里实际传输的文本。如果你在content里写的是动态拼接的变量而运行时变量为空那自然匹配不上。第三多个关键词是或的关系不是且。只要消息里包含任意一个关键词就能发送不是必须全部包含。第四关键词匹配可能受markdown标记影响。你设置了关键词告警但Markdown内容里写的是## 告警标题理论上能匹配但如果被转义成HTML实体或特殊字符隔开就匹配不上。所以如果对关键词校验这块不放心建议直接用纯文本消息测试。第五检查你的关键词是不是被误加了空格。复制粘贴配置关键词的时候前后多了个空格非常隐蔽肉眼很难看出来但系统是严格匹配的。5.3 机器人发不出消息了先按这个顺序查如果之前发得好好的某天突然不发了我不会马上改代码而是按下面的顺序排查第一步先看返回码。用curl手动调用一次Webhook地址看返回的errcode是什么。如果返回0说明Webhook本身没问题问题出在代码逻辑或网络。第二步如果返回93002基本可以断定机器人被移出群了。去群里看看机器人还在不在如果不在企业微信群里重新添加然后更新代码里的Webhook地址。第三步如果返回93000多半是签名或IP白名单问题。如果之前没改过代码检查服务器出口IP是不是变了比如换了网络、加了代理需要去企业微信后台把新IP加进白名单。第四步如果请求直接超时或连不上检查服务器到qyapi.weixin.qq.com的网络连通性。内网服务器经常有代理或防火墙限制curl -I https://qyapi.weixin.qq.com能通不代表POST能通最好直接POST一次实测。第五步检查消息内容长度。超长内容不会返回明确的长度超限而是可能表现为40058或发送失败。文本别超过2048字节markdown别超过4096字节。5.4 告警风暴和频率限制的应对企业微信对每个机器人的发送频率有限制每个机器人每分钟最多发送20条消息。如果超过会被限流返回45009。这个限制在实际运维场景里特别容易触碰。比如程序一个for循环里发了50条告警或者某个异常导致告警脚本疯狂重试瞬间就会把20条的配额打满。被打满之后后面哪怕只发一条也会被拒绝直到下一分钟窗口重置。我的经验是在代码里主动做两层控制。第一层在发送端做节流同一个告警源在5分钟内重复发送时直接丢弃或合并第二层用一个简单的队列把多条告警攒起来每隔3秒发一条避免瞬时并发。另外长时间多次触发限流之后除了返回码45009还可能触发更严格的封禁。所以日常使用中尽量不要试探这个频率上限宁可在应用层合并消息也不要搞一条数据一条通知。6. 进阶场景把Webhook真正用起来6.1 服务器监控告警从shell到企业微信的直连我最早接触群机器人就是因为监控告警邮件老是没人看。后来把告警接到企业微信群里之后响应速度快了一大截。最简单的实现方式就是写一个shell脚本配合crontab定时执行。比如检查磁盘使用率#!/bin/bash # check_disk.sh THRESHOLD90 USAGE$(df -h / | awk NR2 {print $5} | sed s/%//) if [ $USAGE -gt $THRESHOLD ]; then curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyKEY \ -H Content-Type: application/json \ -d { \msgtype\: \markdown\, \markdown\: { \content\: \## 磁盘告警\n 根分区使用率: font color\\\warning\\\${USAGE}%/font\ } } fi注意shell里嵌套JSON的转义双引号和反斜杠很容易出错所以我更推荐用Python写监控脚本而不是纯shell拼JSON。上面这段脚本里反斜杠的层数已经有点劝退人了。用我之前封装的Python类来写大概是这个感觉import shutil def check_disk(): usage shutil.disk_usage(/).percent if usage 90: robot.send_markdown(f## 磁盘告警\n根分区使用率: font color\warning\{usage:.1f}%/font)正应了那句话复杂逻辑交给脚本简单触发交给cron。6.2 CI/CD集成构建状态自动通知如果你是开发或测试另一个高频场景是把Webhook接进GitLab CI或Jenkins。以GitLab CI为例在.gitlab-ci.yml的job里加一个after_script或单独的stagedeploy: stage: deploy script: - echo 开始部署... after_script: - curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyKEY \ -H Content-Type: application/json \ -d {\msgtype\:\text\,\text\:{\content\:\部署完成: ${CI_PROJECT_NAME} ${CI_COMMIT_REF_NAME}\}}注意如果服务器加了签你需要先把签名的生成逻辑也写进CI脚本。通常我建议在CI里用一个独立的Python脚本或Node脚本专门处理通知而不是直接裸露地写curl因为签名逻辑和URL拼接会让YAML文件变得很难看。在Jenkins里则更简单构建后的Execute shell或通过Pipeline直接调用一个通知脚本即可。Jenkins自己还内置了一些通知插件但那些插件往往需要安装额外应用反而没有Webhook这么轻量。6.3 定时任务数据日报把SQL结果推送到群很多人还用它做每日数据播报。比如每天早上9点把昨天的订单量、营收、新增用户数汇总到群里。整体思路就三步写SQL查询数据。用Python脚本读取结果格式化成一个文本或Markdown字符串。通过Webhook推送。import pymysql from wecom_robot import WeComRobot conn pymysql.connect(hostlocalhost, userroot, password***, databasereport) try: with conn.cursor() as cursor: cursor.execute(SELECT COUNT(*), SUM(amount) FROM orders WHERE create_date CURDATE() - INTERVAL 1 DAY) order_count, total_amount cursor.fetchone() finally: conn.close() content f## 昨日数据日报\n订单量: {order_count}\n销售额: {total_amount:.2f} 元 robot.send_markdown(content)这样每天早上群里自动出现数据总结比打开后台一个个看效率高太多了。我甚至在几个项目里见过老板就靠这个群播报了解业务状态。再往上走还可以结合定时任务调度框架比如APScheduler或者用云函数定时触发器来实现完全免运维的定时推送。6.4 几个实用经验能少踩很多坑最后分享几个我用了一年多群机器人攒下来的经验希望能帮你少走弯路。第一Webhook地址务必当作密钥管理。不要把地址直接提交到Git仓库里尤其是公开仓库。曾经有人把仓库设为publicWebhook地址被爬虫抓走结果群里被刷了几千条垃圾消息最后只能重新建群、换地址。现在我都把地址放在环境变量里或者在CI中从Secret管理服务读取。第二在脚本里对Webhook返回结果做判断。不要发完就不管了至少要检查一下errcode是不是0。如果返回93002说明机器人被移出群了需要人工介入。如果返回45009说明触发频率限制要考虑合并消息或降低发送频率。第三消息内容里尽量带上时间戳或服务器标识。多个环境的告警如果都推送到同一个群没有来源标识和时间的消息根本分不清谁是谁。我的习惯是每一条告警都带上[环境][服务器IP]这样的前缀。第四如果消息内容里有token、密码这类敏感信息千万别直接发到群里一是不安全二是消息会被所有群成员看到包括后来才进群的人也有历史记录可见权限。第五机器人发的消息无法撤回。任何程序逻辑上发出去的内容都无法在群里删除群主或管理员不能单独删除机器人的消息除非整体删除聊天记录。所以写代码的时候一定要想清楚内容是确定要发的吗拼装有没有可能拼出错误信息我建议在测试阶段专门用一个测试群确认无误再切到正式群。这篇内容到这里该讲的核心概念、创建步骤、消息格式、代码实现、常见问题、进阶玩法都已经覆盖了。我自己刚接触Webhook时最头疼的就是官方文档虽然全但太散要东拼西凑才能串起一条完整链路。这篇文章的价值就在于把我走过的路、踩过的坑、验证过的方法一次性整理给你。如果你照着操作从零到能跑通第一条消息应该用不了10分钟。剩下的就看你怎么把它接到自己的业务场景里了。
返回列表