Skip to content

Conversation

@L-aros
Copy link

@L-aros L-aros commented Dec 20, 2025

📜 标题(Title)

请提供这个Pull Request中提议的更改的简洁描述:

  • Update app/messages/notification_service.py:新增飞书推送、签名校验与时间戳获取增强。

🔍 描述(Description)

请描述这个PR做了什么/为什么这些更改是必要的:

  • 完整实现飞书自定义机器人推送逻辑:
    • 封装 send_to_feishu,支持 textpost 两种消息格式;
    • post 模式下按行拆分内容,自动构建飞书富文本结构。
  • 实现飞书签名校验以通过“签名校验 + 时间戳”安全设置:
    • 使用 timestamp + "\n" + secret 作为 HMAC-SHA256 的 key、空串 "" 作为消息体;
    • 将 HMAC 结果做 Base64 编码后写入 sign 字段,保证与飞书官方文档及社区示例一致,修复 19021 sign match fail 错误。
  • 增强获取时间戳逻辑 _get_feishu_timestamp
    • 优先从多个线上服务(如 https://open.feishu.cn/https://www.feishu.cn/https://www.cloudflare.com/)的 Date 响应头获取时间,增加 5 分钟缓存;
    • 对超过 1 小时偏差的时间源进行过滤,必要时回退到本机时间,降低“时间戳不在 1 小时内”的出错概率。
  • 保留并复用现有通知能力:
    • 未改动钉钉、企业微信、Bark、ntfy、Telegram、Email 等其他渠道的实现,只在内部增加了飞书所需的签名与时间戳逻辑。

这些更改是必要的,因为:

  • 飞书自定义机器人默认建议开启签名校验,不正确的签名算法会导致持续的 19021 错误,无法在群里收到消息;
  • 通过多时间源+缓存的方式生成时间戳,可以在一定程度上屏蔽本机时间不准确或网络抖动导致的问题;
  • 在不影响既有通道的前提下,新增飞书支持,满足用户在飞书生态下接收推送的需求。

📝 类型(Type of Change)

这个PR引入了哪种类型的更改?(请勾选所有适用的选项)

  • 修复Bug
  • 新功能
  • 代码风格更新(格式化,局部变量)
  • 重构(改进代码结构)
  • 构建相关更改(依赖项,构建脚本等)
  • 其他:请描述

🏗️ 测试(Testing)

请描述您已经进行的测试:

  • 使用虚拟环境在本地运行语法与编译检查:
    • 执行 python -m compileall app main.py,确认 notification_service.py 与其他模块均能成功编译,无语法错误。
  • 实际运行应用并触发推送:
    • 在 Windows 本地执行 python main.py 启动应用;
    • 配置飞书自定义机器人(Webhook + 签名密钥),开启飞书推送;
    • 触发一次直播开播通知,确认日志中飞书接口不再返回 19021 sign match fail or timestamp is not within one hour from current time,并能在飞书群中收到消息(或至少接口返回 StatusCode == 0 / code == 0)。

如果适用,请提供测试更改的说明:

  • 在飞书群聊中创建自定义机器人:
    1. 开启“签名校验”,复制 Webhook URL 与签名密钥 secret
    2. 将 Webhook 和签名密钥填入应用设置中的飞书推送配置,选择合适的消息类型(textpost),保存配置。
  • 在应用中:
    1. 确保有一条启用“消息推送”的录制任务;
    2. 让该任务对应的直播进入“开播”状态,触发通知;
    3. 观察飞书群是否收到消息,以及日志中飞书返回的状态码是否为成功值(0)。

📋 检查清单(Checklist)

在您创建这个PR之前,请确保以下所有框都被勾选,方法是在每个框中放置一个x

  • 我已经阅读了贡献指南文档
  • 我的更改没有产生新的警告
  • 我已经添加了覆盖我更改的测试
  • 我已经相应地更新了文档(如果适用)
  • 我遵循了这个项目的代码风格

注意: 这个PR在所有复选框被勾选之前不会被合并。


感谢您的贡献!

  - 完整实现飞书自定义机器人推送逻辑,支持 `text` / `post` 两种消息格式。
  - 实现飞书签名校验:使用 `timestamp + "\n" + secret` 作为 HMAC-SHA256 的 key、空串作为消息体,结果做 Base64 编码,保证与官方文档一致。
  - 增强获取时间戳逻辑:优先从多个线上服务 `Date` 头获取时间,带缓存与越界校验,以降低“时间戳不在1小时内”的报错概率。
  - 保留并复用钉钉、企业微信、Bark、ntfy、Telegram、邮件等既有推送能力。
@L-aros L-aros changed the title Update notification_service.py 新增飞书推送、签名校验与时间戳获取增强 Dec 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant