简介:本文详细讲解如何使用Python构建自定义服务,通过企业微信机器人API实现消息收发与智能交互,涵盖环境准备、API调用、消息处理等全流程。
企业微信作为国内主流的办公协作平台,其机器人功能(Webhook/自定义机器人)已成为企业自动化通知、智能客服的核心工具。然而,官方提供的机器人功能存在局限性:消息模板固定、无法存储上下文、难以集成复杂业务逻辑。通过Python自建服务对接企业微信机器人,可实现三大核心价值:
典型应用场景包括:
graph TDA[企业微信] -->|HTTP请求| B[Python服务]B --> C[消息处理模块]B --> D[业务逻辑层]D --> E[数据库]D --> F[第三方API]
# 创建虚拟环境(推荐)python -m venv wecom_envsource wecom_env/bin/activate # Linux/Macwecom_env\Scripts\activate # Windows# 安装核心依赖pip install flask requests python-dotenv
机器人创建:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXXX)权限配置:
from flask import Flask, request, jsonifyimport hashlibimport hmacimport timeapp = Flask(__name__)# 安全验证(可选)def verify_signature(request, secret):timestamp = request.headers.get('Timestamp')nonce = request.headers.get('Nonce')signature = request.headers.get('Signature')if not all([timestamp, nonce, signature]):return Falsesort_list = sorted([secret, timestamp, nonce])sort_str = ''.join(sort_list)hashcode = hmac.new(secret.encode('utf-8'),sort_str.encode('utf-8'),digestmod=hashlib.sha256).hexdigest()return hashcode == signature@app.route('/wecom/callback', methods=['POST'])def handle_message():# 安全验证示例(需配置Secret)# if not verify_signature(request, 'your_secret'):# return jsonify({'errcode': 403, 'errmsg': 'forbidden'})data = request.json# 消息类型处理if data['MsgType'] == 'text':content = data['Content']# 业务逻辑处理...return process_text_message(content)elif data['MsgType'] == 'event':return handle_event(data['Event'])return jsonify({'errcode': 0})
import requestsimport jsonclass WeComRobot:def __init__(self, webhook_url):self.webhook_url = webhook_urldef send_text(self, content, mentioned_list=None):data = {"msgtype": "text","text": {"content": content,"mentioned_list": mentioned_list or []}}return self._send(data)def send_markdown(self, content):data = {"msgtype": "markdown","markdown": {"content": content}}return self._send(data)def _send(self, data):headers = {'Content-Type': 'application/json'}response = requests.post(self.webhook_url,headers=headers,data=json.dumps(data))return response.json()# 使用示例robot = WeComRobot('你的Webhook URL')robot.send_markdown("### 任务通知\n""- 任务名称:数据同步\n""- 状态:**已完成**\n""- 耗时:2.3秒")
from datetime import datetime, timedeltaclass DialogContext:def __init__(self):self.sessions = {}def create_session(self, user_id):session_id = f"sess_{user_id}_{int(datetime.now().timestamp())}"self.sessions[session_id] = {'user_id': user_id,'data': {},'expire_at': datetime.now() + timedelta(minutes=30)}return session_iddef get_session(self, session_id):session = self.sessions.get(session_id)if session and datetime.now() < session['expire_at']:return sessionreturn Nonedef update_session(self, session_id, key, value):session = self.get_session(session_id)if session:session['data'][key] = valuereturn Truereturn False# 在消息处理中使用context_mgr = DialogContext()def process_text_message(content, sender_id):session_id = request.headers.get('X-Session-Id')if not session_id:session_id = context_mgr.create_session(sender_id)session = context_mgr.get_session(session_id)if content.lower() == 'help':context_mgr.update_session(session_id, 'state', 'waiting_help')return "请选择帮助类型:1.技术问题 2.业务咨询"# 其他处理逻辑...
from jinja2 import Environment, BaseLoaderclass MessageTemplate:def __init__(self):self.env = Environment(loader=BaseLoader())def render(self, template_str, context):template = self.env.from_string(template_str)return template.render(**context)# 使用示例template = MessageTemplate()msg = template.render("""### 订单通知- 订单号:{{order_id}}- 金额:¥{{amount}}- 状态:{% if paid %}已支付{% else %}待支付{% endif %}""", {'order_id': 'ORD123', 'amount': 299, 'paid': True})
from celery import Celeryimport timecelery = Celery('tasks', broker='redis://localhost:6379/0')@celery.taskdef process_heavy_task(data):time.sleep(10) # 模拟耗时操作return {"result": "processed", "data": data}# 在Flask路由中调用@app.route('/async_task', methods=['POST'])def start_async_task():data = request.jsontask = process_heavy_task.delay(data)return jsonify({"task_id": task.id})
| 方案 | 适用场景 | 优势 |
|---|---|---|
| Docker容器 | 微服务架构 | 环境一致,快速部署 |
| Kubernetes | 高可用、弹性扩展需求 | 自动扩缩容,服务自愈 |
| 服务器less | 轻量级、低频调用场景 | 按使用量计费,无需运维 |
import loggingfrom prometheus_client import start_http_server, Counter# 指标监控REQUEST_COUNT = Counter('wecom_requests_total', 'Total requests')logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',handlers=[logging.FileHandler('wecom_service.log'),logging.StreamHandler()])# 在Flask应用中添加@app.before_requestdef before_request():REQUEST_COUNT.inc()
通过Python自建服务对接企业微信机器人,企业可获得:
未来发展方向:
完整代码示例已上传至GitHub(示例链接),包含详细注释和测试用例。建议开发者从基础消息收发开始,逐步实现上下文管理和业务集成,最终构建完整的智能机器人服务。