把天气通知同时投到企业微信:DSH 投递目标配置
已通过 dsh-im 接入企业微信后,想让天气通知同时投到企业微信,要区分两件事:投递目标(往哪发)和触发方式(什么时候发)。混在一起就会出现“配置改了但没收到消息”。
一、什么情况下会撞上它
DSH 里已有定时任务,固定时刻把天气提示词投给某个会话,消息正常出现在原渠道;dsh-im 也已绑定企业微信,但天气通知始终只到旧渠道。此时改天气任务的提示词没用——问题在投递目标列表里没有企业微信这一项。
判断依据:手动调用一次本地投递接口,返回 {"sent": true} 但企业微信侧没收到,说明 targetId 或 botId 不对;接口直接报错,说明请求体字段有问题。两种情况都不需要动天气任务本身。
二、机制:目标在配置里,触发在 schedule 里
- 投递目标写在
的/integrations/dsh-<渠道>/workspaces.json deliveryTargets数组里,企业微信对应dsh-wecom(目录名以实际安装的插件为准)。每个目标含botId(标识机器人)和targetId(标识会话或用户)。 - 投递动作走本地回环接口:
POST http://127.0.0.1:3080/api/dsh-im/delivery/messages,请求体字段为botId、targetId、text、format。format只接受plain或markdown,其他值会被拒绝。接口只监听本机,无需鉴权。
天气通知本身是 schedule 任务。DSH 重启后会补发最近一次,所以改完配置重启一次即可验证,不必等下一个整点。
三、怎么做
第一步:确认目标已登记。 打开 ,在 deliveryTargets 里找企业微信条目,记下 botId 和 targetId。数组为空或没有该渠道条目,说明绑定只完成了鉴权,没有登记目标,需先补上。字段名以当前版本为准,不要自行添加未文档化的键。
第二步:用接口单独验证目标。
curl -s -X POST http://127.0.0.1:3080/api/dsh-im/delivery/messages \
-H 'Content-Type: application/json' \
-d '{"botId":"<botId>","targetId":"<targetId>","text":"投递连通性测试","format":"plain"}'
返回 {"sent": true} 表示请求被受理,不等于送达;企业微信侧是否出现消息还要看机器人权限和会话状态。
第三步:把目标加入天气通知的投递范围。 天气通知走 schedule 任务,投递目标由任务关联的会话决定。把该任务的目标会话指向包含企业微信目标的会话,或按当前版本把 deliveryTargets 中的企业微信条目纳入。键名以当前版本为准,改前先备份原文件。
第四步:重启并观察补发。 这是最快的验证时机。
四、怎么确认成了 / 哪一步失败
- 返回
{"sent": true}但企业微信无消息:查botId、targetId是否与workspaces.json一致,以及机器人是否在目标会话内。 - 返回 4xx:优先检查
format是否为plain或markdown,以及 JSON 字段名是否拼错。 - 接口连不上:确认 DSH 主进程在跑、端口 3080 未被占用;接口只监听
127.0.0.1,从其他主机访问必然失败。 - 接口通了但天气通知没到:问题在 schedule 侧,检查任务是否启用、目标会话是否已更新。可在
下的/sessions/ session.v4.jsonl.zstd中核对该时刻是否有投递记录。
五、边界
同一条通知会发往多个目标,企业微信侧若是群聊,注意消息频率和成员感受。format 选 markdown 时企业微信支持范围有限,复杂表格可能显示异常,天气通知建议用 plain。本地接口无鉴权的前提是只监听回环地址,不要把 3080 暴露到非本机网络。schedule 配置结构随版本变化,升级 DSH 后重新核对目标字段,避免静默失效。