|
"""
|
|
bilibili_api.black_room
|
|
|
|
小黑屋
|
|
"""
|
|
|
|
from enum import Enum
|
|
from typing import List, Union, Optional
|
|
|
|
from .utils.utils import get_api
|
|
from .utils.credential import Credential
|
|
from .utils.network import Api
|
|
|
|
|
|
class BlackReasonType(Enum):
|
|
"""
|
|
违规原因类型枚举 (英语翻译错误请忽略/提 issue/发起 PR)
|
|
|
|
- ALL: 全部
|
|
- FLOOD_SCREEN: 刷屏
|
|
- SOFA: 抢沙发
|
|
- PRON_VULGAR: 色情低俗内容
|
|
- GAMBLED_SCAMS: 赌博诈骗内容
|
|
- ILLEGAL: 违禁信息
|
|
- ADS: 垃圾广告信息
|
|
- PERSONAL_ATTACK: 人身攻击
|
|
- INVASION_OF_PRIVACY: 侵犯隐私
|
|
- LEAD_WAR: 引战
|
|
- SPOILER: 剧透
|
|
- ADD_MALICIOUS_TAG: 恶意为他人添加标签
|
|
- DEL_OTHERS_TAG: 恶意删除他人标签
|
|
- PRON: 色情
|
|
- VULGAR: 低俗
|
|
- VIOLENT: 暴力血腥内容
|
|
- MALICIOUS_ARCHIVES: 恶意投稿行为
|
|
- ILLEGAL_STATION: 发布非法网站信息
|
|
- SEND_UNREAL_EVENT: 发布不实信息
|
|
- ABETMENT: 发布教唆怂恿信息
|
|
- MALICIOUS_SPAMMING: 恶意刷屏
|
|
- ILLEGAL_ACCOUNT: 账号违规
|
|
- PLAGIARISM: 抄袭
|
|
- PRETEND_ORIGINAL: 冒充官号
|
|
- BAD_FOR_YOUNGS: 青少年不宜
|
|
- BREAK_INTERNET_SECURITY: 破坏网络安全
|
|
- SEND_UNREAL_MISLEADING_EVENT: 发布不实舞蹈信息
|
|
- VIOLATE_SITE_OPERATING_RULES: 违规网站运营规则
|
|
- MALICIOUS_TOPICS: 恶意创建话题
|
|
- CREATE_ILLEGAL_LUCKY_DRAW: 发布违规抽奖
|
|
- PRETEND_OTHER: 冒充他人
|
|
"""
|
|
|
|
ALL = 0
|
|
FLOOD_SCREEN = 1
|
|
SOFA = 2
|
|
PRON_VULGAR = 3
|
|
GAMBLED_SCAMS = 4
|
|
ILLEGAL = 5
|
|
ADS = 6
|
|
PERSONAL_ATTACK = 7
|
|
INVASION_OF_PRIVACY = 8
|
|
LEAD_WAR = 9
|
|
SPOILER = 10
|
|
ADD_MALICIOUS_TAG = 11
|
|
DEL_OTHERS_TAG = 12
|
|
PRON = 13
|
|
VULGAR = 14
|
|
VIOLENT = 15
|
|
MALICIOUS_ARCHIVES = 16
|
|
ILLEGAL_STATION = 17
|
|
SEND_UNREAL_EVENT = 18
|
|
ABETMENT = 19
|
|
MALICIOUS_SPAMMING = 20
|
|
ILLEGAL_ACCOUNT = 21
|
|
PLAGIARISM = 22
|
|
PRETEND_ORIGINAL = 23
|
|
BAD_FOR_YOUNGS = 24
|
|
BREAK_INTERNET_SECURITY = 25
|
|
SEND_UNREAL_MISLEADING_EVENT = 26
|
|
PRETEND_ORIGINAL_ACCOUNT = 27
|
|
SEND_BAD_EVENT = 28
|
|
VIOLATE_SITE_OPERATING_RULES = 29
|
|
MALICIOUS_TOPICS = 30
|
|
CREATE_ILLEGAL_LUCKY_DRAW = 31
|
|
PRETEND_OTHER = 32
|
|
|
|
|
|
class BlackType(Enum):
|
|
"""
|
|
违规类型枚举
|
|
|
|
- ALL: 全部
|
|
- COMMENT: 评论
|
|
- DANMAKU: 弹幕
|
|
- PRIVATE_MESSAGE: 私信
|
|
- TAG: 标签
|
|
- PERSONAL_INFORMATION: 个人信息
|
|
- VIDEO: 视频
|
|
- ARTICLE: 专栏
|
|
- DYNAMIC: 动态
|
|
- ALBUM: 相簿
|
|
"""
|
|
|
|
ALL = 0
|
|
COMMENT = 1
|
|
DANMAKU = 2
|
|
PRIVATE_MESSAGE = 3
|
|
TAG = 4
|
|
PERSONAL_INFORMATION = 5
|
|
VIDEO = 6
|
|
ARTICLE = 8
|
|
DYNAMIC = 10
|
|
ALBUM = 11
|
|
|
|
|
|
class BlackFrom(Enum):
|
|
"""
|
|
违规来源
|
|
|
|
- SYSTEM: 系统封禁
|
|
- ADMIN: 风纪仲裁
|
|
- ALL: 全部
|
|
"""
|
|
|
|
SYSTEM = 0
|
|
ADMIN = 1
|
|
ALL = None
|
|
|
|
|
|
class JuryVoteOpinion(Enum):
|
|
"""
|
|
仲裁投票类型枚举,选择对应案件类型的观点
|
|
|
|
单条评论(弹幕)
|
|
- SUITABLE: 合适
|
|
- AVERAGE: 一般
|
|
- UNSUITABLE: 不合适
|
|
- UNKNOW: 无法判断
|
|
|
|
评论(弹幕)氛围
|
|
- ENV_GREAT: 评论环境好
|
|
- ENV_AVERAGE: 评论环境一般
|
|
- ENV_BAD: 评论环境差
|
|
- ENV_UNKNOW: 无法判断评论环境
|
|
"""
|
|
|
|
SUITABLE = 1
|
|
AVERAGE = 2
|
|
UNSUITABLE = 3
|
|
UNKNOW = 4
|
|
ENV_GREAT = 11
|
|
ENV_AVERAGE = 12
|
|
ENV_BAD = 13
|
|
ENV_UNKNOW = 14
|
|
|
|
|
|
API = get_api("black-room")
|
|
|
|
|
|
async def get_blocked_list(
|
|
from_: BlackFrom = BlackFrom.ALL,
|
|
type_: BlackType = BlackType.ALL,
|
|
pn: int = 1,
|
|
credential: Union[Credential, None] = None,
|
|
) -> dict:
|
|
"""
|
|
获取小黑屋中的违规列表
|
|
|
|
Args:
|
|
from_ (BlackFrom) : 违规来源. Defaults to BlackFrom.ALL.
|
|
|
|
type_ (int) : 违规类型. Defaults to BlackType.ALL.
|
|
|
|
pn (int) : 页数. Defaults to 1.
|
|
|
|
credential (Credential | None): 凭据. Defaults to None.
|
|
"""
|
|
credential = credential if credential else Credential()
|
|
api = API["black_room"]["info"]
|
|
params = {"pn": pn, "otype": type_.value}
|
|
if from_.value != None:
|
|
params["btype"] = from_.value
|
|
return await Api(**api, credential=credential).update_params(**params).result
|
|
|
|
|
|
class BlackRoom:
|
|
"""
|
|
小黑屋
|
|
|
|
Attributes:
|
|
credential (Credential): 凭据类
|
|
"""
|
|
|
|
def __init__(self, black_room_id: int, credential: Union[Credential, None] = None):
|
|
"""
|
|
Args:
|
|
black_room_id (int) : 小黑屋 id
|
|
|
|
credential (Credential | None, optional): 凭据类. Defaults to None.
|
|
"""
|
|
self.__id = black_room_id
|
|
self.credential = credential if credential else Credential()
|
|
|
|
async def get_details(self) -> dict:
|
|
"""
|
|
获取小黑屋详细信息
|
|
|
|
Returns:
|
|
dict: 调用 API 返回的结果
|
|
"""
|
|
api = API["black_room"]["detail"]
|
|
params = {"id": self.__id}
|
|
return (
|
|
await Api(**api, credential=self.credential).update_params(**params).result
|
|
)
|
|
|
|
async def get_reason(self) -> BlackReasonType:
|
|
"""
|
|
获取小黑屋的封禁原因
|
|
|
|
Returns:
|
|
BlackReasonType: 封禁原因枚举类
|
|
"""
|
|
return BlackReasonType((await self.get_details())["reasonType"])
|
|
|
|
async def get_id(self) -> int:
|
|
return self.__id
|
|
|
|
async def set_id(self, id_) -> None:
|
|
self.__init__(id_, self.credential)
|
|
|
|
|
|
class JuryCase:
|
|
def __init__(self, case_id: str, credential: Credential):
|
|
"""
|
|
Args:
|
|
case_id (str) : 案件 id
|
|
|
|
credential (Credential) : 凭据类
|
|
"""
|
|
self.case_id = case_id
|
|
self.credential = credential
|
|
|
|
async def get_details(self) -> dict:
|
|
"""
|
|
获取案件详细信息
|
|
|
|
Returns:
|
|
dict: 调用 API 返回的结果
|
|
"""
|
|
api = API["jury"]["detail"]
|
|
params = {"case_id": self.case_id}
|
|
return (
|
|
await Api(**api, credential=self.credential).update_params(**params).result
|
|
)
|
|
|
|
async def get_opinions(self, pn: int = 1, ps: int = 20) -> dict:
|
|
"""
|
|
获取案件的观点列表
|
|
|
|
Args:
|
|
pn (int, optional): 页数. Defaults to 1.
|
|
|
|
ps (int, optional): 每页数量. Defaults to 20.
|
|
|
|
Returns:
|
|
dict: 调用 API 返回的结果
|
|
"""
|
|
api = API["jury"]["opinion"]
|
|
params = {"case_id": self.case_id, "pn": pn, "ps": ps}
|
|
return (
|
|
await Api(**api, credential=self.credential).update_params(**params).result
|
|
)
|
|
|
|
async def vote(
|
|
self,
|
|
opinion: JuryVoteOpinion,
|
|
is_insider: bool,
|
|
is_anonymous: bool,
|
|
reason: Optional[str] = None,
|
|
) -> dict:
|
|
"""
|
|
进行仲裁投票
|
|
|
|
Args:
|
|
opinion (JuryVoteOpinion): 投票选项类型
|
|
|
|
is_insider (bool): 是否观看此类视频
|
|
|
|
is_anonymous (bool): 是否匿名投票
|
|
|
|
reason (str, optional): 投票理由. Defaults to None.
|
|
|
|
Returns:
|
|
dict: 调用 API 返回的结果
|
|
"""
|
|
api = API["jury"]["vote"]
|
|
data = {
|
|
"case_id": self.case_id,
|
|
"vote": opinion.value,
|
|
"insiders": 1 if is_insider else 0,
|
|
"anonymous": 1 if is_anonymous else 0,
|
|
"csrf": self.credential.bili_jct,
|
|
}
|
|
if reason:
|
|
data["content"] = reason
|
|
return await Api(**api, credential=self.credential).update_data(**data).result
|
|
|
|
|
|
async def get_next_jury_case(credential: Credential) -> JuryCase:
|
|
"""
|
|
获取下一个待审理的案件
|
|
|
|
Args:
|
|
credential (Credential | None, optional): 凭据类. Defaults to None.
|
|
|
|
Returns:
|
|
JuryCase: 案件类
|
|
"""
|
|
credential.raise_for_no_sessdata()
|
|
api = API["jury"]["next_case"]
|
|
return JuryCase(
|
|
(await Api(**api, credential=credential).result)["case_id"], credential
|
|
)
|
|
|
|
|
|
async def get_jury_case_list(
|
|
credential: Credential, pn: int = 1, ps: int = 20
|
|
) -> List[JuryCase]:
|
|
"""
|
|
获取仲裁案件列表
|
|
|
|
Args:
|
|
credential (Credential): 凭据类
|
|
|
|
pn (int, optional): 页数. Defaults to 1.
|
|
|
|
ps (int, optional): 每页数量. Defaults to 20.
|
|
|
|
Returns:
|
|
List[JuryCase]: 仲裁案件列表
|
|
"""
|
|
api = API["jury"]["case_list"]
|
|
params = {"pn": pn, "ps": ps}
|
|
info = await Api(**api, credential=credential).update_params(**params).result
|
|
return [JuryCase(case["case_id"], credential) for case in info["list"]]
|
|
|