已通过 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 重启后会补发最近一次,所以改完配置重启一次即可验证,不必等下一个整点。

三、怎么做

第一步:确认目标已登记。 打开 /integrations/dsh-wecom/workspaces.json,在 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 后重新核对目标字段,避免静默失效。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注