fix: Fixed the issue where the obtained live data was incorrect due to bilibili new anti-spam policy

This commit is contained in:
LWR
2023-09-14 22:30:59 +08:00
parent 0c09b35468
commit fca06770a6
3 changed files with 45 additions and 14 deletions

View File

@@ -18,6 +18,15 @@
}, },
"comment": "获取聊天弹幕服务器配置信息(websocket)" "comment": "获取聊天弹幕服务器配置信息(websocket)"
}, },
"chat_conf_new": {
"url": "https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo",
"method": "GET",
"verify": false,
"params": {
"id": "int: 真实房间号"
},
"comment": "获取新版聊天弹幕服务器配置信息(websocket)"
},
"room_info": { "room_info": {
"url": "https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom", "url": "https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom",
"method": "GET", "method": "GET",

View File

@@ -6,6 +6,7 @@
import asyncio import asyncio
import base64 import base64
import json import json
import random
import struct import struct
import time import time
from enum import Enum from enum import Enum
@@ -146,6 +147,16 @@ class LiveRoom:
} }
return await request(api['method'], api["url"], params, credential=self.credential) return await request(api['method'], api["url"], params, credential=self.credential)
async def get_chat_conf_new(self):
"""
获取新版聊天弹幕服务器配置信息(websocket)
"""
api = API["info"]["chat_conf_new"]
params = {
"id": self.room_display_id
}
return await request(api['method'], api["url"], params, credential=self.credential)
async def get_room_info(self): async def get_room_info(self):
""" """
获取直播间信息(标题,简介等) 获取直播间信息(标题,简介等)
@@ -672,20 +683,19 @@ class LiveDanmaku(AsyncEvent):
# 获取真实房间号和开播时间 # 获取真实房间号和开播时间
logger.debug(f"正在获取直播间 {self.room_display_id} 的真实房间号") logger.debug(f"正在获取直播间 {self.room_display_id} 的真实房间号")
info = await room.get_room_play_info() info = await room.get_room_play_info()
self.__uid = info["uid"]
self.__room_real_id = info["room_id"] self.__room_real_id = info["room_id"]
self.live_time = info["live_time"] self.live_time = info["live_time"]
logger.debug(f"获取成功, 真实房间号: {self.__room_real_id}") logger.debug(f"获取成功, 真实房间号: {self.__room_real_id}")
# 获取直播服务器配置 # 获取直播服务器配置
logger.debug(f"正在获取直播间 {self.room_display_id} 的聊天服务器配置") logger.debug(f"正在获取直播间 {self.room_display_id} 的聊天服务器配置")
conf = await room.get_chat_conf() conf = await room.get_chat_conf_new()
logger.debug(f"直播间 {self.room_display_id} 的聊天服务器配置获取成功") logger.debug(f"直播间 {self.room_display_id} 的聊天服务器配置获取成功")
# 连接直播间 # 连接直播间
logger.debug(f"开始连接直播间 {self.room_display_id}") logger.debug(f"开始连接直播间 {self.room_display_id}")
session = get_session() session = get_session()
available_hosts: List[dict] = conf["host_server_list"] available_hosts: List[dict] = conf["host_list"]
host = None host = None
@self.on('TIMEOUT') @self.on('TIMEOUT')
@@ -714,7 +724,15 @@ class LiveDanmaku(AsyncEvent):
logger.debug(f"正在尝试连接直播间 {self.room_display_id} 的主机: {uri}") logger.debug(f"正在尝试连接直播间 {self.room_display_id} 的主机: {uri}")
try: try:
async with session.ws_connect(uri, headers={"User-Agent": "Mozilla/5.0"}) as ws: # 如果用户提供代理则设置代理
proxy = None
config_proxy = config.get("PROXY")
if isinstance(config_proxy, str):
proxy = config_proxy
elif isinstance(config_proxy, list):
proxy = random.choice(config_proxy)
async with session.ws_connect(uri, headers={"User-Agent": "Mozilla/5.0"}, proxy=proxy) as ws:
@self.on('VERIFICATION_SUCCESSFUL') @self.on('VERIFICATION_SUCCESSFUL')
async def on_verification_successful(data): async def on_verification_successful(data):
""" """

View File

@@ -5,12 +5,14 @@
import asyncio import asyncio
import atexit import atexit
import json import json
import random
import re import re
from typing import Any, Union, Dict from typing import Any, Union, Dict
import aiohttp import aiohttp
from aiohttp import TCPConnector, ServerDisconnectedError from aiohttp import TCPConnector, ServerDisconnectedError
from . import config
from .Credential import Credential from .Credential import Credential
from ..exception import ResponseCodeException, ResponseException, NetworkException from ..exception import ResponseCodeException, ResponseException, NetworkException
@@ -89,7 +91,7 @@ async def request(method: str,
if params.get("jsonp", "") == "jsonp": if params.get("jsonp", "") == "jsonp":
params["callback"] = "callback" params["callback"] = "callback"
config = { args = {
"method": method, "method": method,
"url": url, "url": url,
"params": params, "params": params,
@@ -98,22 +100,24 @@ async def request(method: str,
"cookies": credential.get_cookies() "cookies": credential.get_cookies()
} }
config.update(kwargs) args.update(kwargs)
if json_body: if json_body:
config["headers"]["Content-Type"] = "application/json" args["headers"]["Content-Type"] = "application/json"
config["data"] = json.dumps(config["data"]) args["data"] = json.dumps(args["data"])
# 如果用户提供代理则设置代理
proxy = config.get("PROXY")
if proxy:
config["proxy"] = proxy
session = get_session() session = get_session()
for i in range(3): for i in range(3):
# 如果用户提供代理则设置代理
proxy = config.get("PROXY")
if isinstance(proxy, str):
args["proxy"] = proxy
elif isinstance(proxy, list):
args["proxy"] = random.choice(proxy)
try: try:
async with session.request(**config) as resp: async with session.request(**args) as resp:
# 检查状态码 # 检查状态码
try: try: