DSA DOCS

DSA 文档中心

围绕 DSA 真实使用路径:快速开始、Actions、本地、Docker,以及源项目完整文档。

GitHub Actions 部署 本地运行 Docker 部署 打开 DSA 仓库
通知与 Bot

通知渠道配置参考

通知渠道、配置 key、GitHub Actions 映射、CLI 诊断和 Web 一键测试参考。

源文档 版本: v3.18.0-10-gc452e7f 更新: 2026-05-23
NOTIFY

本文档记录通知能力 -P7 终态:渠道、配置 key、GitHub Actions 映射、Web 设置元数据、CLI 诊断口径、Web 一键测试、自定义 Webhook Body 模板语义、通知路由策略、降噪机制、聚合报告失败隔离、ntfy / Gotify 一等渠道、WebPush / Apprise 评估,以及本地 / Docker / GitHub Actions / Desktop 场景化配置说明。只做基线与只读诊断;增加 Web 单渠道真实测试;产品化现有 Body 模板;P3 增加 report / alert / system_error 路由;P4 增加进程内降噪;P5 强化测试诊断和聚合报告逐渠道失败隔离;P6-A 新增 ntfy;P6-C 新增 Gotify;P6-D 只评估 WebPush / Apprise;P7 收口文档与 Actions env 对照表自动化,不新增运行时依赖、配置入口、per-URL 模板、跨进程持久化、真实每日摘要或重试循环。

渠道基线

渠道类型Minimal keyAdvanced key说明
企业微信静态配置WECHAT_WEBHOOK_URLWECHAT_MSG_TYPE配置后参与批量通知发送
飞书 Webhook静态配置FEISHU_WEBHOOK_URLFEISHU_WEBHOOK_SECRET, FEISHU_WEBHOOK_KEYWORDFEISHU_APP_ID / FEISHU_APP_SECRET 不会单独开启群 Webhook 推送
Telegram静态配置TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_IDTELEGRAM_MESSAGE_THREAD_IDtoken 与 chat id 必须同时存在
邮件静态配置EMAIL_SENDER, EMAIL_PASSWORDEMAIL_RECEIVERS, EMAIL_SENDER_NAMEEMAIL_RECEIVERS 留空时发给自己
Pushover静态配置PUSHOVER_USER_KEY, PUSHOVER_API_TOKEN-两个 key 必须同时存在
ntfy静态配置NTFY_URLNTFY_TOKEN, WEBHOOK_VERIFY_SSLNTFY_URL 必须包含 topic path,例如 https://ntfy.sh/my-topic
Gotify静态配置GOTIFY_URL, GOTIFY_TOKENWEBHOOK_VERIFY_SSLGOTIFY_URL 是 server base URL,不包含 /message;token 通过 X-Gotify-Key Header 发送
PushPlus静态配置PUSHPLUS_TOKENPUSHPLUS_TOPICPUSHPLUS_TOPIC 仅在 token 存在时生效
Server酱3静态配置SERVERCHAN3_SENDKEY-手机 App 推送
自定义 Webhook静态配置CUSTOM_WEBHOOK_URLSCUSTOM_WEBHOOK_BEARER_TOKEN, CUSTOM_WEBHOOK_BODY_TEMPLATE, WEBHOOK_VERIFY_SSL支持多个 URL,逗号分隔
Discord静态配置DISCORD_WEBHOOK_URL 或 DISCORD_BOT_TOKEN + DISCORD_MAIN_CHANNEL_IDDISCORD_INTERACTIONS_PUBLIC_KEYWebhook 与 Bot 均可启用发送
Slack静态配置SLACK_WEBHOOK_URL 或 SLACK_BOT_TOKEN + SLACK_CHANNEL_ID-Bot 优先用于文本与图片同频道发送
AstrBot静态配置ASTRBOT_URLASTRBOT_TOKEN, WEBHOOK_VERIFY_SSLASTRBOT_TOKEN 可选
UNKNOWN兜底枚举--仅为未知渠道兜底,不由静态环境变量启用
钉钉会话运行时上下文--从来源消息上下文提取,无法仅由 .env 静态判断
飞书会话运行时上下文--从来源消息上下文提取,无法仅由 .env 静态判断

