☰
企业微信API如何打造远程控制机器人?从消息指令到程序执行的完整链路
2026/9/30 13:49:14 网站建设 项目流程

最近做的企微二开,运维要求能在企微里远程控制服务器——发条消息"重启 nginx"机器人执行命令并回结果。和之前聊的自然语言控制和快捷指令不同,那些是控制业务系统,这篇是远程控制程序执行——消息变指令、指令变命令、命令执行、结果回传。把完整链路怎么搭记下来。

Eyun 平台开放的企微 API,统一 POST+JSON,鉴权用 App Token 加 appid(Authorization: Bearer eyk_xxxx),路径{BASE_URL}/wx-api/api/<模块>/<动作>,响应封套{code, data, detail, message, time},code 为 0 成功。

指令接收:Webhook 收消息

运维在企微发"重启 nginx",Webhook 回调到后端:

from flask import Flask, request app = Flask(__name__) @app.route("/wx-api/webhook/", methods=["POST"]) def webhook(): event = request.headers.get("X-Eyun-Event") if event != "message": return "ok" payload = request.json["data"] appid = payload["appid"] from_uin = payload["fromUin"] content = payload["content"] # 权限校验:只有运维组能发控制指令 if not is_admin(from_uin): return "ok" # 解析指令 cmd = parse_command(content) if cmd: execute_and_reply(appid, from_uin, cmd) return "ok"

权限校验是第一道——只有授权人员能发控制指令,普通员工发的消息不处理。

指令解析:消息变命令

"重启 nginx" 要解析成具体命令。用指令映射表,不直接执行用户输入:

COMMAND_MAP = { "重启nginx": {"cmd": "systemctl restart nginx", "risk": "medium"}, "重启redis": {"cmd": "systemctl restart redis", "risk": "medium"}, "查看日志": {"cmd": "tail -100 /var/log/app.log", "risk": "low"}, "清理缓存": {"cmd": "redis-cli flushall", "risk": "high"}, "查看状态": {"cmd": "systemctl status nginx", "risk": "low"} } def parse_command(content): content = content.strip() for key, cmd_def in COMMAND_MAP.items(): if key in content: return cmd_def return None

指令映射表是核心安全机制——不直接执行用户输入的字符串,只执行预定义命令。用户说"rm -rf /"不会被执行,不在映射表里就忽略。

命令执行:安全沙箱

解析出命令后执行。高风险命令要二次确认:

import subprocess def execute_command(cmd_def, from_uin): if cmd_def["risk"] == "high": # 高风险要二次确认 return {"need_confirm": True, "cmd": cmd_def["cmd"]} try: result = subprocess.run( cmd_def["cmd"], shell=True, capture_output=True, text=True, timeout=30 ) return { "stdout": result.stdout[-2000:], # 截断防止太长 "stderr": result.stderr[-500:], "returncode": result.returncode } except subprocess.TimeoutExpired: return {"error": "命令执行超时"}

timeout=30防止命令卡死。输出截断防止消息太长发不出去。高风险命令(如清理缓存)返回需要确认,不直接执行。关于消息接收和回复接口,在Eyun 企业微信 API 平台有说明。

结果回传:调消息接口

执行完调企微接口把结果发回去:

import requests BASE = "https://api.eyun.com" HEADERS = {"Authorization": "Bearer eyk_xxxx", "Content-Type": "application/json"} def reply_result(appid, to_uin, result): if result.get("need_confirm"): text = f"高风险操作:{result['cmd']}\n回复'确认'执行,其他忽略" elif result.get("error"): text = f"执行失败:{result['error']}" else: stdout = result.get("stdout", "").strip() text = f"执行完成(返回码 {result['returncode']})\n输出:\n{stdout}" requests.post( f"{BASE}/wx-api/api/message/sendText", headers=HEADERS, json={"appid": appid, "to": to_uin, "content": text} )

结果格式化成文本发回去。输出太长截断,关键字段(返回码、错误)保留。高风险操作发确认提示,运维回复"确认"才执行。

二次确认机制

高风险命令的二次确认流程:

pending_confirms = {} # from_uin -> {cmd, timestamp} def handle_confirm(appid, from_uin, content): if content.strip() == "确认" and from_uin in pending_confirms: pending = pending_confirms[from_uin] if time.time() - pending["timestamp"] < 60: # 60秒内有效 result = execute_command({"cmd": pending["cmd"], "risk": "low"}, from_uin) reply_result(appid, from_uin, result) del pending_confirms[from_uin] def execute_and_reply(appid, from_uin, cmd_def): if cmd_def["risk"] == "high": pending_confirms[from_uin] = { "cmd": cmd_def["cmd"], "timestamp": time.time() } reply_result(appid, from_uin, {"need_confirm": True, "cmd": cmd_def["cmd"]}) else: result = execute_command(cmd_def, from_uin) reply_result(appid, from_uin, result)

确认有效期 60 秒,超时要重新发指令。不做二次确认,运维手滑发个"清理缓存",数据全没了。

安全边界

远程控制机器人安全是第一位的,几条硬规矩:

  • 指令映射表:只执行预定义命令,不执行任意输入

  • 权限校验:只有授权人员能发指令

  • 风险分级:高风险要二次确认

  • 执行超时:防止命令卡死

  • 审计日志:谁、什么时候、执行了什么、结果

audit_log 表: from_uin command result timestamp ip

审计日志事后可追溯。不做审计,出了事故不知道谁干的。

写在最后

远程控制机器人这套东西,本质是把企微消息接口和命令执行串起来——Webhook 收指令、映射表解析、subprocess 执行、sendText 回结果。安全靠指令映射表(不执行任意输入)、权限校验、风险分级、二次确认、审计日志。把安全做严,运维在企微里发条消息就能管服务器——但每一步都可控可审计。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询