简介:这是一套面向企业级开发者与SCRM/SaaS服务商的PHP微信机器人实战源码,聚焦企业微信生态下的聊天聚合、自动回复与AI能力集成。资源包含63个文件,主体为55个PHP脚本(涵盖消息处理、联系人/群组管理、协议解析、Hook扩展及ChatGPT API对接等核心模块),辅以3张PNG/JPG图标素材、1个JSON配置文件、1份LICENSE授权说明及README文档,压缩包仅1.56MB,轻量易部署。已有677人学习下载,适用于需快速构建防封稳定、可定制化的企业微信运营工具的中高级PHP工程师。源码结构清晰,含Server主入口、MessageFactory消息工厂、Contact/Group/Member实体集合、WorkTool集成适配层及MediaInterface媒体接口等模块,支持逆向协议解析、网络连接复用与Sync同步机制,开箱即可对接ChatGPT实现智能应答,并预留Custom扩展点便于二次开发。 公司群从十几人涨到上百人的时候,我发现一个很尴尬的事:每天都有人在群里问同样的东西——环境变量在哪配、这个报错什么意思、文档链接谁有。回答多了我就想,与其反复打字,不如把这些高频问题直接交给一个基于PHP开发的企业微信机器人。于是就有了这套“企微微信机器人”的源码设计。
这套源码走的是企业微信官方开放能力,包含群机器人Webhook推送、自建应用消息发送、消息回调接收三条链路,能实现群内自动应答、定时提醒、监控告警、审批通知这类场景。适合手里有PHP环境、又想快速在企业微信里落地一个机器人小助手的开发者参考,也适合想彻底搞清楚企微API接入细节的运维同学。我尽量把原理、模块、部署、踩坑都写透,照着走基本能跑通。
1. 这个机器人项目到底在解决什么问题
1.1 从“群里反复答疑”说起
团队规模一大,群里的重复问题就呈指数增长。技术群、项目群、客户群,每天都有新人进来问“这个系统怎么登录”“测试环境地址发一下”“刚才的报错截图谁能看看”。这些问题不是不能回答,而是回答成本极低、重复率极高,浪费的是所有人的时间。
机器人的核心价值就在于把这类“低价值、高重复”的交互自动化。它不需要理解复杂的自然语言,只需要把常见问题做成关键词规则,命中后返回预设答案,就能把群里的答疑压力卸掉一大半。再配合定时任务和监控脚本,机器人还能主动往群里推送定时提醒、告警信息,成为群里的“值班助理”。
这套源码的设计目标很明确:用最常规的PHP工程结构,把企业微信机器人的三条核心链路做完整,让开发者拿到手之后能直接改配置、加业务逻辑,而不是从零研究API文档。
1.2 企业微信机器人能覆盖的典型场景
我整理了几个最常见的落地场景,这些也是我实际接过的需求:
| 场景 | 实现方式 | 典型效果 |
|---|---|---|
| 运维监控告警 | 监控脚本调用群机器人Webhook | 服务器宕机、接口超时自动推送到运维群 |
| 群内自动问答 | 自建应用接收消息回调,匹配关键词回复 | 群内提问“测试地址”,机器人自动回复地址和账号说明 |
| 定时任务提醒 | cron定时脚本调用发送接口 | 每天早上9点推送未处理工单、今日排班 |
| 审批/考勤通知 | 对接内部系统,触发后推送应用消息 | 请假审批通过后,给申请人推送通知卡片 |
| 知识库检索 | 机器人匹配问题,返回文档链接 | 输入“部署文档”,机器人返回Wiki链接 |
这里面,群机器人Webhook适合单向推送,自建应用消息适合点对点推送,回调则让机器人具备了“接收消息-处理-回复”的完整闭环。三者的组合覆盖了绝大多数办公场景。
1.3 为什么选择PHP来写
很多人觉得企业微信机器人应该用Python或者Go写,实际上PHP完全够用,而且有它的独特优势。
企业微信开放平台的API本质就是一批HTTP接口,语言无关,PHP的curl扩展就可以完美对接。如果你所在的公司内部系统是PHP栈(ThinkPHP、Laravel、FastAdmin这类),用PHP写机器人可以直接复用现有的用户体系、数据库、工单逻辑,不需要另起一套技术栈。
另外,PHP的部署成本低到几乎可以忽略。一台普通的云服务器装好Nginx和PHP-FPM就能跑,不需要复杂的运行环境管理。我见过不少团队用PHP写这类机器人,它们稳定运行了好几年,比语言本身更重要的是接口设计和异常处理做没做扎实。
2. 核心链路拆解:企业微信机器人的两套消息通道
2.1 群机器人Webhook通道
群机器人是入门最快的方式。在企业微信群里添加一个自定义机器人,会得到一个Webhook地址,向这个地址POST一段JSON,机器人就会在群里发消息。
{ "msgtype": "text", "text": { "content": "这是一条来自PHP机器人的消息" } }请求地址格式如下:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key这个key就是机器人的身份凭证,只要拥有了key,任何人都可以向群里发消息,所以千万不能把它暴露在浏览器前端代码里。企业微信官方限制每个群机器人每分钟最多20条消息,短时间高频推送会被限流,监控场景一定要做消息合并。
Webhook通道适合的是“单向通知”:监控告警、定时提醒、CI/CD构建结果推送。这类场景只需要推,不需要收,一个webhook足以搞定。如果你只需要让机器人往群里发消息,完全没必要自建应用,一个webhook就够了。
2.2 自建应用的消息发送通道
群机器人只能发到固定的群,但自建应用可以把消息发给指定成员、指定部门,甚至带上跳转链接和按钮。这就适用于更复杂的业务通知。
自建应用模式需要三个核心参数:
- CorpID:企业ID,在“我的企业-企业信息”里查看
- AgentId:自建应用的AgentId,在应用详情页查看
- Secret:应用密钥,在应用详情页里获取
先拿这三个参数换access_token:
curl "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=你的CorpID&corpsecret=你的Secret"拿到access_token后,调用消息发送接口:
curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=你的token" \ -H "Content-Type: application/json" \ -d '{ "touser": "zhangsan|@all", "msgtype": "text", "agentid": 1000002, "text": { "content": "你的工单已被处理" } }'access_token的有效期是7200秒,而且获取接口有频率限制,工程里必须做缓存,后面我会专门讲这个坑。
2.3 消息回调:机器人“能听会说”的关键
群机器人Webhook只能“说”,不能“听”。如果你想实现群内自动问答、关键词回复、命令转发这类交互式功能,就必须启用自建应用的“接收消息”回调。
回调的流程是:企业微信服务器收到用户发给应用的消息后,会把消息内容POST到你配置的URL上,你的服务器处理完后,再通过调用API发送回复。整个过程像一个webhook服务器。
这里有个关键区别:回调URL的配置需要在企业微信管理后台“应用-自建应用-接收消息-设置API接收”里完成,配置时需要填一个URL,并且要能通过企业微信的URL验证。验证通过后,所有发给该应用的消息都会实时推送过来。
三种通道的能力对比如下:
| 能力 | 群机器人Webhook | 自建应用主动发送 | 自建应用消息回调 |
|---|---|---|---|
| 发送消息到群 | 支持 | 不支持(可指定群聊) | 不支持(接收) |
| 发送消息到成员 | 不支持 | 支持 | 不支持(接收) |
| 接收用户消息 | 不支持 | 不支持 | 支持 |
| 接收事件(进入应用等) | 不支持 | 不支持 | 支持 |
| 实现交互式问答 | 不具备 | 不具备 | 具备 |
| 接入复杂度 | 最低 | 中等 | 较高 |
如果让我给排序建议:想最小成本搞定告警推送,用Webhook;想给指定人发通知,用自建应用;想做真正的“机器人”自动应答,必须上回调。
3. 源码模块设计与关键实现
3.1 目录结构与模块职责
一套适合长期维护的企微机器人PHP源码,目录结构应当清晰到“新同事看一眼就知道往哪里加代码”。我的设计思路是:入口统一、配置收敛、业务处理按消息类型拆分。
wxbot/ ├── config/ │ └── bot.php # 企微配置 ├── core/ │ ├── Http.php # curl请求封装 │ ├── Signature.php # 回调签名验证 │ ├── Prpcrypt.php # 回调消息解密 │ ├── AccessToken.php # access_token缓存 │ └── Logger.php # 日志封装 ├── handler/ │ ├── HandlerInterface.php # 处理器接口 │ ├── TextHandler.php # 文本消息处理 │ ├── EventHandler.php # 事件消息处理 │ └── ImageHandler.php # 图片消息处理 ├── vendor/ # 可选的composer依赖 ├── run.php # 回调统一入口 ├── sender.php # 主动发送消息命令行脚本 └── webhook.php # 群机器人发送封装入口文件只做三件事:加载配置、解析请求、分发到对应Handler。这样设计的好处是,以后新增一种消息类型,只需要在handler目录下加一个类,然后到路由逻辑里注册一下,不用改动核心代码。
3.2 回调签名验证:为什么这样算
企业微信的回调URL验证和数据推送都带签名参数,签名算法的核心逻辑是:把token、timestamp、nonce三个参数按字典序排序,拼接成字符串,再做SHA1加密,最后和请求里的签名比对。
<?php class Signature { private $token; public function __construct(string $token) { $this->token = $token; } public function verify(string $signature, string $timestamp, string $nonce): bool { $params = [$this->token, $timestamp, $nonce]; sort($params, SORT_STRING); $expected = sha1(implode($params)); return hash_equals($expected, $signature); } }注意两个细节。
第一,sort必须指定SORT_STRING参数,如果不指定,纯数字字符串排序时可能会被当成整数比较,结果完全不一样,这一点非常容易踩。
第二,比较签名时用hash_equals而不是==,hash_equals是恒定时间比较,能防止时序攻击。虽然一个群聊机器人的回调接口被攻击的概率不高,但养成好习惯总没错。
这个签名的意义在于:请求是从企业微信服务器发出来的,签名相当于一层身份认证。如果没有签名验证,任何知道回调URL的人都能伪造消息推给你的服务器,你的机器人就会执行伪造的指令。
3.3 消息解析与路由分发
回调收到的是XML格式的消息体,需要先解析出消息类型,再分发到对应的Handler。我推荐用数组映射来代替一堆if-else,后续维护起来舒服很多。
<?php // run.php 核心逻辑 $rawBody = file_get_contents('php://input'); $xml = simplexml_load_string($rawBody, 'SimpleXMLElement', LIBXML_NOCDATA); $msgType = (string) $xml->MsgType; $event = (string) $xml->Event; $handlers = [ 'text' => TextHandler::class, 'event' => EventHandler::class, 'image' => ImageHandler::class, 'voice' => VoiceHandler::class, ]; $handlerClass = $handlers[$msgType] ?? null; if ($handlerClass) { $handler = new $handlerClass($config); $reply = $handler->handle($xml); // 主动调用API回复,或直接返回被动响应 }使用LIBXML_NOCDATA很关键,企业微信的XML消息里CDATA包裹的内容如果不用这个参数,解析出来会是空字符串。我当时就是漏了这个参数,文本消息内容一直拿不到,排查了好久才反应过来。
Handler类都实现同一个接口,接口里定义handle(SimpleXMLElement $xml)方法,每个类只负责一种消息类型的业务逻辑。比如TextHandler里做关键词匹配:
<?php class TextHandler implements HandlerInterface { public function handle(SimpleXMLElement $xml): string { $content = trim((string) $xml->Content); $keywordMap = [ '测试环境' => '测试地址:http://xxx,账号:admin,密码:请找运维', '部署文档' => '部署文档见:http://wiki.xxx.com/deploy', '帮助' => '目前支持以下关键词:测试环境、部署文档', ]; foreach ($keywordMap as $keyword => $reply) { if (mb_strpos($content, $keyword) !== false) { return $reply; } } return '抱歉,这个问题我需要人工确认,稍后回复你。'; } }3.4 群机器人消息发送封装
群机器人的发送接口比较纯粹,封装一个类就能覆盖大部分场景。文本、Markdown、图片是三种最常用的消息类型。
<?php class WebhookSender { private $webhookUrl; public function __construct(string $webhookUrl) { $this->webhookUrl = $webhookUrl; } public function sendText(string $content): bool { $payload = [ 'msgtype' => 'text', 'text' => ['content' => $content], ]; return $this->post($payload); } public function sendMarkdown(string $content): bool { $payload = [ 'msgtype' => 'markdown', 'markdown' => ['content' => $content], ]; return $this->post($payload); } private function post(array $payload): bool { $ch = curl_init($this->webhookUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $status === 200 && isset(json_decode($response, true)['errcode']); } }用Webhook发消息时,文本内容要注意控制长度,超长内容会被企业微信截断。Markdown格式的企业微信有自己的一套语法,不支持所有标准的Markdown语法,加粗、链接、引用这些基础的是支持的,表格和图片标签就有限制。建议先做一个小工具页面调试格式,再接到正式逻辑里,省得来回试。
4. 从零到一跑通项目的部署清单
4.1 环境准备与目录部署
项目对运行环境的要求很低,常规LNMP/LAMP环境就能跑。推荐环境如下:
- PHP 7.4 或更高版本(建议8.0+,性能更好)
- 必须开启扩展:curl、openssl、mbstring、libxml
- Nginx 或 Apache,支持PATH_INFO转发就行
- 服务器能访问外网(需要访问企微API)
把源码上传到服务器后,站点根目录指向项目目录,重写规则把所有请求转发到run.php。Nginx的配置参考如下:
server { listen 443 ssl; server_name bot.example.com; ssl_certificate /etc/nginx/ssl/bot.crt; ssl_certificate_key /etc/nginx/ssl/bot.key; root /var/www/wxbot; index run.php index.php; location / { try_files $uri $uri/ /run.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }回调URL必须是HTTPS,而且企业微信要求域名必须ICP备案,这个要注意。如果只是为了本地开发调试,可以申请免费证书,开发阶段做临时公网映射测试,但生产环境一定要正规证书。
4.2 企业微信管理后台的配置步骤
后台配置是整个接入过程里最繁琐的一步,按顺序操作能省不少时间。
第一步,进入企业微信管理后台,找到“应用管理-自建应用”,点击创建应用。填好应用名称和Logo,设置可见范围。创建完成后,应用详情页里能看到AgentId和Secret,这两个参数先记录下来。
第二步,打开“企业信息”,记录CorpID。CorpID是企业的唯一标识,整个接入过程中所有接口都要用到。
第三步,在应用详情页里找到“企业可信IP”,把服务器出口公网IP配置进去。这一步很容易漏,不配置的话,调用API时会报60020错误,提示“请在企业微信后台添加可信IP”。
第四步,配置“接收消息”。打开“API接收消息”,填写回调URL,比如https://bot.example.com/run.php,选择签名验证方式。这里有两个选择:明文模式和安全模式,我建议直接选安全模式,虽然要处理AES解密,但一步到位,后续不用来回切。
第五步,点击保存时,企业微信会向回调URL发一个GET请求,你的服务器代码需要正确响应,后台才会保存成功。
4.3 回调地址验证的完整流程
回调验证是整个接入流程里最容易卡住的地方。企业微信在后台点击保存时,会向你的回调URL发起一个GET请求,携带参数如下:
msg_signature=xxx×tamp=xxx&nonce=xxx&echostr=xxx你的服务器收到这个GET请求后,需要验证msg_signature,验证通过后,把echostr原样返回。后台收到正确的echostr,URL验证才算通过。
<?php $signature = $_GET['msg_signature'] ?? ''; $timestamp = $_GET['timestamp'] ?? ''; $nonce = $_GET['nonce'] ?? ''; $echostr = $_GET['echostr'] ?? ''; $signer = new Signature($config['token']); if ($signer->verify($signature, $timestamp, $nonce)) { echo $echostr; exit; } exit('invalid signature');有一个非常容易被忽略的坑:验证GET请求和接收消息的POST请求的是同一个入口文件,但很多教程把两个逻辑分开写了,结果GET验证通过了,POST消息却处理不了,或者反过来。最稳妥的做法是统一入口,入口里先判断请求方法,GET走验证逻辑,POST走消息解析逻辑。
4.4 连通性自测方法
配置完成后,先用curl手动测一遍Webhook发送,确认网络链路通畅:
curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key" \ -H "Content-Type: application/json" \ -d '{"msgtype":"text","text":{"content":"连通性测试"}}'返回{"errcode":0,"errmsg":"ok"}就说明链路正常。如果报错,重点看errcode对应的含义,常见的几个:
| errcode | 含义 | 处理方式 |
|---|---|---|
| 0 | 成功 | 无需处理 |
| 93000 | 不合法的webhook地址 | 检查key是否复制完整 |
| 45009 | 接口调用超过限额 | 稍后重试,或降低推送频次 |
| 40014 | access_token不合法 | 检查token是否过期,重新获取 |
| 60020 | 访问ip不在白名单 | 去后台配置企业可信IP |
自建应用的消息发送测试也类似,用curl带access_token调用发送接口即可。测通了再跑业务逻辑,排查问题会轻松很多。
5. 实测中的高频踩坑与排查思路
5.1 回调验证失败的完整排查链路
回调验证失败是我见过最多的问题,没有之一。很多人后台配置保存时直接报“URL验证失败”,然后开始怀疑签名算法有问题,其实绝大多数情况根本不是签名的问题。
我总结了一套排查链路,按顺序操作,基本都能定位到根因。
第一步,确认URL公网可达。在服务器上直接curl自己的回调地址:
curl -k "https://bot.example.com/run.php?msg_signature=test×tamp=1&nonce=1&echostr=test"如果返回的不是字符串而是404或者超时,说明Nginx配置或者服务没起来,先解决这个问题再说。
第二步,看服务器日志。打开Nginx的access_log和PHP错误日志,在企业微信后台点保存,看有没有来自企业微信的请求进来。如果完全没有请求,说明URL配置有问题,最常见的是域名没备案、端口没开放、HTTPS证书无效。
第三步,确认GET和POST都走到了同一个入口。有些开发者只写POST处理逻辑,没有处理GET验证逻辑,后台保存时发来的是GET请求,入口什么都不返回,自然验证失败。
第四步,检查签名参数。加密模式下参数名是msg_signature,明文模式下是signature,别搞混了。签名排序时sort一定要用SORT_STRING。
第五步,检查服务器时间。服务器时间不准会导致签名验证里的时间戳错误,虽然企微官方文档没明确说签名验证强校验时间窗口,但时间偏差太大确实会引发各种诡异问题。用date -R看一下服务器时间,同步一下NTP没坏处。
5.2 access_token 的缓存与限流
自建应用获取access_token的接口,官方对获取频率有限制,虽然具体限额文档没有公开写死,但实践下来短时间内频繁调用会触发限流。而且access_token是所有接口的“门票”,如果每次发送消息都重新拉取,不仅慢,还可能把自己给封了。
工程上必须做缓存。最简单的方式是缓存到文件:
<?php class AccessToken { private $corpId; private $secret; private $cacheFile; public function __construct(string $corpId, string $secret, string $cacheFile) { $this->corpId = $corpId; $this->secret = $secret; $this->cacheFile = $cacheFile; } public function get(): string { if (is_file($this->cacheFile)) { $cache = json_decode(file_get_contents($this->cacheFile), true); if ($cache && $cache['expire_at'] > time() + 200) { return $cache['access_token']; } } $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$this->corpId}&corpsecret={$this->secret}"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = json_decode(curl_exec($ch), true); curl_close($ch); if (!$result || isset($result['errcode'])) { throw new \RuntimeException('获取access_token失败:' . json_encode($result)); } // 提前200秒过期,留出时间余量 $cacheData = json_encode([ 'access_token' => $result['access_token'], 'expire_at' => time() + $result['expires_in'] - 200, ]); file_put_contents($this->cacheFile, $cacheData); return $result['access_token']; } }缓存过期时间设置上,我习惯提前200秒刷新,而不是等到最后一刻。线上网络抖动可能导致过期后的第一次请求失败,提前刷新能有效避开这个问题。
5.3 加密模式下的消息解密要点
如果后台选择了安全模式,回调POST过来的消息体是加密的,需要先解密才能拿到真正的XML。解密的算法是AES-256-CBC。
加密模式下POST请求的参数和GET验证略有不同,除了msg_signature、timestamp、nonce之外,POST body是JSON格式:
{ "msg_signature": "xxx", "timestamp": "1234567890", "nonce": "xxx", "encrypt": "加密后的消息体" }解密时需要用EncodingAESKey生成密钥和IV,核心逻辑如下:
<?php class Prpcrypt { private $key; private $iv; public function __construct(string $encodingAesKey) { // 企业微信的EncodingAESKey是43位,最后一位是等号 $this->key = base64_decode($encodingAesKey . '='); $this->iv = substr($this->key, 0, 16); } public function decrypt(string $encrypted): string { $decrypted = openssl_decrypt( base64_decode($encrypted), 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $this->iv ); // 去掉PKCS7填充后的尾部字节 $pad = ord(substr($decrypted, -1)); return substr($decrypted, 0, -$pad); } }解密后的内容才是标准的XML消息体,之后按明文格式解析即可。
解密这一块,我的建议是:如果团队对AES不熟悉,初期先用明文模式把业务跑通,之后再切安全模式。但别在明文模式下停留太久,安全模式才是生产环境该有的样子。
5.4 群里发不出消息的几个常见原因
机器人好不容易跑通了,结果群里发不出消息,这种挫败感我太懂了。遇到这种情况,按优先级排查:
一是Webhook地址失效。如果群机器人被移出群聊,或者机器人被删除后再添加,Webhook地址会变化,旧地址就废了。我就遇到过同事清理群聊把机器人踢了,但告警脚本还往旧地址发,直到发现群里没消息才反应过来。
二是发送频率超限。每个群机器人每分钟20条消息,监控系统如果短时间触发大量告警,很容易直接把配额打满。解决思路是告警聚合——把相同类型的告警合并成一条消息再推送,或者加一个简单的队列延迟发送。
三是内容格式问题。文本消息超过长度限制会被截断,Markdown格式不兼容会渲染异常。建议写一条简单的业务规则:长内容拆成多条,Markdown只用基础语法。
四是服务器出口IP被限制。企业可信IP未配置时,自建应用发送消息会直接报错,webhook发送虽然不校验IP,但如果公司出口IP被封禁,也会导致超时。
5.5 开发调试的小技巧
最后分享几个我实际用下来非常顺手的调试技巧。
第一,在入口文件里加一个完整的请求日志。把每次回调的GET参数、POST原始包、签名验证结果、响应内容全部写入日志文件。之前排查问题全靠它,特别是对接第三方系统时,日志能清晰地告诉你消息到底有没有到达服务器,走到哪一步断了。
第二,写一个本地模拟脚本,模拟企业微信回调推送一个文本消息。这样不用每改一次代码就去企业微信后台手动发消息测试,本地直接curl模拟POST就能验证业务逻辑。
curl -X POST "https://bot.example.com/run.php" \ -H "Content-Type: application/xml" \ -d '<xml> <ToUserName>to</ToUserName> <FromUserName>from</FromUserName> <CreateTime>1700000000</CreateTime> <MsgType>text</MsgType> <Content>测试环境</Content> <MsgId>1234567890</MsgId> <AgentID>1000002</AgentID> </xml>'第三,把日志级别做成可配置的。生产环境只记录ERROR,开发环境打开DEBUG,避免大量日志刷爆磁盘的同时,还能在需要时快速看到所有请求信息。
第四,写机器人回复之前,一定要想清楚“机器人会不会出现死循环”。如果你的机器人收到消息后会自动回复,回复的内容又触发了另一个机器人的监听,两个机器人之间疯狂互发消息,那画面太美我不敢看。建议在回复逻辑里加一条规则:对来自机器人账号的消息不处理。
这套项目跑起来之后再回看,最值得的不是那几段代码,而是你真正把自己的办公流程理了一遍。机器人是个入口,顺着它把消息、告警、审批这些线串起来,效率提升是实实在在的。先把推送到群做通,再考虑双向交互,一步一个脚印,这条路我替你走过了,不算难。
本文还有配套的精品资源,点击获取