Minimal / Advanced 分层

GitHub Actions 映射

仓库自带 .github/workflows/00-daily-analysis.yml 只显式导入固定变量名。/P3/P4/P6 已把 Body 模板、安全项、PushPlus topic、路由、降噪、ntfy 和 Gotify 等通知 key 纳入默认 workflow。下面的表格由 scripts/generate_notification_actions_env_table.py 从 workflow env: 和通知诊断元数据生成,避免手写对照表和真实 Actions 映射继续漂移。

<!-- notification-actions-env-table:start -->

KeyTierChannel / featureActions sourceDefault
WECHAT_WEBHOOK_URLminimalwechatSecret-
WECHAT_MSG_TYPEadvancedwechatVariable or Secretmarkdown
FEISHU_WEBHOOK_URLminimalfeishuSecret-
FEISHU_WEBHOOK_SECRETadvancedfeishuSecret-
FEISHU_WEBHOOK_KEYWORDadvancedfeishuVariable or Secret-
TELEGRAM_BOT_TOKENminimaltelegramSecret-
TELEGRAM_CHAT_IDminimaltelegramSecret-
TELEGRAM_MESSAGE_THREAD_IDadvancedtelegramSecret-
EMAIL_SENDERminimalemailVariable or Secret-
EMAIL_PASSWORDminimalemailSecret-
EMAIL_RECEIVERSadvancedemailVariable or Secret-
EMAIL_SENDER_NAMEadvancedemailVariable or Secretdaily_stock_analysis股票分析助手
PUSHOVER_USER_KEYminimalpushoverSecret-
PUSHOVER_API_TOKENminimalpushoverSecret-
NTFY_URLminimalntfySecret-
NTFY_TOKENadvancedntfySecret-
GOTIFY_URLminimalgotifySecret-
GOTIFY_TOKENminimalgotifySecret-
PUSHPLUS_TOKENminimalpushplusSecret-
PUSHPLUS_TOPICadvancedpushplusVariable or Secret-
CUSTOM_WEBHOOK_URLSminimalcustomSecret-
CUSTOM_WEBHOOK_BEARER_TOKENadvancedcustomSecret-
CUSTOM_WEBHOOK_BODY_TEMPLATEadvancedcustomVariable or Secret-
WEBHOOK_VERIFY_SSLadvancedntfy, gotify, custom, astrbotVariable or Secrettrue
DISCORD_WEBHOOK_URLminimaldiscordSecret-
DISCORD_BOT_TOKENminimaldiscordSecret-
DISCORD_MAIN_CHANNEL_IDminimaldiscordSecret-
ASTRBOT_URLminimalastrbotSecret-
ASTRBOT_TOKENadvancedastrbotSecret-
SERVERCHAN3_SENDKEYminimalserverchan3Secret-
SLACK_WEBHOOK_URLminimalslackSecret-
SLACK_BOT_TOKENminimalslackSecret-
SLACK_CHANNEL_IDminimalslackSecret-
NOTIFICATION_REPORT_CHANNELSadvancedroutingVariable or Secret-
NOTIFICATION_ALERT_CHANNELSadvancedroutingVariable or Secret-
NOTIFICATION_SYSTEM_ERROR_CHANNELSadvancedroutingVariable or Secret-
NOTIFICATION_DEDUP_TTL_SECONDSadvancednoiseVariable or Secret0
NOTIFICATION_COOLDOWN_SECONDSadvancednoiseVariable or Secret0
NOTIFICATION_QUIET_HOURSadvancednoiseVariable or Secret-
NOTIFICATION_TIMEZONEadvancednoiseVariable or Secret-
NOTIFICATION_MIN_SEVERITYadvancednoiseVariable or Secret-
NOTIFICATION_DAILY_DIGEST_ENABLEDadvancednoiseVariable or Secretfalse

<!-- notification-actions-env-table:end -->

默认 workflow 仍不映射 MARKDOWN_TO_IMAGE_CHANNELSMERGE_EMAIL_NOTIFICATION。它们是发送形态或聚合行为开关,不是渠道凭证;在 Actions 中自动开始读取同名 Secret/Variable 会引入额外行为变化。

