LangChain+Ollama实现自动通过企业微信发消息:零成本响应快(未认证企业也可用)
前言
以“给妈妈自动发暖心问候语的本地Agent”为案例,最终成功用企业微信的API来实现消息推送。本以为很简单,结果踩了一路的坑。特别是对于未认证的个人组织企业,企业微信的种种限制让人抓狂。本文将详细记录整个过程,重点介绍接收消息服务器URL的概念,以及如何避开cpolar、路由侠等工具被识别为第三方服务商的坑。
一、本地部署方案
云端大模型(GPT / 通义 / 智谱)要 API Key、要计费、要联网。玩个小项目,奔着0成本去,就装了个Ollama,拉了个Qwen2.5:7b(通义千问的中文版,大概4.7G),本地跑起来,完全免费,断网也能用,我16G内存的笔记本CPU跑,一秒能吐五六个字,生成一句30字的问候语也就五六秒,完全够用。要是你有显卡,RTX 3060以上跑14B版本,那叫一个丝滑。
本地方案:
- 模型:Qwen2.5(7B 量化版约 4.7GB,中文能力强,通义出品)
- 推理:Ollama 本地服务
- 框架:LangChain
ChatOllama - 成本:0 元,断网也能跑
- 速度:
- 16G 内存 + CPU 跑
qwen2.5:7b≈ 5 token/s(开流式可接受) - RTX 3060 级别显卡跑 14B ≈ 15 token/s(丝滑)
- 开
streaming=True逐字吐字,体感比等整段生成快很多
- 16G 内存 + CPU 跑
# 1. 装 Ollama 后拉模型ollama pull qwen2.5:7b# 2. Python 依赖pipinstalllangchain langchain-ollama requests python-dotenvfromlangchain_ollamaimportChatOllama llm=ChatOllama(model="qwen2.5:7b",base_url="http://localhost:11434",temperature=0.7,streaming=True,# 本地模型提速关键)💡 生成问候语这种短文本任务,7B 完全够用,别一上来就冲 32B,家用机跑不动。
二、企业微信发消息的两条路
| 通道 | 是否需要 access_token | 未认证企业能否用 | 限制 |
|---|---|---|---|
| 群机器人 Webhook | ❌ 不需要 | ✅ 直接用 | 只能发到群,不能私信 |
自建应用message/send | ✅ 需要 | ⚠️ 能建但要可信 IP | 未认证企业卡死在 IP 白名单 |
我们的目标只是“给妈妈发句话”,我选用群机器人 Webhook 方案,简便快捷。
三、未认证企业的「会触发60020报错 」(重点避坑)
不要选择自建应用:
{"errcode":60020,"errmsg":"not allow to access from your ip"}含义:调用方公网 IP 不在「企业可信 IP」里。
未认证企业的输入框是灰的,你需要二选一完成以下信息,才能配置白名单IP:
- 配「可信域名」(要同主体备案域名 → 个人组织没有)
- 配「接收消息服务器 URL」解灰
接收消息服务器 URL 到底是什么?
不是你去访问企微,是企微反过来访问你。
- 方向:企微 Client → 你的 Flask Server
- 场景归类:等价于「网站搭建 / 公网暴露本机 Web 路由」,不是远程桌面、不是游戏联机
- 验证流程:
- 后台填
http://公网/wecom/callback - 企微发
GET ?msg_signature=×tamp=&nonce=&echostr=密文 - 你的服务验签、解密、原样返回明文 echostr(1 秒内)
- 验证通过 → 可信 IP 输入框解灰
- 后台填
我查了一些第三方工具生成可用的服务器IP,例如cpolar / 路由侠
它们给的共享二级域名:
*.cpolar.top*.rXX.cpolar.top*.luyouxia.net
企微在保存 URL 时会查域名备案主体,发现主体是「cpolar 公司 / 路由侠公司」,不是你的企业主体,直接拦截:
该域名主体为第三方服务商,请使用企业主体域名
实测结论(未认证个人组织):
- cpolar 随机域名 → ❌ 被拦
- 路由侠
.net共享域名 → ❌ 被拦 - ngrok-free → ❌ 被拦
四、成功方案:群消息 Webhook
企业微信建一个「你+妈妈」的内部群(必须是企业微信内部群,不是微信外部群)→ 群设置 → 群机器人 → 添加 → 复制 Webhook:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxx-xxxx-xxxx如何获取Webhook:点击群聊界面,点击右上角三个点,进入“消息推送”,添加一条消息推送后自动生成Webhook地址。
若无权限,网页端进入企业微信后台管理,点击“应用管理”,进入自建栏下的“消息推送”应用,在“可创建消息推送的成员”处添加目标用户即可。
因为是调用本地大模型,代码里就不需要连接大模型API的相关参数了( token / corp_id / 可信 IP):
importos,requestsfromdotenvimportload_dotenv load_dotenv()WECOM_WEBHOOK=os.environ["WECOM_WEBHOOK"]defpush_to_mom(text:str)->str:r=requests.post(WECOM_WEBHOOK,json={"msgtype":"text","text":{"content":text}},timeout=5).json()return"✅ 已发送"ifr.get("errcode")==0elsef"❌{r}"五、LangChain 创建Agent (本地 Qwen2.5 驱动)
完整代码:
importosfromdatetimeimportdateimportdotenvimportrequests