Files
aiagents-stock/通知问题排查指南.md
T
2025-10-09 11:47:54 +08:00

6.6 KiB
Raw Blame History

通知问题排查指南

问题现象

监测股票到价格了,但没有收到消息(包括网页和邮件)

快速诊断

步骤1:运行诊断工具

python test_notification_debug.py

这个工具会检查:

  • 数据库中的通知记录
  • 邮件配置状态
  • 邮件发送测试
  • 股票价格和触发条件
  • 待发送通知

步骤2:检查常见问题

问题1:价格已不在触发区间

症状:股票价格曾经到达过,但现在已经超出区间

示例

  • 进场区间:44.87 - 46.48
  • 当前价格:47.99(已超出)
  • 结果:不会触发新通知

解决

  • 查看"通知历史"确认是否之前已触发过
  • 如需重新监测,调整进场区间

问题260分钟防重复机制

症状:价格在区间内,但不发送通知

原因:同一触发条件60分钟内只发送一次,避免重复

查看方法

python test_notification_debug.py

会显示:"⚠️ 最近60分钟内已发送过XX通知"

解决

  • 等待60分钟后会自动重新发送
  • 或者清空数据库通知记录(会导致历史丢失)

问题3:网页通知显示问题

症状:有通知但网页看不到

原因

  1. 之前的显示逻辑只显示"未发送"的通知
  2. 通知发送后被标记为"已发送"就不显示了

已修复

  • 现在显示所有最近通知(包括已发送和未发送)
  • 显示发送状态:" 已发送" 或 " 待发送"

问题4:邮件配置问题

检查清单

# .env 文件
EMAIL_ENABLED=true                    # 必须是 true
SMTP_SERVER=smtp.qq.com               # QQ邮箱或其他
SMTP_PORT=587                         # 587(TLS) 或 465(SSL)
EMAIL_FROM=your_email@qq.com          # 发件邮箱
EMAIL_PASSWORD=xxxxxx                 # 授权码(不是登录密码!)
EMAIL_TO=receiver@example.com         # 收件邮箱

测试方法

  1. 在网页界面:监测管理 → 通知管理 → 发送测试邮件
  2. 或运行:python test_notification_debug.py

常见错误

  • 使用邮箱登录密码而非授权码
  • EMAIL_ENABLED 设置为 false
  • 端口号不正确(QQ邮箱用587或465)

完整排查流程

1. 确认监测服务运行

网页界面 → 监测管理
查看状态:🟢 运行中

如果显示"🔴 已停止",点击"▶️ 启动监测"

2. 查看通知历史

网页界面 → 监测管理 → 通知历史

应该能看到:

  • 所有触发的通知(新版本已修复)
  • 每条通知的发送状态
  • 触发时间

3. 检查股票状态

运行诊断工具查看详细信息:

python test_notification_debug.py

关注输出中的:

📊 股票代码 - 股票名称
  当前价格: XX.XX
  进场区间: XX.XX - XX.XX
  🟢 当前价格在进场区间内
  ⚠️ 但最近60分钟内已发送过进场通知

4. 查看终端日志

监测服务运行时会输出详细日志:

正常流程

正在更新股票 300832 的价格...
✅ 300832 当前价格: ¥66.5

==================================================
开始发送通知,共 1 条
==================================================

处理通知: 300832 - entry
📧 正在发送邮件...
  - 收件人: xxx@qq.com
  - 主题: 股票监测提醒 - 300832
  - 使用 SMTP+TLS 连接 smtp.qq.com:587
  - 正在登录...
  - 正在发送...
✅ 邮件发送成功: 300832
✅ 通知已成功发送并标记

配置问题

⚠️ 邮件配置不完整,使用界面通知
  - SMTP服务器: 未配置
  - 发件人: 未配置
  - 收件人: 未配置
  - 密码: 未配置

发送失败

邮件发送失败: [Errno 11001] getaddrinfo failed
使用界面通知作为备用方案

5. 手动测试通知

如果想立即测试通知(不等待价格触发):

# 创建测试脚本 test_manual_notification.py
from monitor_db import monitor_db
from notification_service import notification_service

# 添加一条测试通知
monitor_db.add_notification(
    stock_id=1,  # 你的股票ID
    notification_type='entry',
    message='这是一条测试通知'
)

# 立即发送
notification_service.send_notifications()

修复后的改进

1. 网页通知显示增强

  • 显示所有最近通知(不只是待发送的)
  • 显示发送状态标识
  • 显示待发送通知数量警告

2. 日志输出增强

  • 详细的邮件发送过程日志
  • 配置检查提示
  • 错误堆栈跟踪

3. 防重复机制

  • 60分钟内同类型通知只发送一次
  • 避免价格波动导致的重复通知

4. 监测频率优化

  • 5分钟循环检查
  • 按设定间隔更新每只股票
  • 股票间3秒延迟,避免API限流

预期效果

当股票价格满足条件时:

  1. 数据库记录

    notifications 表中新增记录
    sent = FALSE
    
  2. 发送通知

    调用 notification_service.send_notifications()
    尝试发送邮件
    标记 sent = TRUE
    
  3. 邮件到达

    收件箱收到邮件
    主题:股票监测提醒 - XXX
    
  4. 网页显示

    监测管理 → 通知历史
    显示:[✅ 已发送] 股票 XXX ...
    

常见场景答疑

Q1: 价格到了但没收到通知

检查

  1. 是否60分钟内已发送过?→ 查看通知历史
  2. 邮件配置是否正确?→ 发送测试邮件
  3. 监测服务是否运行?→ 查看状态
  4. 通知是否被禁用?→ 检查股票的"通知启用"开关

Q2: 测试邮件能收到,但监测邮件收不到

可能原因

  1. 触发条件未满足(价格不在区间)
  2. 60分钟防重复
  3. 监测服务未启动
  4. 代码更新前的旧版本问题

解决

  1. 运行 test_notification_debug.py 全面检查
  2. 查看终端日志确认是否真的触发
  3. 确保使用的是修复后的代码

Q3: 网页看不到通知

已修复:旧版本只显示待发送通知,新版本显示所有通知

刷新界面:点击"🔄 刷新状态"

Q4: 想立即重新发送通知

方法

  1. 清空通知记录(会丢失历史)
  2. 或等待60分钟
  3. 或调整价格区间让其重新触发

技术支持

如果问题仍未解决:

  1. 提供诊断报告

    python test_notification_debug.py > diagnosis.txt
    
  2. 提供终端日志 复制运行 Streamlit 的终端输出

  3. 检查文件

    • .env 配置(隐藏密码)
    • stock_monitor.db 是否存在
    • 监测股票列表截图
  4. 描述问题

    • 什么时候开始的?
    • 做了什么操作?
    • 预期行为 vs 实际行为