CLI 诊断

python main.py --check-notify

该命令只读配置,不发送通知,不写入 .env。它会在配置加载和日志初始化后立即执行,完成后直接退出,不再进入 Web、调度、大盘复盘或默认分析流程。

Web 一键测试

Web 设置页的“通知渠道”分类提供单渠道测试入口。测试会使用当前页面草稿值合成临时配置,发送一条真实测试通知,但不会保存 .env,也不会修改运行时全局配置。

自定义 Webhook Body 模板

CUSTOM_WEBHOOK_BODY_TEMPLATE 是自定义 Webhook 的全局 JSON body 模板。配置后,它会先于 URL 自动识别生效,因此会覆盖 Bark、Slack、Discord、钉钉等自动 payload。未配置时仍使用原有 URL 自动识别;渲染后不是合法 JSON object 时会记录错误并回退默认 payload,不中断主通知流程。

可用占位符:

通用 webhook 示例:

CUSTOM_WEBHOOK_BODY_TEMPLATE={"title":$title_json,"content":$content_json}

Bark 通过 custom webhook 使用时,直接把 Bark endpoint 放入 CUSTOM_WEBHOOK_URLS,不需要额外 BARK_* 配置。未配置全局模板时,系统会按 api.day.app 自动生成 title / body / group;如果配置全局模板,需要自己写出 Bark body:

CUSTOM_WEBHOOK_URLS=https://api.day.app/YOUR_BARK_KEY
CUSTOM_WEBHOOK_BODY_TEMPLATE={"title":$title_json,"body":$content_json,"group":"stock"}

AstrBot 已是一等通知渠道,优先使用 ASTRBOT_URL 和可选的 ASTRBOT_TOKEN。只有需要把 AstrBot 兼容端点放入 CUSTOM_WEBHOOK_URLS 时,才使用 custom webhook 模板,例如:

CUSTOM_WEBHOOK_BODY_TEMPLATE={"content":$content_json}

ntfy 已是一等通知渠道,优先使用 NTFY_URL 和可选的 NTFY_TOKENNTFY_URL 表示完整 topic endpoint,例如 https://ntfy.sh/my-topichttps://self-hosted:port/my-topic;系统会解析最后一个 path segment 作为 topic,并向 server root 发送 JSON publish:

NTFY_URL=https://ntfy.sh/my-topic
NTFY_TOKEN=

Gotify 已是一等通知渠道,优先使用 GOTIFY_URLGOTIFY_TOKENGOTIFY_URL 表示 Gotify server base URL,可包含反向代理 path prefix,但不包含 /message;系统发送时会拼接固定 /message API,并通过 X-Gotify-Key Header 发送 application token。NTFY_URL 是完整 topic endpoint,而 GOTIFY_URL 是 server base URL,这是两个服务 API 设计差异导致的刻意选择:

GOTIFY_URL=https://gotify.example
GOTIFY_TOKEN=app-token
# 反向代理 path prefix 示例;实际请求会发送到 https://example.com/gotify/message
GOTIFY_URL=https://example.com/gotify
GOTIFY_TOKEN=app-token

NapCat / OneBot HTTP API 需要按实际 endpoint 和目标类型调整。下面只是常见 body 形态示例,user_idgroup_id、URL 路径和鉴权方式都应以你的 NapCat 配置为准:

# 私聊:CUSTOM_WEBHOOK_URLS=http://127.0.0.1:3000/send_private_msg
CUSTOM_WEBHOOK_BODY_TEMPLATE={"user_id":123456,"message":$content_json}
# 群聊:CUSTOM_WEBHOOK_URLS=http://127.0.0.1:3000/send_group_msg
CUSTOM_WEBHOOK_BODY_TEMPLATE={"group_id":123456789,"message":$content_json}

通知路由策略

P3 新增三类通知路由配置:

路由类型配置 key当前生产者
reportNOTIFICATION_REPORT_CHANNELS单股推送、聚合日报、大盘复盘、合并推送、飞书文档成功链接
alertNOTIFICATION_ALERT_CHANNELSEventMonitor 触发通知
system_errorNOTIFICATION_SYSTEM_ERROR_CHANNELS预留能力;当前不新增自动系统错误生产者

