Spaces:
Sleeping
Sleeping
""" | |
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"]] | |