斗鱼加入了一个弹幕记录功能。会自动记录开播的弹幕信息

This commit is contained in:
liuwei
2026-02-24 16:51:55 +08:00
parent 52eed0185d
commit da744d7f5f
2 changed files with 19 additions and 4 deletions

View File

@@ -9,9 +9,13 @@ from typing import Dict, Any, List, Optional, Tuple, Set
import aiohttp import aiohttp
from loguru import logger from loguru import logger
import ssl import ssl
import websocket
import zlib import zlib
try:
import websocket
except ImportError:
websocket = None
from base.plugin_common.message_plugin_interface import MessagePluginInterface from base.plugin_common.message_plugin_interface import MessagePluginInterface
from base.plugin_common.plugin_interface import PluginStatus from base.plugin_common.plugin_interface import PluginStatus
from db.connection import DBConnectionManager from db.connection import DBConnectionManager
@@ -34,6 +38,7 @@ class DouyuDanmuRecorder:
self._buffer_limit = 50 self._buffer_limit = 50
self._buffer_date: Optional[str] = None self._buffer_date: Optional[str] = None
self._lock = threading.Lock() self._lock = threading.Lock()
self._websocket_available = websocket is not None
def _encode(self, msg: str) -> bytes: def _encode(self, msg: str) -> bytes:
content = msg.encode("utf-8") + b"\x00" content = msg.encode("utf-8") + b"\x00"
@@ -137,6 +142,9 @@ class DouyuDanmuRecorder:
logger.info(f"斗鱼弹幕连接关闭({self.room_id}): {code} {msg}") logger.info(f"斗鱼弹幕连接关闭({self.room_id}): {code} {msg}")
def _run(self): def _run(self):
if not self._websocket_available:
logger.error(f"websocket-client 未安装,无法记录弹幕({self.room_id})")
return
try: try:
websocket.enableTrace(False) websocket.enableTrace(False)
ws_urls = [ ws_urls = [
@@ -540,7 +548,10 @@ class DouyuPlugin(MessagePluginInterface):
logger.error(f"斗鱼定时任务异常: {e}") logger.error(f"斗鱼定时任务异常: {e}")
async def _notify_groups_live(self, room_id: str, nickname: str, room_name: str, thumb_url: str): async def _notify_groups_live(self, room_id: str, nickname: str, room_name: str, thumb_url: str):
# self._start_danmu_record(room_id) try:
self._start_danmu_record(room_id)
except Exception as e:
logger.error(f"启动斗鱼弹幕记录失败({room_id}): {e}")
groups = self.redis_manager.groups_for_room(room_id) groups = self.redis_manager.groups_for_room(room_id)
text = f"🚀 斗鱼开播通知 \n🎤 {nickname} 正在直播中!\n 📌 房间标题:{room_name} \n 👉 点击观看https://www.douyu.com/{room_id}" text = f"🚀 斗鱼开播通知 \n🎤 {nickname} 正在直播中!\n 📌 房间标题:{room_name} \n 👉 点击观看https://www.douyu.com/{room_id}"
xml_content = DOUYU_MESSAGE_XML.format(title=room_name, liver=nickname, roomid=room_id, thumburl=thumb_url) xml_content = DOUYU_MESSAGE_XML.format(title=room_name, liver=nickname, roomid=room_id, thumburl=thumb_url)
@@ -558,7 +569,10 @@ class DouyuPlugin(MessagePluginInterface):
continue continue
async def _notify_groups_offline(self, room_id: str, nickname: str, room_name: str, is_loop: bool = False): async def _notify_groups_offline(self, room_id: str, nickname: str, room_name: str, is_loop: bool = False):
# self._stop_danmu_record(room_id) try:
self._stop_danmu_record(room_id)
except Exception as e:
logger.error(f"停止斗鱼弹幕记录失败({room_id}): {e}")
groups = self.redis_manager.groups_for_room(room_id) groups = self.redis_manager.groups_for_room(room_id)
text = f"🔔 斗鱼提醒:{nickname} 下播啦~\n 🏷️ {room_name}" text = f"🔔 斗鱼提醒:{nickname} 下播啦~\n 🏷️ {room_name}"
if is_loop: if is_loop:

View File

@@ -51,3 +51,4 @@ aiofiles~=24.1.0
undetected-chromedriver~=3.5.5 undetected-chromedriver~=3.5.5
urllib3~=2.5.0 urllib3~=2.5.0
websockets~=15.0.1 websockets~=15.0.1
websocket-client~=1.8.0