Files
aiagents-stock/test_notification_debug.py
T
2025-10-09 11:47:54 +08:00

216 lines
6.9 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
通知系统诊断工具
用于排查邮件通知问题
"""
import sqlite3
from notification_service import notification_service
from monitor_db import monitor_db
from datetime import datetime
def check_database():
"""检查数据库中的通知"""
print("\n" + "="*60)
print("1. 检查数据库中的通知记录")
print("="*60)
conn = sqlite3.connect('stock_monitor.db')
cursor = conn.cursor()
# 检查所有通知
cursor.execute('''
SELECT n.id, s.symbol, s.name, n.type, n.message, n.triggered_at, n.sent
FROM notifications n
JOIN monitored_stocks s ON n.stock_id = s.id
ORDER BY n.triggered_at DESC
LIMIT 20
''')
notifications = cursor.fetchall()
if notifications:
print(f"\n最近20条通知记录:")
for row in notifications:
sent_status = "✅已发送" if row[6] else "⏳待发送"
print(f" [{sent_status}] {row[1]} - {row[3]} - {row[4]}")
print(f" 时间: {row[5]}")
else:
print(" ❌ 数据库中没有任何通知记录")
# 检查待发送通知
cursor.execute('''
SELECT COUNT(*) FROM notifications WHERE sent = FALSE
''')
pending_count = cursor.fetchone()[0]
print(f"\n待发送通知数量: {pending_count}")
conn.close()
def check_email_config():
"""检查邮件配置"""
print("\n" + "="*60)
print("2. 检查邮件配置")
print("="*60)
config = notification_service.get_email_config_status()
print(f"\n邮件启用: {'✅ 是' if config['enabled'] else '❌ 否'}")
print(f"SMTP服务器: {config['smtp_server']}")
print(f"SMTP端口: {config['smtp_port']}")
print(f"发件人: {config['email_from']}")
print(f"收件人: {config['email_to']}")
print(f"配置完整: {'✅ 是' if config['configured'] else '❌ 否'}")
return config['configured']
def test_email_connection():
"""测试邮件连接"""
print("\n" + "="*60)
print("3. 测试邮件连接")
print("="*60)
print("\n正在发送测试邮件...")
success, message = notification_service.send_test_email()
if success:
print(f"✅ {message}")
return True
else:
print(f"❌ {message}")
return False
def send_pending_notifications():
"""尝试发送待发送的通知"""
print("\n" + "="*60)
print("4. 尝试发送待发送的通知")
print("="*60)
pending = monitor_db.get_pending_notifications()
if not pending:
print("\n没有待发送的通知")
return
print(f"\n找到 {len(pending)} 条待发送通知:")
for notif in pending:
print(f" - {notif['symbol']}: {notif['message']}")
print("\n开始发送...")
notification_service.send_notifications()
# 再次检查
pending_after = monitor_db.get_pending_notifications()
print(f"\n发送后剩余待发送通知: {len(pending_after)}")
def check_stock_prices():
"""检查监测股票的当前价格和触发条件"""
print("\n" + "="*60)
print("5. 检查监测股票状态")
print("="*60)
stocks = monitor_db.get_monitored_stocks()
if not stocks:
print("\n没有监测股票")
return
print(f"\n共有 {len(stocks)} 只股票在监测:")
for stock in stocks:
print(f"\n📊 {stock['symbol']} - {stock['name']}")
print(f" 当前价格: {stock['current_price']}")
entry_range = stock['entry_range']
print(f" 进场区间: {entry_range['min']} - {entry_range['max']}")
if stock['take_profit']:
print(f" 止盈位: {stock['take_profit']}")
if stock['stop_loss']:
print(f" 止损位: {stock['stop_loss']}")
print(f" 通知启用: {'✅' if stock['notification_enabled'] else '❌'}")
print(f" 最后检查: {stock['last_checked'] or '从未'}")
# 检查是否满足触发条件
if stock['current_price']:
price = float(stock['current_price'])
# 检查进场区间
if price >= entry_range['min'] and price <= entry_range['max']:
print(f" 🟢 当前价格在进场区间内")
# 检查最近是否有通知
if monitor_db.has_recent_notification(stock['id'], 'entry', minutes=60):
print(f" ⚠️ 但最近60分钟内已发送过进场通知(防重复机制)")
else:
print(f" ❗ 应该触发通知但没有!")
else:
if price < entry_range['min']:
print(f" ⬇️ 当前价格低于进场区间 (差 {entry_range['min'] - price:.2f})")
else:
print(f" ⬆️ 当前价格高于进场区间 (高出 {price - entry_range['max']:.2f})")
# 检查止盈
if stock['take_profit'] and price >= stock['take_profit']:
print(f" 🟡 已达到止盈位")
if monitor_db.has_recent_notification(stock['id'], 'take_profit', minutes=60):
print(f" ⚠️ 最近60分钟内已发送过止盈通知")
# 检查止损
if stock['stop_loss'] and price <= stock['stop_loss']:
print(f" 🔴 已达到止损位")
if monitor_db.has_recent_notification(stock['id'], 'stop_loss', minutes=60):
print(f" ⚠️ 最近60分钟内已发送过止损通知")
def main():
"""主函数"""
print("\n" + "="*60)
print("股票监测通知系统诊断工具")
print("="*60)
print(f"诊断时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
# 1. 检查数据库
check_database()
# 2. 检查邮件配置
email_configured = check_email_config()
# 3. 测试邮件连接
if email_configured:
email_ok = test_email_connection()
else:
print("\n⚠️ 邮件未配置,跳过邮件测试")
email_ok = False
# 4. 检查股票价格和触发条件
check_stock_prices()
# 5. 尝试发送待发送通知
send_pending_notifications()
# 总结
print("\n" + "="*60)
print("诊断总结")
print("="*60)
if email_configured and email_ok:
print("✅ 邮件系统正常")
elif email_configured:
print("⚠️ 邮件已配置但发送失败,请检查配置参数")
else:
print("❌ 邮件未配置")
print("\n建议:")
print("1. 确保监测服务正在运行")
print("2. 检查股票价格是否在触发区间内")
print("3. 注意60分钟防重复机制")
print("4. 查看终端日志中的详细错误信息")
print("5. 如果邮件测试成功但监测通知收不到,检查.env配置")
print("\n" + "="*60)
if __name__ == "__main__":
main()