Files
assist/start_feishu_bot.py
Jeason d6c87683af fix: 飞书长连接改用 ThreadPoolExecutor 处理消息
- 用 ThreadPoolExecutor(max_workers=5) 替代单次 threading.Thread
- 支持并发处理多条消息,避免排队阻塞
- 添加消息序号日志,方便追踪消息接收和处理
- _process_message_safe 包装确保异常不会导致线程崩溃
- 如果消息确实没被 SDK 推送,日志里不会有对应的 #N 记录
2026-04-02 16:24:58 +08:00

77 lines
2.2 KiB
Python
Executable File

#!/usr/bin/env python3
# 如果系统中 python 命令不存在,请使用: python3 start_feishu_bot.py
# -*- coding: utf-8 -*-
"""
启动飞书长连接客户端
使用官方 SDK 的事件订阅 2.0 模式,无需公网域名
"""
import sys
import os
import logging
from pathlib import Path
# 添加项目根目录到 Python 路径
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))
# 配置日志
import os
# 从环境变量获取日志级别,默认为 INFO
log_level = os.getenv('LOG_LEVEL', 'INFO').upper()
# 配置日志格式
logging.basicConfig(
level=getattr(logging, log_level, logging.INFO),
format='%(asctime)s [%(levelname)s] [%(name)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
logger = logging.getLogger(__name__)
def main():
"""主函数"""
# 加载配置
from src.config.unified_config import get_config
config = get_config()
logger.info("=" * 80)
logger.info("🚀 TSP Assistant - 飞书长连接客户端")
logger.info("=" * 80)
logger.info("")
logger.info("📋 配置信息:")
logger.info(f" - App ID: {config.feishu.app_id}")
logger.info(f" - 数据库: {config.database.url}")
logger.info(f" - LLM: {config.llm.provider}/{config.llm.model}")
logger.info(f" - 日志级别: {log_level}")
logger.info("")
logger.info("🔌 启动模式: 事件订阅 2.0(长连接)")
logger.info(" 优势:")
logger.info(" - 无需公网域名")
logger.info(" - 无需配置 webhook")
logger.info(" - 自动重连")
logger.info(" - 实时接收消息")
logger.info("")
logger.info("💡 提示: 按 Ctrl+C 停止服务")
logger.info("=" * 80)
logger.info("")
# 导入并启动长连接服务
from src.integrations.feishu_longconn_service import get_feishu_longconn_service
try:
service = get_feishu_longconn_service()
service.start() # 这里会阻塞,持续监听飞书事件
except KeyboardInterrupt:
logger.info("")
logger.info("⏹️ 用户中断,正在停止服务...")
logger.info("👋 再见!")
except Exception as e:
logger.error(f"服务异常退出: {e}", exc_info=True)
sys.exit(1)
if __name__ == "__main__":
main()