配置值为逗号分隔渠道枚举:wechat,feishu,telegram,email,pushover,ntfy,gotify,pushplus,serverchan3,custom,discord,slack,astrbot

聚合报告失败隔离

P5 强化聚合报告通知路径的失败边界:_send_notifications() 在 report 路由过滤后对每个静态通知渠道单独发送。某个渠道抛异常会记录日志并视为该渠道失败,但不会跳过后续渠道,也不会中断分析主流程。

通知降噪机制

P4 新增进程内降噪,只影响静态配置渠道,不影响 send_to_context() 的机器人触发会话回执。默认所有配置关闭,未设置时保持旧行为。

配置 key默认值说明
NOTIFICATION_DEDUP_TTL_SECONDS0同一稳定去重 key 在 TTL 内只发送一次;0 关闭
NOTIFICATION_COOLDOWN_SECONDS0同一冷却 key 在窗口内限频;0 关闭
NOTIFICATION_QUIET_HOURS静默时段,格式 HH:MM-HH:MM,支持跨午夜
NOTIFICATION_TIMEZONE静默时段时区,如 Asia/Shanghai;留空使用 Python 运行时本地时区(通常由进程 TZ 或系统时区决定)
NOTIFICATION_MIN_SEVERITYinfo, warning, error, critical;留空不过滤
NOTIFICATION_DAILY_DIGEST_ENABLEDfalse预留配置;当前不会发送每日摘要或持久化摘要内容

严重级别默认值:

实现边界:

WebPush / Apprise 评估

P6-D 只做设计评估,不新增依赖、.env 配置或运行时通知路径。结论是两者都不适合在本轮直接混入渠道实现 PR。

WebPush 后续如要实现,需要先单独设计订阅生命周期与安全边界:

Apprise 后续如要引入,应先作为可选依赖评估,而不是默认依赖:

本地配置

本地运行优先使用项目根目录 .env。复制 .env.example 后填写至少一个 minimal key 即可启用对应静态通知渠道;advanced key 只改变认证、安全、格式、路由或降噪行为,不会单独启用渠道。

python main.py --check-notify

--check-notify 是只读诊断:不发送通知、不写 .env、不进入分析流程。配置好 WebUI 后,也可以在系统设置页用单渠道测试发送真实测试消息;该测试只使用页面草稿临时配置,不保存 .env

Docker

Docker 场景可通过 --env-file .env / Compose env_file 注入运行时环境变量,也可以挂载 .env 让 Web 设置页和后端读写同一份配置文件。只注入环境变量但不挂载 .env 时,Web 设置页保存后的值在容器重启后可能被部署环境再次覆盖。

降噪静默时段建议显式配置 NOTIFICATION_TIMEZONE,避免容器默认时区与预期不一致。自签名内网 webhook 可临时使用 WEBHOOK_VERIFY_SSL=false,但不要在公网链路关闭证书校验。

GitHub Actions

默认 00-daily-analysis.yml 只读取表格中显式映射的 Secret / Variable。新增 repository Secret 或 Variable 后,只有变量名已经出现在 workflow env: 中才会进入运行进程;STOCK_GROUP_N / EMAIL_GROUP_N 这类任意编号变量不会自动导入。

Secret 适合 token、password、webhook URL 等敏感项;Variable 适合 WECHAT_MSG_TYPEEMAIL_SENDER_NAME、路由、降噪窗口和时区这类非敏感行为配置。MARKDOWN_TO_IMAGE_CHANNELSMERGE_EMAIL_NOTIFICATION 默认不映射,如需在自己的 fork 中使用,应显式修改 workflow 并补充对应测试。

Desktop

桌面端复用 Web 设置页的通知配置和单渠道测试入口。通知测试会发送真实测试消息,但只使用当前页面草稿值,不会自动保存;需要持久化时仍需点击保存配置。

桌面端可通过配置导出 / 导入恢复 .env。回滚某个通知渠道时,清空该渠道 minimal key 并保存即可;advanced key 留存不会单独启用渠道,但建议同步清理以减少后续排障噪音。

回滚方式