Spaces:
Sleeping
Sleeping
""" | |
bilibili_api.vote | |
投票相关操作。 | |
需要 vote_id,获取 vote_id: https://nemo2011.github.io/bilibili-api/#/vote_id | |
""" | |
from enum import Enum | |
from typing import Union, Optional | |
from .utils.utils import get_api | |
from .utils.picture import Picture | |
from .utils.credential import Credential | |
from .utils.network import Api | |
API = get_api("vote") | |
class VoteType(Enum): | |
""" | |
投票类型枚举类 | |
+ TEXT: 文字投票 | |
+ IMAGE: 图片投票 | |
""" | |
TEXT = 0 | |
IMAGE = 1 | |
class VoteChoices: | |
""" | |
投票选项类 | |
""" | |
def __init__(self) -> None: | |
self.choices = [] | |
def add_choice( | |
self, desc: str, image: Optional[Union[str, Picture]] = None | |
) -> "VoteChoices": | |
""" | |
往 VoteChoices 添加选项 | |
Args: | |
desc (str): 选项描述 | |
image (str, Picture, optional): 选项的图片链接,用于图片投票。支持 Picture 类. Defaults to None. | |
""" | |
if isinstance(image, Picture): | |
image = image.url | |
self.choices.append({"desc": desc, "img_url": image}) | |
return self | |
def remove_choice(self, index: int) -> "VoteChoices": | |
""" | |
从 VoteChoices 移除选项 | |
Args: | |
index (int): 选项索引 | |
""" | |
self.choices.remove(index) | |
return self | |
def get_choices(self) -> dict: | |
""" | |
获取 VoteChoices 的 choices | |
Returns: | |
dict: choices | |
""" | |
results = {} | |
for i in range(len(self.choices)): | |
choice_key_name = f"info[options][{i}]" | |
results[f"{choice_key_name}[desc]"] = self.choices[i]["desc"] | |
results[f"{choice_key_name}[img_url]"] = self.choices[i]["img_url"] | |
return results | |
class Vote: | |
""" | |
投票类 | |
Attributes: | |
vote_id (int): vote_id, 获取:https://nemo2011.github.io/bilibili-api/#/vote_id | |
credential (Credential): 凭据类 | |
""" | |
def __init__(self, vote_id: int, credential: Credential = Credential()) -> None: | |
""" | |
Args: | |
vote_id (int): vote_id, 获取:https://nemo2011.github.io/bilibili-api/#/vote_id | |
credential (Credential): 凭据类,非必要. | |
""" | |
self.__vote_id = vote_id | |
self.credential = credential | |
self.title: Optional[str] = None | |
def get_vote_id(self) -> int: | |
return self.__vote_id | |
def get_info_sync(self) -> dict: | |
""" | |
获取投票详情 | |
Returns: | |
dict: 调用 API 返回的结果 | |
""" | |
api = API["info"]["vote_info"] | |
params = {"vote_id": self.get_vote_id()} | |
info = Api(**api, params=params).result_sync | |
self.title = info["info"]["title"] # 为 dynmaic.BuildDnamic.add_vote 缓存 title | |
return info | |
async def get_info(self) -> dict: | |
""" | |
获取投票详情 | |
Returns: | |
dict: 调用 API 返回的结果 | |
""" | |
api = API["info"]["vote_info"] | |
params = {"vote_id": self.get_vote_id()} | |
info = await Api(**api).update_params(**params).result | |
self.title = info["info"]["title"] # 为 dynmaic.BuildDnamic.add_vote 缓存 title | |
return info | |
async def get_title(self) -> str: | |
""" | |
快速获取投票标题 | |
Returns: | |
str: 投票标题 | |
""" | |
if self.title is None: | |
return (await self.get_info())["info"]["title"] | |
return self.title | |
async def update_vote( | |
self, | |
title: str, | |
_type: VoteType, | |
choice_cnt: int, | |
duration: int, | |
choices: VoteChoices, | |
desc: Optional[str] = None, | |
) -> dict: | |
""" | |
更新投票内容 | |
Args: | |
vote_id (int): vote_id | |
title (str): 投票标题 | |
_type (VoteType): 投票类型 | |
choice_cnt (int): 最多几项 | |
duration (int): 投票持续秒数 常用: 三天:259200 七天:604800 三十天:2592000 | |
choices (VoteChoices): 投票选项 | |
credential (Credential): Credential 枚举类 | |
desc (Optional[str], optional): 投票描述. Defaults to None. | |
Returns: | |
dict: 调用 API 返回的结果 | |
""" | |
self.credential.raise_for_no_sessdata() | |
api = API["operate"]["update"] | |
data = { | |
"info[title]": title, | |
"info[desc]": desc, | |
"info[type]": _type.value, | |
"info[choice_cnt]": choice_cnt, | |
"info[duration]": duration, | |
"info[vote_id]": self.get_vote_id(), | |
} | |
data.update(choices.get_choices()) | |
if choice_cnt > len(choices.choices): | |
raise ValueError("choice_cnt 大于 choices 选项数") | |
return await Api(**api, credential=self.credential).update_data(**data).result | |
async def create_vote( | |
title: str, | |
_type: VoteType, | |
choice_cnt: int, | |
duration: int, | |
choices: VoteChoices, | |
credential: Credential, | |
desc: Optional[str] = None, | |
) -> Vote: | |
""" | |
创建投票 | |
Args: | |
title (str): 投票标题 | |
_type (VoteType): 投票类型 | |
choice_cnt (int): 最多几项 | |
duration (int): 投票持续秒数 常用: 三天:259200 七天:604800 三十天:2592000 | |
choices (VoteChoices): 投票选项 | |
credential (Credential): Credential | |
desc (Optional[str], optional): 投票描述. Defaults to None. | |
Returns: | |
Vote: Vote 类 | |
""" | |
api = API["operate"]["create"] | |
data = { | |
"info[title]": title, | |
"info[desc]": desc, | |
"info[type]": _type.value, | |
"info[choice_cnt]": choice_cnt, | |
"info[duration]": duration, | |
} | |
data.update(choices.get_choices()) | |
if choice_cnt > len(choices.choices): | |
raise ValueError("choice_cnt 大于 choices 选项数") | |
vote_id = (await Api(**api, credential=credential).update_data(**data).result)[ | |
"vote_id" | |
] | |
return Vote(vote_id=vote_id, credential=credential) | |