From 6d4e83b257c45bb5de92523a48017f998a0a22ef Mon Sep 17 00:00:00 2001 From: z0z0r4 Date: Tue, 25 Jul 2023 13:26:16 +0800 Subject: [PATCH 1/7] rechore: request2Api --- .github/CODING.md | 2 +- bilibili_api/album.py | 15 +-- bilibili_api/app.py | 6 +- bilibili_api/article.py | 17 ++-- bilibili_api/article_category.py | 4 +- bilibili_api/audio.py | 20 ++-- bilibili_api/bangumi.py | 26 ++--- bilibili_api/black_room.py | 22 ++-- bilibili_api/channel.py | 20 ++-- bilibili_api/channel_series.py | 12 +-- bilibili_api/cheese.py | 54 ++++------ bilibili_api/client.py | 6 +- bilibili_api/comment.py | 24 ++--- bilibili_api/creative_center.py | 26 ++--- bilibili_api/credential.py | 6 +- bilibili_api/dynamic.py | 58 ++++------- bilibili_api/emoji.py | 4 +- bilibili_api/favorite_list.py | 40 ++++---- bilibili_api/game.py | 22 ++-- bilibili_api/homepage.py | 10 +- bilibili_api/hot.py | 12 +-- bilibili_api/interactive_video.py | 28 ++---- bilibili_api/live.py | 150 ++++++++-------------------- bilibili_api/live_area.py | 4 +- bilibili_api/manga.py | 65 +++++------- bilibili_api/music.py | 10 +- bilibili_api/note.py | 16 ++- bilibili_api/rank.py | 36 +++---- bilibili_api/search.py | 14 +-- bilibili_api/session.py | 22 ++-- bilibili_api/topic.py | 18 ++-- bilibili_api/user.py | 2 +- bilibili_api/utils/network_httpx.py | 33 ++++-- bilibili_api/video.py | 2 +- bilibili_api/video_tag.py | 18 ++-- bilibili_api/video_uploader.py | 51 ++++------ bilibili_api/video_zone.py | 12 +-- bilibili_api/vote.py | 8 +- 38 files changed, 374 insertions(+), 521 deletions(-) diff --git a/.github/CODING.md b/.github/CODING.md index bd9d4c11..46753d90 100644 --- a/.github/CODING.md +++ b/.github/CODING.md @@ -40,7 +40,7 @@ async def ...(...) -> dict: params = { ... } - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result ``` 首先如果函数要传入凭据类,那么你要添加 `credential = credential if credential else Credential()` 以确保 `credential` 参数不会是 `None` 类型,~~当然不这么做也不会报错,但是你好歹要走个形式啊!~~。接着我们声明 `api` 变量,它是字典 `API` 的一部分,这里的字典 `API` 就是你写入 API 的那个 `json` 文件的内容。所以你的 API 也在里面,你只需要补充好字典的键值就可以了。接着就是可选的 `params` 或 `data`,如果你的 API 需要传入参数的话不要忘记创建它们。最后你只需要返回已经封装好了的函数 `request` 得到的结果就可以了。`request` 函数的第一个参数是访问 `API` 的方法,一般是 `GET`/`POST`/`PUT`/`DELETE`/`PATCH`,第二个参数是 `API` 的链接,你只需要填入 `api["url"]` 就可以了 ( 前提是你的键值没有输错 ),下面的参数最好要指定名称传参,最后不要忘记了:如果这个接口需要登录,那么你得要把凭据类传入进去!( 如果你的函数是在一个类里面,通常每一个类都有一个属性 `credential`,就是创建这个类的时候会传入的,这个时候你只需要传入 `self.credential` 就可以了。当然参数里面不用再写 `credential` 参数了!! )

diff --git a/bilibili_api/album.py b/bilibili_api/album.py index 865f34b6..39459581 100644 --- a/bilibili_api/album.py +++ b/bilibili_api/album.py @@ -11,7 +11,7 @@ from .utils.picture import Picture from .exceptions import ArgsException from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("album") @@ -73,7 +73,8 @@ async def get_info(self) -> dict: """ api = API["info"]["detail"] params = {"doc_id": self.get_doc_id()} - resp = await request("GET", api["url"], params=params) + resp = await Api(**api).update_params(**params).result + resp = await Api(**api).update_params(**params).result self.__info = resp return resp @@ -142,14 +143,14 @@ async def get_painter() -> dict: if order != AlbumOrder.RECOMMEND: raise ArgsException("摄影相簿暂不支持以热度/以时间排序。") params = {"type": order.value, "page_num": page_num, "page_size": page_size} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_photos() -> dict: api = API["info"]["homepage_photos_albums_list"] if order != AlbumOrder.RECOMMEND: raise ArgsException("摄影相簿暂不支持以热度/以时间排序。") params = {"type": order.value, "page_num": page_num, "page_size": page_size} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result if category == AlbumCategory.PAINTS: return await get_painter() @@ -184,12 +185,12 @@ async def get_homepage_recommend_uppers( async def get_painters() -> dict: api = API["info"]["homepage_recommended_painters"] params = {"num": numbers} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_photos_uppers() -> dict: api = API["info"]["homepage_recommended_photos_uppers"] params = {"num": numbers} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result if category == AlbumCategory.PAINTS: return await get_painters() @@ -235,4 +236,4 @@ async def get_user_albums( "page_num": page_num, "page_size": page_size, } - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result diff --git a/bilibili_api/app.py b/bilibili_api/app.py index ff585f30..3eae8e86 100644 --- a/bilibili_api/app.py +++ b/bilibili_api/app.py @@ -10,7 +10,7 @@ from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("app") @@ -56,7 +56,7 @@ async def get_loading_images( "width": width, "birth": birth, } - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_loading_images_special( @@ -120,4 +120,4 @@ async def get_loading_images_special( "ts": ts, "sign": sign, } - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result diff --git a/bilibili_api/article.py b/bilibili_api/article.py index 933482f0..d0a0acb0 100644 --- a/bilibili_api/article.py +++ b/bilibili_api/article.py @@ -21,7 +21,7 @@ from .note import Note, NoteType from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request, get_session +from .utils.network_httpx import Api, get_session from .exceptions.NetworkException import ApiException, NetworkException API = get_api("article") @@ -107,7 +107,7 @@ async def get_article_rank( """ api = API["info"]["rank"] params = {"cid": rank_type.value} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result class ArticleList: @@ -142,7 +142,7 @@ async def get_content(self) -> dict: api = API["info"]["list"] params = {"id": self.__rlid} - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result class Article: @@ -601,10 +601,7 @@ async def get_info(self) -> dict: api = API["info"]["view"] params = {"id": self.__cvid} - resp = await request( - "GET", api["url"], params=params, credential=self.credential - ) - return resp + return await Api(**api, credential=self.credential).update_params(**params).result async def get_all(self) -> dict: """ @@ -647,7 +644,7 @@ async def set_like(self, status: bool = True) -> dict: api = API["operate"]["like"] data = {"id": self.__cvid, "type": 1 if status else 2} - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def set_favorite(self, status: bool = True) -> dict: """ @@ -666,7 +663,7 @@ async def set_favorite(self, status: bool = True) -> dict: ) data = {"id": self.__cvid} - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def add_coins(self) -> dict: """ @@ -680,7 +677,7 @@ async def add_coins(self) -> dict: upid = (await self.get_info())["mid"] api = API["operate"]["coin"] data = {"aid": self.__cvid, "multiply": 1, "upid": upid, "avtype": 2} - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result # TODO: 专栏上传/编辑/删除 diff --git a/bilibili_api/article_category.py b/bilibili_api/article_category.py index 9874e0e6..09888bdd 100644 --- a/bilibili_api/article_category.py +++ b/bilibili_api/article_category.py @@ -10,7 +10,7 @@ from typing import List, Tuple, Optional from .utils.utils import get_api -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("article-category") @@ -148,4 +148,4 @@ async def get_category_recommend_articles( """ api = API["info"]["recommends"] params = {"cid": category_id, "sort": order.value, "pn": page_num, "ps": page_size} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result diff --git a/bilibili_api/audio.py b/bilibili_api/audio.py index 3417f4f4..4189c384 100644 --- a/bilibili_api/audio.py +++ b/bilibili_api/audio.py @@ -9,7 +9,7 @@ from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("audio") @@ -45,7 +45,7 @@ async def get_info(self) -> dict: api = API["audio_info"]["info"] params = {"sid": self.__auid} - return await request("GET", api["url"], params, credential=self.credential) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_tags(self) -> dict: """ @@ -56,7 +56,7 @@ async def get_tags(self) -> dict: """ api = API["audio_info"]["tag"] params = {"sid": self.__auid} - return await request("GET", api["url"], params, credential=self.credential) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_download_url(self) -> dict: """ @@ -67,7 +67,7 @@ async def get_download_url(self) -> dict: """ api = API["audio_info"]["download_url"] params = {"sid": self.__auid, "privilege": 2, "quality": 2} - return await request("GET", api["url"], params, credential=self.credential) + return await Api(**api, credential=self.credential).update_params(**params).result async def add_coins(self, num: int = 2) -> dict: """ @@ -84,7 +84,7 @@ async def add_coins(self, num: int = 2) -> dict: api = API["audio_operate"]["coin"] data = {"sid": self.__auid, "multiply": num} - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result # TODO: 音频编辑 @@ -120,7 +120,7 @@ async def get_info(self) -> dict: api = API["list_info"]["info"] params = {"sid": self.__amid} - return await request("GET", api["url"], params, credential=self.credential) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_tags(self) -> dict: """ @@ -132,7 +132,7 @@ async def get_tags(self) -> dict: api = API["list_info"]["tag"] params = {"sid": self.__amid} - return await request("GET", api["url"], params, credential=self.credential) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_song_list(self, pn: int = 1) -> dict: """ @@ -147,7 +147,7 @@ async def get_song_list(self, pn: int = 1) -> dict: api = API["list_info"]["song_list"] params = {"sid": self.__amid, "pn": pn, "ps": 100} - return await request("GET", api["url"], params, credential=self.credential) + return await Api(**api, credential=self.credential).update_params(**params).result # TODO: 歌单编辑 @@ -167,7 +167,7 @@ async def get_user_stat(uid: int, credential: Union[Credential, None] = None) -> credential = credential if credential is not None else Credential() api = API["audio_info"]["user"] params = {"uid": uid} - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_hot_song_list( @@ -187,4 +187,4 @@ async def get_hot_song_list( credential = credential if credential is not None else Credential() api = API["list_info"]["hot"] params = {"pn": pn, "ps": 100} - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result diff --git a/bilibili_api/bangumi.py b/bilibili_api/bangumi.py index 672f11aa..51bdde75 100644 --- a/bilibili_api/bangumi.py +++ b/bilibili_api/bangumi.py @@ -23,7 +23,7 @@ from .utils.utils import get_api from .utils.credential import Credential from .exceptions.ApiException import ApiException -from .utils.network_httpx import request, get_session +from .utils.network_httpx import request, Api, get_session from .exceptions.ResponseException import ResponseException from .utils.initial_state import get_initial_state, get_initial_state_sync @@ -70,7 +70,7 @@ async def get_timeline(type_: BangumiType, before: int = 7, after: int = 0) -> d """ api = API["info"]["timeline"] params = {"types": type_.value, "before": before, "after": after} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result class IndexFilter: @@ -964,7 +964,7 @@ async def get_index_info( # params["type"] 未知参数,为 1 params["type"] = 1 - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result class Bangumi: @@ -1091,7 +1091,7 @@ async def get_meta(self) -> dict: api = API["info"]["meta"] params = {"media_id": self.__media_id} - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_short_comment_list( self, @@ -1116,7 +1116,7 @@ async def get_short_comment_list( if next is not None: params["cursor"] = next - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_long_comment_list( self, @@ -1141,7 +1141,7 @@ async def get_long_comment_list( if next is not None: params["cursor"] = next - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_episode_list(self) -> dict: """ @@ -1165,7 +1165,7 @@ async def get_episode_list(self) -> dict: ) api = API["info"]["episodes_list"] params = {"season_id": self.__ssid} - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_episodes(self) -> List["Episode"]: """ @@ -1203,7 +1203,7 @@ async def get_stat(self) -> dict: api = API["info"]["season_status"] params = {"season_id": self.__ssid} - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_overview(self) -> dict: """ @@ -1218,7 +1218,7 @@ async def get_overview(self) -> dict: else: api = API["info"]["collective_info"] params = {"season_id": self.__ssid} - return await request("GET", api["url"], params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def set_follow( @@ -1242,7 +1242,7 @@ async def set_follow( api = API["operate"]["follow_add"] if status else API["operate"]["follow_del"] data = {"season_id": bangumi.get_season_id()} - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def update_follow_status( @@ -1265,7 +1265,7 @@ async def update_follow_status( api = API["operate"]["follow_status"] data = {"season_id": bangumi.get_season_id(), "status": status} - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result class Episode(Video): @@ -1373,7 +1373,7 @@ async def get_download_url(self) -> dict: Returns: dict: 调用 API 返回的结果。 """ - url = API["info"]["playurl"]["url"] + api = API["info"]["playurl"] if True: params = { "avid": self.get_aid(), @@ -1383,7 +1383,7 @@ async def get_download_url(self) -> dict: "fnval": 4048, "fourk": 1, } - return await request("GET", url, params=params, credential=self.credential) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_danmaku_xml(self) -> str: """ diff --git a/bilibili_api/black_room.py b/bilibili_api/black_room.py index 987b4c4a..5c613868 100644 --- a/bilibili_api/black_room.py +++ b/bilibili_api/black_room.py @@ -9,7 +9,7 @@ from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api class BlackReasonType(Enum): @@ -179,7 +179,7 @@ async def get_blocked_list( params = {"pn": pn, "otype": type_.value} if from_.value != None: params["btype"] = from_.value - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result class BlackRoom: @@ -209,9 +209,7 @@ async def get_details(self) -> dict: """ api = API["black_room"]["detail"] params = {"id": self.__id} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_reason(self) -> BlackReasonType: """ @@ -249,9 +247,7 @@ async def get_details(self) -> dict: """ api = API["jury"]["detail"] params = {"case_id": self.case_id} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_opinions(self, pn: int = 1, ps: int = 20) -> dict: """ @@ -267,9 +263,7 @@ async def get_opinions(self, pn: int = 1, ps: int = 20) -> dict: """ api = API["jury"]["opinion"] params = {"case_id": self.case_id, "pn": pn, "ps": ps} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def vote( self, @@ -303,7 +297,7 @@ async def vote( } if reason: data["content"] = reason - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def get_next_jury_case(credential: Credential) -> JuryCase: @@ -319,7 +313,7 @@ async def get_next_jury_case(credential: Credential) -> JuryCase: credential.raise_for_no_sessdata() api = API["jury"]["next_case"] return JuryCase( - (await request("GET", api["url"], credential=credential))["case_id"], credential + (await Api(**api, credential=credential).result)["case_id"], credential ) @@ -341,5 +335,5 @@ async def get_jury_case_list( """ api = API["jury"]["case_list"] params = {"pn": pn, "ps": ps} - info = await request("GET", api["url"], params=params, credential=credential) + info = await Api(**api, credential=credential).update_params(**params).result return [JuryCase(case["case_id"], credential) for case in info["list"]] diff --git a/bilibili_api/channel.py b/bilibili_api/channel.py index 5379889b..8754b90f 100644 --- a/bilibili_api/channel.py +++ b/bilibili_api/channel.py @@ -12,7 +12,7 @@ from bilibili_api.utils.credential import Credential from bilibili_api.utils.initial_state import get_initial_state from bilibili_api.errors import ApiException, ResponseException -from bilibili_api.utils.network_httpx import request, get_session +from bilibili_api.utils.network_httpx import request, Api API = get_api("channel") @@ -25,7 +25,7 @@ async def get_channel_categories() -> dict: dict: 调用 API 返回的结果 """ api = API["categories"]["list"] - return await request("GET", api["url"]) + return await Api(**api).result async def get_channel_category_detail( @@ -42,7 +42,7 @@ async def get_channel_category_detail( credential = credential if credential else Credential() api = API["categories"]["sub_channels"] params = {"id": category_id, "offset": offset} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result class ChannelVideosOrder(Enum): @@ -161,7 +161,7 @@ async def get_featured_list( if offset is not None: params["offset"] = offset params["page_size"] = page_size - info = await request("GET", api["url"], params=params) + info = await Api(**api).update_params(**params).result # 如果频道与番剧有关,会有番剧信息,需要排除掉 card_type=season 的数据 info["list"] = self.only_achieve(info["list"]) @@ -199,7 +199,7 @@ async def get_raw_list( params["offset"] = offset params["page_size"] = page_size - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_list( self, @@ -279,7 +279,7 @@ async def get_self_subscribe_channels(credential: Credential) -> dict: dict: 调用 API 返回的结果 """ api = API["self_subscribes"]["list"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def subscribe_channel(channel: Channel, credential: Credential) -> dict: @@ -295,8 +295,8 @@ async def subscribe_channel(channel: Channel, credential: Credential) -> dict: dict: 调用 API 返回的结果 """ api = API["channel"]["subscribe"] - params = {"id": channel.get_channel_id()} - return await request("POST", api["url"], data=params, credential=credential) + data = {"id": channel.get_channel_id()} + return await Api(**api, credential=credential).update_data(data).result async def unsubscribe_channel(channel: Channel, credential: Credential) -> dict: @@ -312,5 +312,5 @@ async def unsubscribe_channel(channel: Channel, credential: Credential) -> dict: dict: 调用 API 返回的结果 """ api = API["channel"]["unsubscribe"] - params = {"id": channel.get_channel_id()} - return await request("POST", api["url"], data=params, credential=credential) + data = {"id": channel.get_channel_id()} + return await Api(**api, credential=credential).update_data(data).result diff --git a/bilibili_api/channel_series.py b/bilibili_api/channel_series.py index f31f03b3..497d734f 100644 --- a/bilibili_api/channel_series.py +++ b/bilibili_api/channel_series.py @@ -11,7 +11,7 @@ from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API_USER = get_api("user") API = get_api("channel-series") @@ -168,7 +168,7 @@ async def create_channel_series( "keywords": ",".join(keywords), "description": description, } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def del_channel_series(series_id: int, credential: Credential) -> dict: @@ -205,7 +205,7 @@ async def del_channel_series(series_id: int, credential: Credential) -> dict: "series_id": series_id, "aids": ",".join(map(lambda x: str(x), aids)), } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def add_aids_to_series( @@ -235,7 +235,7 @@ async def add_aids_to_series( "series_id": series_id, "aids": ",".join(map(lambda x: str(x), aids)), } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def del_aids_from_series( @@ -265,7 +265,7 @@ async def del_aids_from_series( "series_id": series_id, "aids": ",".join(map(lambda x: str(x), aids)), } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def set_follow_channel_season( @@ -281,4 +281,4 @@ async def set_follow_channel_season( """ api = API["operate"]["fav"] if status else API["operate"]["unfav"] data = {"season_id": season_id} - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result diff --git a/bilibili_api/cheese.py b/bilibili_api/cheese.py index 38107c9a..ca41223b 100644 --- a/bilibili_api/cheese.py +++ b/bilibili_api/cheese.py @@ -24,7 +24,7 @@ from .utils.credential import Credential from .utils.BytesReader import BytesReader from .exceptions.ArgsException import ArgsException -from .utils.network_httpx import request, get_session +from .utils.network_httpx import Api, get_session from .exceptions import NetworkException, ResponseException, DanmakuClosedException API = get_api("cheese") @@ -92,9 +92,7 @@ async def get_meta(self) -> dict: """ api = API["info"]["meta"] params = {"season_id": self.__season_id, "ep_id": self.__ep_id} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_list_raw(self): """ @@ -105,9 +103,7 @@ async def get_list_raw(self): """ api = API["info"]["list"] params = {"season_id": self.__season_id, "pn": 1, "ps": 1000} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_list(self) -> List["CheeseVideo"]: """ @@ -119,9 +115,7 @@ async def get_list(self) -> List["CheeseVideo"]: global cheese_video_meta_cache api = API["info"]["list"] params = {"season_id": self.__season_id, "pn": 1, "ps": 1000} - lists = await request( - "GET", api["url"], params=params, credential=self.credential - ) + lists = await Api(**api, credential=self.credential).update_params(**params).result cheese_videos = [] for c in lists["items"]: c["ssid"] = self.get_season_id() @@ -220,9 +214,7 @@ async def get_download_url(self) -> dict: "fnval": 4048, "fourk": 1, } - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_stat(self) -> dict: """ @@ -231,9 +223,9 @@ async def get_stat(self) -> dict: Returns: dict: 调用 API 返回的结果。 """ - url = API_video["info"]["stat"]["url"] + api = API_video["info"]["stat"] params = {"aid": self.get_aid()} - return await request("GET", url, params=params, credential=self.credential) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_pages(self) -> dict: """ @@ -242,9 +234,9 @@ async def get_pages(self) -> dict: Returns: dict: 调用 API 返回的结果。 """ - url = API_video["info"]["pages"]["url"] + api = API_video["info"]["pages"] params = {"aid": self.get_aid()} - return await request("GET", url, params=params, credential=self.credential) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_danmaku_view(self) -> dict: """ @@ -634,9 +626,7 @@ async def send_danmaku(self, danmaku: Union[Danmaku, None] = None): "mode": danmaku.mode, "plat": 1, } - return await request( - "POST", url=api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(data).result async def has_liked(self): """ @@ -647,9 +637,9 @@ async def has_liked(self): """ self.credential.raise_for_no_sessdata() - url = get_api("video")["info"]["has_liked"]["url"] + api =get_api("video")["info"]["has_liked"] params = {"aid": self.get_aid()} - return await request("GET", url, params=params, credential=self.credential) == 1 + return await Api(**api, credential=self.credential).update_params(**params).result == 1 async def get_pay_coins(self): """ @@ -660,9 +650,9 @@ async def get_pay_coins(self): """ self.credential.raise_for_no_sessdata() - url = get_api("video")["info"]["get_pay_coins"]["url"] + api =get_api("video")["info"]["get_pay_coins"] params = {"aid": self.get_aid()} - return (await request("GET", url, params=params, credential=self.credential))[ + return (await Api(**api, credential=self.credential).update_params(**params).result)[ "multiply" ] @@ -675,9 +665,9 @@ async def has_favoured(self): """ self.credential.raise_for_no_sessdata() - url = get_api("video")["info"]["has_favoured"]["url"] + api =get_api("video")["info"]["has_favoured"] params = {"aid": self.get_aid()} - return (await request("GET", url, params=params, credential=self.credential))[ + return (await Api(**api, credential=self.credential).update_params(**params).result)[ "favoured" ] @@ -696,9 +686,7 @@ async def like(self, status: bool = True): api = get_api("video")["operate"]["like"] data = {"aid": self.get_aid(), "like": 1 if status else 2} - return await request( - "POST", url=api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(data).result async def pay_coin(self, num: int = 1, like: bool = False): """ @@ -724,9 +712,7 @@ async def pay_coin(self, num: int = 1, like: bool = False): "multiply": num, "like": 1 if like else 0, } - return await request( - "POST", url=api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(data).result async def set_favorite( self, add_media_ids: List[int] = [], del_media_ids: List[int] = [] @@ -755,9 +741,7 @@ async def set_favorite( "add_media_ids": ",".join(map(lambda x: str(x), add_media_ids)), "del_media_ids": ",".join(map(lambda x: str(x), del_media_ids)), } - return await request( - "POST", url=api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(data).result async def get_danmaku_xml(self): """ diff --git a/bilibili_api/client.py b/bilibili_api/client.py index ed385b73..ed8a8384 100644 --- a/bilibili_api/client.py +++ b/bilibili_api/client.py @@ -5,7 +5,7 @@ """ from .utils.utils import get_api -from .utils.network_httpx import request +from .utils.network_httpx import request, Api API = get_api("client") @@ -18,7 +18,7 @@ async def get_zone() -> dict: dict: 调用 API 返回的结果 """ api = API["zone"] - return await request("GET", api["url"]) + return await Api(**api).result async def get_client_info() -> dict: @@ -29,4 +29,4 @@ async def get_client_info() -> dict: dict: 调用 API 返回的结果 """ api = API["info"] - return await request("GET", api["url"]) + return await Api(**api).result diff --git a/bilibili_api/comment.py b/bilibili_api/comment.py index 0503d02c..86a4e2a4 100644 --- a/bilibili_api/comment.py +++ b/bilibili_api/comment.py @@ -17,7 +17,7 @@ from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api from .exceptions.ArgsException import ArgsException API = get_api("common") @@ -132,9 +132,7 @@ async def like(self, status: bool = True) -> dict: self.credential.raise_for_no_bili_jct() api = API["comment"]["like"] - return await request( - "POST", api["url"], data=self.__get_data(status), credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**self.__get_data(status)).result async def hate(self, status: bool = True) -> dict: """ @@ -151,9 +149,7 @@ async def hate(self, status: bool = True) -> dict: self.credential.raise_for_no_bili_jct() api = API["comment"]["hate"] - return await request( - "POST", api["url"], data=self.__get_data(status), credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**self.__get_data(status)).result async def pin(self, status: bool = True) -> dict: """ @@ -169,9 +165,7 @@ async def pin(self, status: bool = True) -> dict: self.credential.raise_for_no_bili_jct() api = API["comment"]["pin"] - return await request( - "POST", api["url"], data=self.__get_data(status), credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**self.__get_data(status)).result async def delete(self) -> dict: """ @@ -186,7 +180,7 @@ async def delete(self) -> dict: api = API["comment"]["del"] data = self.__get_data(True) del data["action"] - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def get_sub_comments(self, page_index: int = 1) -> dict: """ @@ -210,9 +204,7 @@ async def get_sub_comments(self, page_index: int = 1) -> dict: "root": self.__rpid, } - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def send_comment( @@ -279,7 +271,7 @@ async def send_comment( raise ArgsException("root=None 时,parent 不得设置") api = API["comment"]["send"] - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def get_comments( @@ -311,4 +303,4 @@ async def get_comments( api = API["comment"]["get"] params = {"pn": page_index, "type": type_.value, "oid": oid, "sort": order.value} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result diff --git a/bilibili_api/creative_center.py b/bilibili_api/creative_center.py index 3d3e3157..2fb7b833 100644 --- a/bilibili_api/creative_center.py +++ b/bilibili_api/creative_center.py @@ -11,7 +11,7 @@ from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("creative_center") @@ -139,7 +139,7 @@ async def get_compare(credential: Credential) -> dict: dict: 视频对比数据。 """ api = API["overview"]["compare"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_graph( @@ -166,7 +166,7 @@ async def get_graph( "s_locale": "zh_CN", "type": graph_type.value, } - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_overview( @@ -186,7 +186,7 @@ async def get_overview( api = API["overview"]["num"] # 不知道 tab 的作用是什么,但是不传会报错 params = {"period": period.value, "s_locale": "zh_CN", "tab": 0} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_video_survey(credential: Credential) -> dict: @@ -201,7 +201,7 @@ async def get_video_survey(credential: Credential) -> dict: """ api = API["video"]["survey"] params = {"type": 1} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_video_playanalysis( @@ -220,7 +220,7 @@ async def get_video_playanalysis( """ api = API["video"]["playanalysis"] params = {"copyright": copyright.value} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_video_source(credential: Credential) -> dict: @@ -235,7 +235,7 @@ async def get_video_source(credential: Credential) -> dict: """ api = API["video"]["source"] params = {"s_locale": "zh_CN"} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_fan_overview( @@ -254,7 +254,7 @@ async def get_fan_overview( """ api = API["fan"]["overview"] params = {"period": period.value} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_fan_graph( @@ -277,7 +277,7 @@ async def get_fan_graph( """ api = API["fan"]["graph"] params = {"period": period.value, "type": graph_type.value} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_article_overview(credential: Credential) -> dict: @@ -291,7 +291,7 @@ async def get_article_overview(credential: Credential) -> dict: dict: 文章概览数据。 """ api = API["article"]["overview"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_article_graph( @@ -311,7 +311,7 @@ async def get_article_graph( api = API["article"]["graph"] params = {"type": graph_type.value} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_article_rank( @@ -331,7 +331,7 @@ async def get_article_rank( api = API["article"]["rank"] params = {"type": rank_type.value} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_article_source(credential: Credential) -> dict: @@ -346,4 +346,4 @@ async def get_article_source(credential: Credential) -> dict: """ api = API["article"]["source"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result diff --git a/bilibili_api/credential.py b/bilibili_api/credential.py index f7970f27..5dec7847 100644 --- a/bilibili_api/credential.py +++ b/bilibili_api/credential.py @@ -15,7 +15,7 @@ from Cryptodome.Cipher import PKCS1_OAEP from .utils.credential import Credential as _Credential -from .utils.network_httpx import Api, get_api, request, get_session +from .utils.network_httpx import Api, get_api, get_session key = RSA.importKey( """\ @@ -87,7 +87,7 @@ async def check_cookies(credential: Credential) -> bool: bool: 是否需要刷新 Cookies """ api = API["info"]["check_cookies"] - return (await request("GET", api["url"], credential=credential))["refresh"] + return (await Api(**api, credential=credential).result)["refresh"] def getCorrespondPath() -> str: @@ -178,4 +178,4 @@ async def confirm_refresh( "csrf": new_credential.bili_jct, "refresh_token": old_credential.ac_time_value, } - await request("POST", api["url"], data=data, credential=new_credential) + await Api(**api, credential=new_credential).update_data(**data).result diff --git a/bilibili_api/dynamic.py b/bilibili_api/dynamic.py index 71d1f46b..ab443f4e 100644 --- a/bilibili_api/dynamic.py +++ b/bilibili_api/dynamic.py @@ -20,7 +20,7 @@ from .utils.picture import Picture from . import user, vote, exceptions from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api from .exceptions.DynamicExceedImagesException import DynamicExceedImagesException API = utils.get_api("dynamic") @@ -200,14 +200,8 @@ async def upload_image(image: Picture, credential: Credential, data: dict = None if data is None: data = {"biz": "new_dyn", "category": "daily"} - return_info = await request( - "POST", - url=api["url"], - data=data, - files={"file_up": raw}, - credential=credential, - ) - + files={"file_up": raw} + return_info = await Api(**api, credential=credential).update_data(**data).update_files(**files).result return return_info @@ -611,7 +605,7 @@ async def schedule(type_: int): "publish_time": int(send_time.timestamp()), # type: ignore "request": json.dumps(request_data, ensure_ascii=False), } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result if info.time != None: return await schedule(2 if len(info.pics) == 0 else 4) @@ -636,14 +630,8 @@ async def schedule(type_: int): data["dyn_req"]["attach_card"]["common_card"] = info.get_attach_card() else: data["dyn_req"]["attach_card"] = None - send_result = await request( - "POST", - api["url"], - data=data, - credential=credential, - params={"csrf": credential.bili_jct}, - json_body=True, - ) + params = {"csrf": credential.bili_jct} + send_result = await Api(**api, credential=credential, json_body=True).update_data(**data).update_params(**params).result return send_result @@ -663,7 +651,7 @@ async def get_schedules_list(credential: Credential) -> dict: credential.raise_for_no_sessdata() api = API["schedule"]["list"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def send_schedule_now(draft_id: int, credential: Credential) -> dict: @@ -682,7 +670,7 @@ async def send_schedule_now(draft_id: int, credential: Credential) -> dict: api = API["schedule"]["publish_now"] data = {"draft_id": draft_id} - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def delete_schedule(draft_id: int, credential: Credential) -> dict: @@ -701,7 +689,7 @@ async def delete_schedule(draft_id: int, credential: Credential) -> dict: api = API["schedule"]["delete"] data = {"draft_id": draft_id} - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result class Dynamic: @@ -740,9 +728,7 @@ async def get_info(self) -> dict: "timezone_offset": -480, "features": "itemOpusStyle", } - data = await request( - "GET", api["url"], params=params, credential=self.credential - ) + data = await Api(**api, credential=self.credential).update_params(**params).result return data async def get_reposts(self, offset: str = "0") -> dict: @@ -759,9 +745,7 @@ async def get_reposts(self, offset: str = "0") -> dict: params: dict[str, Any] = {"dynamic_id": self.__dynamic_id} if offset != "0": params["offset"] = offset - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_likes(self, pn: int = 1, ps: int = 30) -> dict: """ @@ -777,9 +761,7 @@ async def get_likes(self, pn: int = 1, ps: int = 30) -> dict: """ api = API["info"]["likes"] params = {"dynamic_id": self.__dynamic_id, "pn": pn, "ps": ps} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def set_like(self, status: bool = True) -> dict: """ @@ -804,7 +786,7 @@ async def set_like(self, status: bool = True) -> dict: "up": 1 if status else 2, "uid": self_uid, } - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def delete(self) -> dict: """ @@ -817,7 +799,7 @@ async def delete(self) -> dict: api = API["operate"]["delete"] data = {"dynamic_id": self.__dynamic_id} - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def repost(self, text: str = "转发动态") -> dict: """ @@ -834,7 +816,7 @@ async def repost(self, text: str = "转发动态") -> dict: api = API["operate"]["repost"] data = await _get_text_data(text) data["dynamic_id"] = self.__dynamic_id - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def get_new_dynamic_users(credential: Union[Credential, None] = None) -> dict: @@ -850,7 +832,7 @@ async def get_new_dynamic_users(credential: Union[Credential, None] = None) -> d credential = credential if credential else Credential() credential.raise_for_no_sessdata() api = API["info"]["attention_new_dynamic"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_live_users( @@ -871,7 +853,7 @@ async def get_live_users( credential.raise_for_no_sessdata() api = API["info"]["attention_live"] params = {"size": size} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_dynamic_page_UPs_info(credential: Credential) -> dict: @@ -885,7 +867,7 @@ async def get_dynamic_page_UPs_info(credential: Credential) -> dict: dict: 调用 API 返回的结果 """ api = API["info"]["dynamic_page_UPs_info"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_dynamic_page_info( @@ -929,9 +911,7 @@ async def get_dynamic_page_info( elif host_mid: # 指定 UP 主动态 params["host_mid"] = host_mid - dynmaic_data = await request( - "GET", api["url"], credential=credential, params=params - ) + dynmaic_data = await Api(**api, credential=credential).update_params(**params).result return [ Dynamic(dynamic_id=int(dynamic["id_str"]), credential=credential) for dynamic in dynmaic_data["items"] diff --git a/bilibili_api/emoji.py b/bilibili_api/emoji.py index 2b30bf36..fa19c6b3 100644 --- a/bilibili_api/emoji.py +++ b/bilibili_api/emoji.py @@ -5,7 +5,7 @@ """ from .utils.utils import get_api -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("emoji") @@ -22,4 +22,4 @@ async def get_emoji_list(business: str = "reply") -> dict: """ api = API["list"] params = {"business": business} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result diff --git a/bilibili_api/favorite_list.py b/bilibili_api/favorite_list.py index 285dc9c4..49395be7 100644 --- a/bilibili_api/favorite_list.py +++ b/bilibili_api/favorite_list.py @@ -11,7 +11,7 @@ from .video import Video from .utils.utils import join, get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api from .exceptions.ArgsException import ArgsException API = get_api("favorite-list") @@ -110,9 +110,7 @@ async def get_info(self): api = API["info"]["info"] params = {"media_id": self.__media_id} - return await request( - "GET", url=api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_content_video( self, @@ -177,9 +175,7 @@ async def get_content_ids_info(self) -> dict: api = API["info"]["list_content_id_list"] params = {"media_id": self.__media_id} - return await request( - "GET", url=api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_video_favorite_list( @@ -206,7 +202,7 @@ async def get_video_favorite_list( if video is not None: params["rid"] = video.get_aid() - return await request("GET", url=api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_video_favorite_list_content( @@ -254,7 +250,7 @@ async def get_video_favorite_list_content( if keyword is not None: params["keyword"] = keyword - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_topic_favorite_list( @@ -279,7 +275,7 @@ async def get_topic_favorite_list( api = API["info"]["list_topics"] params = {"page_num": page, "page_size": 16} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_article_favorite_list( @@ -304,7 +300,7 @@ async def get_article_favorite_list( api = API["info"]["list_articles"] params = {"pn": page, "ps": 16} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_album_favorite_list( @@ -329,7 +325,7 @@ async def get_album_favorite_list( api = API["info"]["list_albums"] params = {"page": page, "pagesize": 30, "biz_type": 2} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_course_favorite_list( @@ -355,7 +351,7 @@ async def get_course_favorite_list( self_info = await user.get_self_info(credential) params = {"pn": page, "ps": 10, "mid": self_info["mid"]} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_note_favorite_list( @@ -380,7 +376,7 @@ async def get_note_favorite_list( api = API["info"]["list_notes"] params = {"pn": page, "ps": 16} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def create_video_favorite_list( @@ -418,7 +414,7 @@ async def create_video_favorite_list( "cover": "", } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def modify_video_favorite_list( @@ -461,7 +457,7 @@ async def modify_video_favorite_list( "media_id": media_id, } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def delete_video_favorite_list( @@ -485,7 +481,7 @@ async def delete_video_favorite_list( data = {"media_ids": join(",", media_ids)} api = API["operate"]["delete"] - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def copy_video_favorite_list_content( @@ -519,7 +515,7 @@ async def copy_video_favorite_list_content( "resources": ",".join(map(lambda x: f"{str(x)}:2", aids)), } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def move_video_favorite_list_content( @@ -550,7 +546,7 @@ async def move_video_favorite_list_content( "resources": ",".join(map(lambda x: f"{str(x)}:2", aids)), } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def delete_video_favorite_list_content( @@ -578,7 +574,7 @@ async def delete_video_favorite_list_content( "resources": ",".join(map(lambda x: f"{str(x)}:2", aids)), } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def clean_video_favorite_list_content( @@ -601,7 +597,7 @@ async def clean_video_favorite_list_content( data = {"media_id": media_id} - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def get_favorite_collected( @@ -624,4 +620,4 @@ async def get_favorite_collected( """ api = API["info"]["collected"] params = {"up_mid": uid, "platform": "web", "pn": pn, "ps": ps} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result diff --git a/bilibili_api/game.py b/bilibili_api/game.py index d5f2ea01..09cc7338 100644 --- a/bilibili_api/game.py +++ b/bilibili_api/game.py @@ -8,7 +8,7 @@ from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("game") @@ -43,9 +43,7 @@ async def get_info(self) -> dict: """ api = API["info"]["info"] params = {"game_base_id": self.__game_id} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_up_info(self) -> dict: """ @@ -56,9 +54,7 @@ async def get_up_info(self) -> dict: """ api = API["info"]["UP"] params = {"game_base_id": self.__game_id} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_detail(self) -> dict: """ @@ -69,9 +65,7 @@ async def get_detail(self) -> dict: """ api = API["info"]["detail"] params = {"game_base_id": self.__game_id} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_wiki(self) -> dict: """ @@ -82,9 +76,7 @@ async def get_wiki(self) -> dict: """ api = API["info"]["wiki"] params = {"game_base_id": self.__game_id} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_videos(self) -> dict: """ @@ -95,9 +87,7 @@ async def get_videos(self) -> dict: """ api = API["info"]["videos"] params = {"game_base_id": self.__game_id} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result # async def get_score(self) -> dict: # """ diff --git a/bilibili_api/homepage.py b/bilibili_api/homepage.py index 4a6da7ec..b7e5e45d 100644 --- a/bilibili_api/homepage.py +++ b/bilibili_api/homepage.py @@ -8,7 +8,7 @@ from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("homepage") @@ -23,7 +23,7 @@ async def get_top_photo() -> dict: """ api = API["info"]["top_photo"] params = {"resource_id": 142} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_links(credential: Union[Credential, None] = None): @@ -39,7 +39,7 @@ async def get_links(credential: Union[Credential, None] = None): """ api = API["info"]["links"] params = {"pf": 0, "ids": 4694} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_popularize(credential: Union[Credential, None] = None): @@ -55,7 +55,7 @@ async def get_popularize(credential: Union[Credential, None] = None): """ api = API["info"]["popularize"] params = {"pf": 0, "ids": 34} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_videos(credential: Union[Credential, None] = None): @@ -69,4 +69,4 @@ async def get_videos(credential: Union[Credential, None] = None): 调用 API 返回的结果 """ api = API["info"]["videos"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result diff --git a/bilibili_api/hot.py b/bilibili_api/hot.py index 4844e48b..46665530 100644 --- a/bilibili_api/hot.py +++ b/bilibili_api/hot.py @@ -5,7 +5,7 @@ """ from .utils.utils import get_api -from .utils.network_httpx import request +from .utils.network_httpx import Api API_rank = get_api("rank") API = get_api("hot") @@ -25,7 +25,7 @@ async def get_hot_videos(pn: int = 1, ps: int = 20) -> dict: """ api = API_rank["info"]["hot"] params = {"ps": ps, "pn": pn} - return await request("GET", url=api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_weakly_hot_videos_list() -> dict: @@ -36,7 +36,7 @@ async def get_weakly_hot_videos_list() -> dict: 调用 API 返回的结果 """ api = API_rank["info"]["weakly_series"] - return await request("GET", url=api["url"]) + return await Api(**api).result async def get_weakly_hot_videos(week: int = 1) -> dict: @@ -51,7 +51,7 @@ async def get_weakly_hot_videos(week: int = 1) -> dict: """ api = API_rank["info"]["weakly_details"] params = {"number": week} - return await request("GET", url=api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_history_popular_videos() -> dict: @@ -63,7 +63,7 @@ async def get_history_popular_videos() -> dict: """ api = API_rank["info"]["history_popular"] params = {"page_size": 85, "page": 1} - return await request("GET", url=api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_hot_buzzwords(page_num: int = 1, page_size: int = 20) -> dict: @@ -80,4 +80,4 @@ async def get_hot_buzzwords(page_num: int = 1, page_size: int = 20) -> dict: """ api = API["buzzwords"] params = {"pn": page_num, "ps": page_size, "type_id": 4} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result diff --git a/bilibili_api/interactive_video.py b/bilibili_api/interactive_video.py index 9051a997..25d550c3 100644 --- a/bilibili_api/interactive_video.py +++ b/bilibili_api/interactive_video.py @@ -25,7 +25,7 @@ from .utils.utils import get_api from .utils.AsyncEvent import AsyncEvent from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("interactive_video") @@ -476,9 +476,9 @@ async def up_get_ivideo_pages(self) -> dict: dict: 调用 API 返回的结果 """ credential = self.credential if self.credential else Credential() - url = API["info"]["videolist"]["url"] + api = API["info"]["videolist"] params = {"bvid": self.get_bvid()} - return await request("GET", url=url, params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def up_submit_story_tree(self, story_tree: str) -> dict: """ @@ -491,7 +491,7 @@ async def up_submit_story_tree(self, story_tree: str) -> dict: dict: 调用 API 返回的结果 """ credential = self.credential if self.credential else Credential() - url = API["operate"]["savestory"]["url"] + api = API["operate"]["savestory"] form_data = {"preview": "0", "data": story_tree, "csrf": credential.bili_jct} headers = { "User-Agent": "Mozilla/5.0", @@ -501,15 +501,9 @@ async def up_submit_story_tree(self, story_tree: str) -> dict: "Accept": "application/json, text/plain, */*", } data = parse.urlencode(form_data) - return await request( - "POST", - url=url, - data=data, - headers=headers, - no_csrf=True, - credential=credential, - ) - + return await Api(**api, credential=credential, no_csrf=True + ).update_data(**data).update_headers(**headers).result + async def get_graph_version(self) -> int: """ 获取剧情图版本号,仅供 `get_edge_info()` 使用。 @@ -528,7 +522,7 @@ async def get_graph_version(self) -> int: api = "https://api.bilibili.com/x/player/v2" params = {"bvid": bvid, "cid": cid} - resp = await request("GET", api, params, credential=credential) + resp = await Api(**api, credential=credential).update_params(**params).result return resp["interaction"]["graph_version"] async def get_edge_info(self, edge_id: Union[int, None] = None): @@ -544,13 +538,13 @@ async def get_edge_info(self, edge_id: Union[int, None] = None): bvid = self.get_bvid() credential = self.credential if self.credential is not None else Credential() - url = API["info"]["edge_info"]["url"] + api = API["info"]["edge_info"] params = {"bvid": bvid, "graph_version": (await self.get_graph_version())} if edge_id is not None: params["edge_id"] = edge_id - return await request("GET", url, params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def mark_score(self, score: int = 5): """ @@ -566,7 +560,7 @@ async def mark_score(self, score: int = 5): self.credential.raise_for_no_bili_jct() api = API["operate"]["mark_score"] data = {"mark": score, "bvid": self.get_bvid()} - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def get_cid(self) -> int: """ diff --git a/bilibili_api/live.py b/bilibili_api/live.py index 5dfefa12..92a42069 100644 --- a/bilibili_api/live.py +++ b/bilibili_api/live.py @@ -21,7 +21,7 @@ from .utils.network import get_session from .utils.AsyncEvent import AsyncEvent from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api from .exceptions.LiveException import LiveException API = get_api("live") @@ -141,9 +141,7 @@ async def start(self, area_id: int) -> dict: "room_id": self.room_display_id, "platform": "pc", } - resp = await request( - api["method"], api["url"], params=params, credential=self.credential - ) + resp = await Api(**api, credential=self.credential).update_params(**params).result return resp async def stop(self) -> dict: @@ -157,9 +155,7 @@ async def stop(self) -> dict: params = { "room_id": self.room_display_id, } - resp = await request( - api["method"], api["url"], params=params, credential=self.credential - ) + resp = await Api(**api, credential=self.credential).update_params(**params).result return resp async def get_room_play_info(self) -> dict: @@ -173,9 +169,7 @@ async def get_room_play_info(self) -> dict: params = { "room_id": self.room_display_id, } - resp = await request( - api["method"], api["url"], params=params, credential=self.credential - ) + resp = await Api(**api, credential=self.credential).update_params(**params).result # 缓存真实房间 ID self.__ruid = resp["uid"] @@ -205,9 +199,7 @@ async def get_chat_conf(self) -> dict: """ api = API["info"]["chat_conf"] params = {"room_id": self.room_display_id} - return await request( - api["method"], api["url"], params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_room_info(self) -> dict: """ @@ -218,9 +210,7 @@ async def get_room_info(self) -> dict: """ api = API["info"]["room_info"] params = {"room_id": self.room_display_id} - return await request( - api["method"], api["url"], params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_fan_model( self, @@ -256,9 +246,7 @@ async def get_fan_model( params["roomId"] = roomId if target_id: params["target_id"] = target_id - return await request( - api["method"], api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_user_info_in_room(self) -> dict: """ @@ -271,9 +259,7 @@ async def get_user_info_in_room(self) -> dict: api = API["info"]["user_info_in_room"] params = {"room_id": self.room_display_id} - return await request( - api["method"], api["url"], params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_dahanghai(self, page: int = 1) -> dict: """ @@ -292,9 +278,7 @@ async def get_dahanghai(self, page: int = 1) -> dict: "page_size": 30, "page": page, } - return await request( - api["method"], api["url"], params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_gaonengbang(self, page: int = 1) -> dict: """ @@ -313,9 +297,7 @@ async def get_gaonengbang(self, page: int = 1) -> dict: "pageSize": 50, "page": page, } - return await request( - api["method"], api["url"], params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_seven_rank(self) -> dict: """ @@ -329,9 +311,7 @@ async def get_seven_rank(self) -> dict: "roomid": self.room_display_id, "ruid": await self.__get_ruid(), } - return await request( - api["method"], api["url"], params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_fans_medal_rank(self) -> dict: """ @@ -342,9 +322,7 @@ async def get_fans_medal_rank(self) -> dict: """ api = API["info"]["fans_medal_rank"] params = {"roomid": self.room_display_id, "ruid": await self.__get_ruid()} - return await request( - api["method"], api["url"], params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_black_list(self) -> dict: """ @@ -356,9 +334,7 @@ async def get_black_list(self) -> dict: api = API["info"]["black_list"] params = {"room_id": self.room_display_id, "ps": 1} - return await request( - api["method"], api["url"], params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_room_play_url( self, screen_resolution: ScreenResolution = ScreenResolution.ORIGINAL @@ -380,9 +356,7 @@ async def get_room_play_url( "https_url_req": "1", "ptype": "16", } - return await request( - api["method"], api["url"], params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_room_play_info_v2( self, @@ -416,9 +390,7 @@ async def get_room_play_info_v2( "codec": live_codec.value, "qn": live_qn.value, } - return await request( - api["method"], api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def ban_user(self, uid: int) -> dict: """ @@ -439,9 +411,7 @@ async def ban_user(self, uid: int) -> dict: "mobile_app": "web", "visit_id": "", } - return await request( - api["method"], api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**data).result async def unban_user(self, block_id: int) -> dict: """ @@ -460,9 +430,7 @@ async def unban_user(self, block_id: int) -> dict: "id": block_id, "visit_id": "", } - return await request( - api["method"], api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**data).result async def send_danmaku(self, danmaku: Danmaku) -> dict: """ @@ -489,9 +457,7 @@ async def send_danmaku(self, danmaku: Danmaku) -> dict: "fontsize": danmaku.font_size, } - return await request( - api["method"], api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**data).result async def sign_up_dahanghai(self, task_id: int = 1447) -> dict: """ @@ -511,9 +477,7 @@ async def sign_up_dahanghai(self, task_id: int = 1447) -> dict: "task_id": task_id, "uid": await self.__get_ruid(), } - return await request( - api["method"], api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**data).result async def send_gift_from_bag( self, @@ -560,9 +524,7 @@ async def send_gift_from_bag( "biz_id": self.room_display_id, "ruid": await self.__get_ruid(), } - return await request( - api["method"], api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**data).result async def receive_reward(self, receive_type: int = 2) -> dict: """ @@ -581,9 +543,7 @@ async def receive_reward(self, receive_type: int = 2) -> dict: "ruid": await self.__get_ruid(), "receive_type": receive_type, } - return await request( - api["method"], api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**data).result async def get_general_info(self, act_id: int = 100061) -> dict: """ @@ -603,9 +563,7 @@ async def get_general_info(self, act_id: int = 100061) -> dict: "roomId": self.room_display_id, "uid": await self.__get_ruid(), } - return await request( - api["method"], api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_gift_common(self) -> dict: """ @@ -618,12 +576,10 @@ async def get_gift_common(self) -> dict: params_room_info = { "room_id": self.room_display_id, } - res_room_info = await request( - api_room_info["method"], - api_room_info["url"], - params=params_room_info, - credential=self.credential, - ) + res_room_info = await Api( + **api_room_info, + credential=self.credential + ).update_params(**params_room_info).result area_id, area_parent_id = ( res_room_info["room_info"]["area_id"], res_room_info["room_info"]["parent_area_id"], @@ -637,9 +593,7 @@ async def get_gift_common(self) -> dict: "platform": "pc", "source": "live", } - return await request( - api["method"], api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_gift_special(self, tab_id: int) -> dict: """ @@ -655,12 +609,10 @@ async def get_gift_special(self, tab_id: int) -> dict: params_room_info = { "room_id": self.room_display_id, } - res_room_info = await request( - api_room_info["method"], - api_room_info["url"], - params=params_room_info, - credential=self.credential, - ) + res_room_info = await Api( + **api_room_info, + credential=self.credential + ).update_params(**params_room_info).result area_id, area_parent_id = ( res_room_info["room_info"]["area_id"], res_room_info["room_info"]["parent_area_id"], @@ -677,9 +629,7 @@ async def get_gift_special(self, tab_id: int) -> dict: "platform": "pc", "build": 1, } - return await request( - api["method"], api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def send_gift_gold( self, uid: int, gift_id: int, gift_num: int, price: int, storm_beat_id: int = 0 @@ -721,9 +671,7 @@ async def send_gift_gold( "rnd": int(time.time()), "visit_id": "", } - return await request( - api["method"], api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**data).result async def send_gift_silver( self, @@ -770,9 +718,7 @@ async def send_gift_silver( "rnd": int(time.time()), "visit_id": "", } - return await request( - api["method"], api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(**data).result class LiveDanmaku(AsyncEvent): @@ -1097,9 +1043,7 @@ async def __heartbeat(self, ws: ClientWebSocketResponse) -> None: base64.b64encode(f"60|{self.room_display_id}|1|0".encode("utf-8")), "utf-8", ) - await request( - "GET", heartbeat_url, params={"hb": hb, "pf": "web"}, json_body=True - ) + await Api(method="GET", url=heartbeat_url, json_body=True).update_params(**{"hb": hb, "pf": "web"}).result elif self.__heartbeat_timer <= -30: # 视为已异常断开连接,发布 TIMEOUT 事件 self.dispatch("TIMEOUT") @@ -1198,7 +1142,7 @@ async def get_self_info(credential: Credential) -> dict: credential.raise_for_no_sessdata() api = API["info"]["user_info"] - return await request(api["method"], api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_self_live_info(credential: Credential) -> dict: @@ -1212,7 +1156,7 @@ async def get_self_live_info(credential: Credential) -> dict: credential.raise_for_no_sessdata() api = API["info"]["live_info"] - return await request(api["method"], api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_self_dahanghai_info( @@ -1245,9 +1189,7 @@ async def get_self_dahanghai_info( api = API["info"]["user_guards"] params = {"page": page, "page_size": page_size} - return await request( - api["method"], api["url"], params=params, credential=credential - ) + return await Api(**api, credential=credential).update_params(**params).result async def get_self_bag(credential: Credential) -> dict: @@ -1261,7 +1203,7 @@ async def get_self_bag(credential: Credential) -> dict: credential.raise_for_no_sessdata() api = API["info"]["bag_list"] - return await request(api["method"], api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_gift_config( @@ -1292,7 +1234,7 @@ async def get_gift_config( "area_id": area_id if area_id is not None else "", "area_parent_id": area_parent_id if area_parent_id is not None else "", } - return await request(api["method"], api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_area_info() -> dict: @@ -1303,7 +1245,7 @@ async def get_area_info() -> dict: dict: 调用 API 返回的结果 """ api = API["info"]["area_info"] - return await request(api["method"], api["url"]) + return await Api(**api).result async def get_live_followers_info( @@ -1325,9 +1267,7 @@ async def get_live_followers_info( api = API["info"]["followers_live_info"] params = {"need_recommend": int(need_recommend), "filterRule": 0} - return await request( - api["method"], api["url"], params=params, credential=credential - ) + return await Api(**api, credential=credential).update_params(**params).result async def get_unlive_followers_info( @@ -1354,9 +1294,7 @@ async def get_unlive_followers_info( "page": page, "pagesize": page_size, } - return await request( - api["method"], api["url"], params=params, credential=credential - ) + return await Api(**api, credential=credential).update_params(**params).result async def create_live_reserve( @@ -1383,4 +1321,4 @@ async def create_live_reserve( "stime": None, "from": 1, } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result diff --git a/bilibili_api/live_area.py b/bilibili_api/live_area.py index 0b68729b..66af2ff4 100644 --- a/bilibili_api/live_area.py +++ b/bilibili_api/live_area.py @@ -11,7 +11,7 @@ from typing import Dict, List, Tuple, Union from .utils.utils import get_api -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("live-area") @@ -149,4 +149,4 @@ async def get_list_by_area( "page": page, "sort_type": order.value, } - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result diff --git a/bilibili_api/manga.py b/bilibili_api/manga.py index 795f3ed1..aad729f5 100644 --- a/bilibili_api/manga.py +++ b/bilibili_api/manga.py @@ -15,7 +15,7 @@ from bilibili_api.errors import ArgsException from bilibili_api.utils.picture import Picture from bilibili_api.utils.credential import Credential -from bilibili_api.utils.network_httpx import HEADERS, request +from bilibili_api.utils.network_httpx import HEADERS, request, Api API = get_api("manga") @@ -157,17 +157,15 @@ async def get_info(self) -> dict: """ api = API["info"]["detail"] params = {"comic_id": self.__manga_id} - return await request( - "POST", - api["url"], - params=params, + return await Api( + **api, credential=self.credential, no_csrf=( False if (self.credential.has_sessdata() and self.credential.has_bili_jct()) else True ), - ) + ).update_params(**params).result async def __get_info_cached(self) -> dict: """ @@ -247,17 +245,15 @@ async def get_images_url( episode_id = await self.get_episode_id(episode_count) api = API["info"]["episode_images"] params = {"ep_id": episode_id} - return await request( - "POST", - api["url"], - params=params, + return await Api( + **api, + credential=self.credential, no_csrf=( False if (self.credential.has_sessdata() and self.credential.has_bili_jct()) else True ), - credential=self.credential, - ) + ).update_params(**params).result async def get_images( self, @@ -287,20 +283,15 @@ async def get_images( async def get_real_image_url(url: str) -> str: token_api = API["info"]["image_token"] datas = {"urls": f'["{url}"]'} - token_data = await request( - "POST", - token_api["url"], - data=datas, - no_csrf=( - False - if ( - self.credential.has_sessdata() - and self.credential.has_bili_jct() - ) - else True - ), - credential=self.credential, - ) + token_data = await Api( + **token_api, + credential=self.credential, + no_csrf=( + False + if (self.credential.has_sessdata() and self.credential.has_bili_jct()) + else True + ), + ).update_data(**datas).result return token_data[0]["url"] + "?token=" + token_data[0]["token"] for img in data["images"]: @@ -338,16 +329,15 @@ async def manga_image_url_turn_to_Picture( async def get_real_image_url(url: str) -> str: token_api = API["info"]["image_token"] datas = {"urls": f'["{url}"]'} - token_data = await request( - "POST", - token_api["url"], - data=datas, + token_data = await Api( + **token_api, + credential=credential, no_csrf=( False if (credential.has_sessdata() and credential.has_bili_jct()) else True ), - ) + ).update_data(**datas).result return f'{token_data[0]["url"]}?token={token_data[0]["token"]}' url = await get_real_image_url(url) @@ -379,7 +369,7 @@ async def set_follow_manga( else: api = API["operate"]["del_favorite"] data = {"comic_ids": str(manga.get_manga_id())} - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result async def get_raw_manga_index( @@ -423,8 +413,7 @@ async def get_raw_manga_index( "page_num": pn, "page_size": ps, } - return await request("POST", api["url"], data=data, params=params, no_csrf=True) - + return await Api(**api, no_csrf=True).update_data(**data).update_params(**params).result async def get_manga_index( area: MangaIndexFilter.Area = MangaIndexFilter.Area.ALL, @@ -481,9 +470,7 @@ async def get_manga_update( if isinstance(date, datetime.datetime): date = date.strftime("%Y-%m-%d") data = {"date": date, "page_num": pn, "page_size": ps} - manga_data = await request( - "POST", api["url"], no_csrf=True, params=params, data=data - ) + manga_data = await Api(**api, no_csrf=True).update_data(**data).update_params(**params).result return [Manga(manga["comic_id"]) for manga in manga_data["list"]] @@ -504,7 +491,5 @@ async def get_manga_home_recommend( api = API["info"]["home_recommend"] params = {"device": "pc", "platform": "web"} data = {"page_num": pn, "seed": seed} - manga_data = await request( - "POST", api["url"], no_csrf=True, params=params, data=data - ) + manga_data = await Api(**api, no_csrf=True).update_data(**data).update_params(**params).result return [Manga(manga["comic_id"]) for manga in manga_data["list"]] diff --git a/bilibili_api/music.py b/bilibili_api/music.py index 79304f4d..f255c9f7 100644 --- a/bilibili_api/music.py +++ b/bilibili_api/music.py @@ -11,7 +11,7 @@ from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API_audio = get_api("audio") API = get_api("music") @@ -118,7 +118,7 @@ async def get_homepage_recommend(credential: Optional[Credential] = None): """ credential = credential if credential else Credential() api = API_audio["audio_info"]["homepage_recommend"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_music_index_info( @@ -154,7 +154,7 @@ async def get_music_index_info( "pn": page_num, "ps": page_size, } - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result class Music: @@ -185,7 +185,7 @@ async def get_info(self): """ api = API["info"]["detail"] params = {"music_id": self.__music_id} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_music_videos(self): """ @@ -196,4 +196,4 @@ async def get_music_videos(self): """ api = API["info"]["video_recommend_list"] params = {"music_id": self.__music_id} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result diff --git a/bilibili_api/note.py b/bilibili_api/note.py index 9a556770..5d36bd70 100644 --- a/bilibili_api/note.py +++ b/bilibili_api/note.py @@ -18,7 +18,7 @@ from .utils.picture import Picture from .utils.credential import Credential from .exceptions import ApiException, ArgsException -from .utils.network_httpx import request, get_session +from .utils.network_httpx import Api, get_session API = get_api("note") API_ARTICLE = get_api("article") @@ -130,9 +130,7 @@ async def get_private_note_info(self) -> dict: api = API["private"]["detail"] # oid 为 0 时指 avid params = {"oid": self.get_aid(), "note_id": self.get_note_id(), "oid_type": 0} - resp = await request( - "GET", api["url"], params=params, credential=self.credential - ) + resp = await Api(**api, credential=self.credential).update_params(**params).result # 存入 self.__info 中以备后续调用 self.__info = resp return resp @@ -149,9 +147,7 @@ async def get_public_note_info(self) -> dict: api = API["public"]["detail"] params = {"cvid": self.get_cvid()} - resp = await request( - "GET", api["url"], params=params, credential=self.credential - ) + resp = await Api(**api, credential=self.credential).update_params(**params).result # 存入 self.__info 中以备后续调用 self.__info = resp return resp @@ -229,7 +225,7 @@ async def set_like(self, status: bool = True) -> dict: api = API_ARTICLE["operate"]["like"] data = {"id": self.__cvid, "type": 1 if status else 2} - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def set_favorite(self, status: bool = True) -> dict: """ @@ -254,7 +250,7 @@ async def set_favorite(self, status: bool = True) -> dict: ) data = {"id": self.__cvid} - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def add_coins(self) -> dict: """ @@ -272,7 +268,7 @@ async def add_coins(self) -> dict: upid = (await self.get_info())["mid"] api = API_ARTICLE["operate"]["coin"] data = {"aid": self.__cvid, "multiply": 1, "upid": upid, "avtype": 2} - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def fetch_content(self) -> None: """ diff --git a/bilibili_api/rank.py b/bilibili_api/rank.py index 1e5a0200..4d7acb50 100644 --- a/bilibili_api/rank.py +++ b/bilibili_api/rank.py @@ -9,7 +9,7 @@ from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("rank") @@ -202,7 +202,7 @@ async def get_rank( else: raise Exception("Unknown RankType") - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_music_rank_list() -> dict: @@ -214,7 +214,7 @@ async def get_music_rank_list() -> dict: """ api = API["info"]["music_weakly_series"] params = {"list_type": 1} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_music_rank_weakly_detail(week: int = 1) -> dict: @@ -229,7 +229,7 @@ async def get_music_rank_weakly_detail(week: int = 1) -> dict: """ api = API["info"]["music_weakly_details"] params = {"list_id": week} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_music_rank_weakly_musics(week: int = 1) -> dict: @@ -244,7 +244,7 @@ async def get_music_rank_weakly_musics(week: int = 1) -> dict: """ api = API["info"]["music_weakly_content"] params = {"list_id": week} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_vip_rank(type_: VIPRankType = VIPRankType.VIP) -> dict: @@ -259,7 +259,7 @@ async def get_vip_rank(type_: VIPRankType = VIPRankType.VIP) -> dict: """ api = API["info"]["VIP_rank"] params = {"rank_id": type_.value} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_manga_rank(type_: MangeRankType = MangeRankType.NEW) -> dict: @@ -272,7 +272,7 @@ async def get_manga_rank(type_: MangeRankType = MangeRankType.NEW) -> dict: api = API["info"]["manga_rank"] params = {"device": "pc", "platform": "web"} data = {"id": type_.value} - return await request("POST", api["url"], params=params, data=data, no_csrf=True) + return await Api(**api, no_csrf=True).update_data(**data).update_params(**params).result async def get_live_hot_rank() -> dict: @@ -283,7 +283,7 @@ async def get_live_hot_rank() -> dict: dict: 调用 API 返回的结果 """ api = API["info"]["live_hot_rank"] - return await request("GET", api["url"]) + return await Api(**api).result async def get_live_sailing_rank() -> dict: @@ -294,7 +294,7 @@ async def get_live_sailing_rank() -> dict: dict: 调用 API 返回的结果 """ api = API["info"]["live_sailing_rank"] - return await request("GET", api["url"]) + return await Api(**api).result async def get_live_energy_user_rank( @@ -315,7 +315,7 @@ async def get_live_energy_user_rank( """ api = API["info"]["live_energy_user_rank"] params = {"date": date.value, "page": pn, "page_size": ps} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_live_rank( @@ -342,7 +342,7 @@ async def get_live_rank( "is_trend": 1, "area_id": None, } - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_live_user_medal_rank(pn: int = 1, ps: int = 20) -> dict: @@ -359,12 +359,12 @@ async def get_live_user_medal_rank(pn: int = 1, ps: int = 20) -> dict: """ api = API["info"]["live_medal_level_rank"] params = {"page": pn, "page_size": ps} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def subscribe_music_rank( status: bool = True, credential: Union[Credential, None] = None -): +) -> dict: """ 设置关注全站音乐榜 @@ -378,10 +378,10 @@ async def subscribe_music_rank( credential.raise_for_no_bili_jct() api = API["operate"]["subscribe"] data = {"list_id": 1, "state": (1 if status else 2)} - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result -async def get_playlet_rank_phases(): +async def get_playlet_rank_phases() -> dict: """ 获取全站短剧榜期数 @@ -389,10 +389,10 @@ async def get_playlet_rank_phases(): dict: 调用 API 返回的结果 """ api = API["info"]["playlet_rank_phase"] - return await request("POST", api["url"], data={}, json_body=True, no_csrf=True) + return await Api(**api, json_body=True, no_csrf=True).result -async def get_playlet_rank_info(phase_id: int): +async def get_playlet_rank_info(phase_id: int) -> dict: """ 获取全站短剧榜 @@ -406,4 +406,4 @@ async def get_playlet_rank_info(phase_id: int): """ api = API["info"]["playlet_rank_info"] data = {"phaseID": phase_id} - return await request("POST", api["url"], data=data, json_body=True, no_csrf=True) + return await Api(**api, json_body=True, no_csrf=True).update_data(**data).result diff --git a/bilibili_api/search.py b/bilibili_api/search.py index 6a4ef391..6ff8843f 100644 --- a/bilibili_api/search.py +++ b/bilibili_api/search.py @@ -9,7 +9,7 @@ from .utils.utils import get_api from .video_zone import VideoZoneTypes -from .utils.network_httpx import request, get_session +from .utils.network_httpx import Api, get_session API = get_api("search") @@ -164,7 +164,7 @@ async def search(keyword: str, page: int = 1) -> dict: """ api = API["search"]["web_search"] params = {"keyword": keyword, "page": page} - return await request("GET", url=api["url"], params=params) + return await Api(**api).update_params(**params).result async def search_by_type( @@ -250,7 +250,7 @@ async def search_by_type( if debug_param_func: debug_param_func(params) api = API["search"]["web_search_by_type"] - return await request("GET", url=api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_default_search_keyword() -> dict: @@ -261,7 +261,7 @@ async def get_default_search_keyword() -> dict: dict: 调用 API 返回的结果 """ api = API["search"]["default_search_keyword"] - return await request("GET", api["url"]) + return await Api(**api).result async def get_hot_search_keywords() -> dict: @@ -309,7 +309,7 @@ async def search_games(keyword: str) -> dict: """ api = API["search"]["game"] params = {"keyword": keyword} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def search_manga(keyword: str, page_num: int = 1, page_size: int = 9): @@ -328,7 +328,7 @@ async def search_manga(keyword: str, page_num: int = 1, page_size: int = 9): """ api = API["search"]["manga"] data = {"key_word": keyword, "page_num": page_num, "page_size": page_size} - return await request("POST", api["url"], data=data, no_csrf=True) + return await Api(**api, no_csrf=True).update_data(**data).result async def search_cheese( @@ -359,4 +359,4 @@ async def search_cheese( "page_size": page_size, "sort_type": order.value, } - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result diff --git a/bilibili_api/session.py b/bilibili_api/session.py index befdb1d4..01255b1e 100644 --- a/bilibili_api/session.py +++ b/bilibili_api/session.py @@ -21,7 +21,7 @@ from .utils.picture import Picture from .utils.AsyncEvent import AsyncEvent from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("session") @@ -53,7 +53,7 @@ async def fetch_session_msgs( } api = API["session"]["fetch"] - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def new_sessions( @@ -75,7 +75,7 @@ async def new_sessions( params = {"begin_ts": begin_ts, "build": 0, "mobi_app": "web"} api = API["session"]["new"] - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_sessions(credential: Credential, session_type: int = 4) -> dict: @@ -102,7 +102,7 @@ async def get_sessions(credential: Credential, session_type: int = 4) -> dict: } api = API["session"]["get"] - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_session_detail( @@ -126,7 +126,7 @@ async def get_session_detail( params = {"talker_id": talker_id, "session_type": session_type} api = API["session"]["get_session_detail"] - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result async def get_likes(credential: Credential) -> dict: @@ -140,7 +140,7 @@ async def get_likes(credential: Credential) -> dict: dict: 调用 API 返回的结果 """ api = API["session"]["likes"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_unread_messages(credential: Credential) -> dict: @@ -154,7 +154,7 @@ async def get_unread_messages(credential: Credential) -> dict: dict: 调用 API 返回的结果 """ api = API["session"]["unread"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_replies(credential: Credential) -> dict: @@ -168,7 +168,7 @@ async def get_replies(credential: Credential) -> dict: dict: 调用 API 返回的结果 """ api = API["session"]["replies"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_system_messages(credential: Credential) -> dict: @@ -182,7 +182,7 @@ async def get_system_messages(credential: Credential) -> dict: dict: 调用 API 返回的结果 """ api = API["session"]["system_msg"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def get_session_settings(credential: Credential) -> dict: @@ -196,7 +196,7 @@ async def get_session_settings(credential: Credential) -> dict: dict: 调用 API 返回的结果 """ api = API["session"]["session_settings"] - return await request("GET", api["url"], credential=credential) + return await Api(**api, credential=credential).result async def send_msg( @@ -260,7 +260,7 @@ async def send_msg( "build": 0, "mobi_app": "web", } - return await request("POST", url=api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result class Event: diff --git a/bilibili_api/topic.py b/bilibili_api/topic.py index c6d7b73d..9c7925ea 100644 --- a/bilibili_api/topic.py +++ b/bilibili_api/topic.py @@ -11,7 +11,7 @@ from .user import get_self_info from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("topic") @@ -42,7 +42,7 @@ async def get_hot_topics(numbers: int = 33) -> dict: """ api = API["info"]["dynamic_page_topics"] params = {"page_size": numbers} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def search_topic(keyword: str, ps: int = 20, pn: int = 1) -> dict: @@ -63,7 +63,7 @@ async def search_topic(keyword: str, ps: int = 20, pn: int = 1) -> dict: """ api = API["info"]["search"] params = {"keywords": keyword, "page_size": ps, "page_num": pn} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result class Topic: @@ -102,9 +102,7 @@ async def get_info(self) -> dict: """ api = API["info"]["info"] params = {"topic_id": self.get_topic_id()} - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_raw_cards( self, @@ -134,9 +132,7 @@ async def get_raw_cards( "sort_by": sort_by.value, "offset": offset, } - return await request( - "GET", api["url"], params=params, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_params(**params).result async def get_cards( self, @@ -191,7 +187,7 @@ async def like(self, status: bool = True) -> dict: "business": "topic", "up_mid": (await get_self_info(self.credential))["mid"], } - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def set_favorite(self, status: bool = True) -> dict: """ @@ -205,4 +201,4 @@ async def set_favorite(self, status: bool = True) -> dict: """ api = API["operate"]["add_favorite" if status else "cancel_favorite"] data = {"topic_id": self.get_topic_id()} - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result diff --git a/bilibili_api/user.py b/bilibili_api/user.py index 7e140c0a..edfbf9a7 100644 --- a/bilibili_api/user.py +++ b/bilibili_api/user.py @@ -13,7 +13,7 @@ from .utils.utils import get_api, join from .utils.credential import Credential from .exceptions import ResponseCodeException -from .utils.network_httpx import request, get_session, Api +from .utils.network_httpx import get_session, Api from .channel_series import ChannelOrder, ChannelSeries, ChannelSeriesType API = get_api("user") diff --git a/bilibili_api/utils/network_httpx.py b/bilibili_api/utils/network_httpx.py index df897f81..9b58ac2b 100644 --- a/bilibili_api/utils/network_httpx.py +++ b/bilibili_api/utils/network_httpx.py @@ -120,14 +120,18 @@ class Api: ignore_code: bool = False data: dict = field(default_factory=dict) params: dict = field(default_factory=dict) + files: dict = field(default_factory=dict) + headers: dict = field(default_factory=dict) credential: Credential = field(default_factory=Credential) - def __post_init__(self): + def __post_init__(self) -> None: self.method = self.method.upper() self.original_data = self.data.copy() self.original_params = self.params.copy() self.data = {k: "" for k in self.data.keys()} self.params = {k: "" for k in self.params.keys()} + self.files = {k: "" for k in self.files.keys()} + self.headers = {k: "" for k in self.headers.keys()} if self.credential is None: self.credential = Credential() self.__result = None @@ -183,7 +187,7 @@ def thread_result(self) -> Union[None, dict]: time.sleep(0.0167) return self.__result - def update_data(self, **kwargs): + def update_data(self, **kwargs) -> "Api": """ 毫无亮点的更新 data """ @@ -191,7 +195,7 @@ def update_data(self, **kwargs): self.__result = None return self - def update_params(self, **kwargs): + def update_params(self, **kwargs) -> "Api": """ 毫无亮点的更新 params """ @@ -199,9 +203,25 @@ def update_params(self, **kwargs): self.__result = None return self - def update(self, **kwargs): + def update_files(self, **kwargs) -> "Api": """ - 毫无亮点的自动选择更新 + 毫无亮点的更新 files + """ + self.files.update(kwargs) + self.__result = None + return self + + def update_headers(self, **kwargs) -> "Api": + """ + 毫无亮点的更新 headers + """ + self.headers.update(kwargs) + self.__result = None + return self + + def update(self, **kwargs) -> "Api": + """ + 毫无亮点的自动选择更新,不包括 files, headers """ if self.method == "GET": return self.update_params(**kwargs) @@ -249,8 +269,9 @@ async def request(self, **kwargs) -> Any: "method": self.method, "data": self.data, "params": self.params, + "files": self.files, "cookies": cookies, - "headers": HEADERS.copy(), + "headers": HEADERS.copy() if len(self.headers) == 0 else self.headers, } config.update(kwargs) diff --git a/bilibili_api/video.py b/bilibili_api/video.py index 3bf4f4c7..e0a64350 100644 --- a/bilibili_api/video.py +++ b/bilibili_api/video.py @@ -28,7 +28,7 @@ from .utils.credential import Credential from .utils.BytesReader import BytesReader from .utils.danmaku import Danmaku, SpecialDanmaku -from .utils.network_httpx import request, get_session, Api +from .utils.network_httpx import Api, get_session from .utils.network import get_session as get_session_aiohttp from .exceptions import ( ArgsException, diff --git a/bilibili_api/video_tag.py b/bilibili_api/video_tag.py index 8d49767f..0b950e9d 100644 --- a/bilibili_api/video_tag.py +++ b/bilibili_api/video_tag.py @@ -11,7 +11,7 @@ from .errors import * from .utils.utils import get_api from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("video_tag") API_video = get_api("video") @@ -62,7 +62,7 @@ async def get_tag_info(self) -> dict: """ api = API["info"]["tag_info"] params = {"tag_id": self.get_tag_id()} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_similar_tags(self) -> dict: """ @@ -73,7 +73,7 @@ async def get_similar_tags(self) -> dict: """ api = API["info"]["get_similar"] params = {"tag_id": self.get_tag_id()} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_cards(self) -> dict: """ @@ -84,7 +84,7 @@ async def get_cards(self) -> dict: """ api = API["info"]["get_list"] params = {"topic_id": self.get_tag_id()} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_history_cards(self, offset_dynamic_id: int) -> dict: """ @@ -95,7 +95,7 @@ async def get_history_cards(self, offset_dynamic_id: int) -> dict: """ api = API["info"]["get_history_list"] params = {"topic_id": self.get_tag_id(), "offset_dynamic_id": offset_dynamic_id} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def subscribe_tag(self) -> dict: """ @@ -110,9 +110,7 @@ async def subscribe_tag(self) -> dict: api = API_video["operate"]["subscribe_tag"] data = {"tag_id": self.__tag_id} - return await request( - "POST", url=api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(data).result async def unsubscribe_tag(self) -> dict: """ @@ -127,6 +125,4 @@ async def unsubscribe_tag(self) -> dict: api = API_video["operate"]["unsubscribe_tag"] data = {"tag_id": self.__tag_id} - return await request( - "POST", url=api["url"], data=data, credential=self.credential - ) + return await Api(**api, credential=self.credential).update_data(data).result diff --git a/bilibili_api/video_uploader.py b/bilibili_api/video_uploader.py index a6710046..7a220727 100644 --- a/bilibili_api/video_uploader.py +++ b/bilibili_api/video_uploader.py @@ -23,7 +23,7 @@ from .utils.credential import Credential from .utils.aid_bvid_transformer import bvid2aid from .exceptions.ApiException import ApiException -from .utils.network_httpx import request, get_session +from .utils.network_httpx import Api, get_session from .exceptions.NetworkException import NetworkException from .exceptions.ResponseCodeException import ResponseCodeException @@ -38,7 +38,7 @@ async def _upload_cover(cover: Picture, credential: Credential): data = { "cover": f'data:image/png;base64,{base64.b64encode(cover.content).decode("utf-8")}' } - return await request("POST", api["url"], data=data, credential=credential) + return await Api(**api, credential=credential).update_data(**data).result class VideoUploaderPage: @@ -738,16 +738,13 @@ async def _submit(self, videos: list, cover_url: str = "") -> dict: api = _API["submit"] try: - resp = await request( - "POST", - api["url"], - params={"csrf": self.credential.bili_jct}, - data=json.dumps(meta), - headers={"content-type": "application/json"}, - credential=self.credential, - no_csrf=True, - ) - + params = {"csrf": self.credential.bili_jct} + data = json.dumps(meta) + headers = {"content-type": "application/json"} + resp = await Api(**api, credential=self.credential, no_csrf=True + ).update_params(**params + ).update_data(**data + ).update_headers(**headers).result self.dispatch(VideoUploaderEvents.AFTER_SUBMIT.value, resp) return resp @@ -781,7 +778,7 @@ async def get_missions(tid: int = 0, credential: Union[Credential, None] = None) params = {"tid": tid} - return await request("GET", api["url"], params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result class VideoEditorEvents(Enum): @@ -891,9 +888,7 @@ async def _fetch_configs(self): try: api = _API["upload_args"] params = {"bvid": self.bvid} - self.__old_configs = await request( - "GET", api["url"], params=params, credential=self.credential - ) + self.__old_configs = await Api(**api, credential=self.credential).update_params(**params).result except Exception as e: self.dispatch(VideoEditorEvents.PRELOAD_FAILED.value, {"err", e}) raise e @@ -931,19 +926,17 @@ async def _submit(self): datas["csrf"] = self.credential.bili_jct self.dispatch(VideoEditorEvents.PRE_SUBMIT.value) try: - resp = await request( - "POST", - api["url"], - params={"csrf": self.credential.bili_jct, "t": int(time.time())}, - data=json.dumps(datas), - headers={ - "content-type": "application/json;charset=UTF-8", - "referer": "https://member.bilibili.com", - "user-agent": "Mozilla/5.0", - }, - credential=self.credential, - no_csrf=True, - ) + params={"csrf": self.credential.bili_jct, "t": int(time.time())}, + data=json.dumps(datas), + headers={ + "content-type": "application/json;charset=UTF-8", + "referer": "https://member.bilibili.com", + "user-agent": "Mozilla/5.0", + } + resp = await Api(**api, credential=self.credential, no_csrf=True + ).update_params(**params + ).update_data(**data + ).update_headers(**headers).result self.dispatch(VideoEditorEvents.AFTER_SUBMIT.value, resp) except Exception as e: self.dispatch(VideoEditorEvents.SUBMIT_FAILED.value, {"err", e}) diff --git a/bilibili_api/video_zone.py b/bilibili_api/video_zone.py index 3b8173b8..266aa479 100644 --- a/bilibili_api/video_zone.py +++ b/bilibili_api/video_zone.py @@ -13,7 +13,7 @@ from .utils.utils import get_api from .exceptions import ArgsException from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("video_zone") @@ -97,9 +97,9 @@ async def get_zone_top10( if day not in (3, 7): raise ArgsException("参数 day 只能是 3,7。") - url = API["ranking"]["get_top10"]["url"] + api = API["ranking"]["get_top10"] params = {"rid": tid, "day": day} - return await request("GET", url, params=params, credential=credential) + return await Api(**api, credential=credential).update_params(**params).result def get_zone_list() -> List[Dict]: @@ -155,7 +155,7 @@ async def get_zone_videos_count_today( """ credential = credential if credential else Credential() api = API["count"] - return (await request("GET", api["url"], credential=credential))["region_count"] + return (await Api(**api, credential=credential).result)["region_count"] async def get_zone_new_videos(tid: int, page_num: int = 1, page_size: int = 10) -> dict: @@ -174,7 +174,7 @@ async def get_zone_new_videos(tid: int, page_num: int = 1, page_size: int = 10) """ api = API["new"] params = {"rid": tid, "pn": page_num, "ps": page_size} - return await request("GET", api["url"], params=params) + return await Api(**api).update_params(**params).result async def get_zone_hot_tags(tid: int) -> List[dict]: @@ -190,7 +190,7 @@ async def get_zone_hot_tags(tid: int) -> List[dict]: api = API["get_hot_tags"] params = {"rid": tid} - return (await request("GET", api["url"], params=params))[0] + return (await Api(**api).update_params(**params).result)[0] class VideoZoneTypes(enum.Enum): diff --git a/bilibili_api/vote.py b/bilibili_api/vote.py index 4c19f890..df631cfc 100644 --- a/bilibili_api/vote.py +++ b/bilibili_api/vote.py @@ -11,7 +11,7 @@ from .utils.utils import get_api from .utils.picture import Picture from .utils.credential import Credential -from .utils.network_httpx import request +from .utils.network_httpx import Api API = get_api("vote") @@ -110,7 +110,7 @@ async def get_info(self) -> dict: """ api = API["info"]["vote_info"] params = {"vote_id": self.get_vote_id()} - info = await request("GET", api["url"], params=params) + info = await Api(**api).update_params(**params).result self.title = info["info"]["title"] # 为 dynmaic.BuildDnamic.add_vote 缓存 title return info @@ -170,7 +170,7 @@ async def update_vote( data.update(choices.get_choices()) if choice_cnt > len(choices.choices): raise ValueError("choice_cnt 大于 choices 选项数") - return await request("POST", api["url"], data=data, credential=self.credential) + return await Api(**api, credential=self.credential).update_data(**data).result async def create_vote( @@ -214,7 +214,7 @@ async def create_vote( data.update(choices.get_choices()) if choice_cnt > len(choices.choices): raise ValueError("choice_cnt 大于 choices 选项数") - vote_id = (await request("POST", api["url"], data=data, credential=credential))[ + vote_id = (await Api(**api, credential=credential).update_data(**data).result)[ "vote_id" ] return Vote(vote_id=vote_id, credential=credential) From c96e4d0f447010ee9709fe4fdec4103bd736b2e4 Mon Sep 17 00:00:00 2001 From: z0z0r4 Date: Tue, 25 Jul 2023 13:39:57 +0800 Subject: [PATCH 2/7] docs: coding example --- .github/CODING.md | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/.github/CODING.md b/.github/CODING.md index 46753d90..c4b76c77 100644 --- a/.github/CODING.md +++ b/.github/CODING.md @@ -8,9 +8,11 @@ **入门示例:我要贡献一个 API !** -首先你需要写入你的 API,找到 `bilibili_api/data/api` 目录,会有许多的 `json` 文件,你需要找到对应的 `json` 文件介入你的 API。举个例子:你的 API 如果和用户有关,请写入 `user.json` 文件中。
+首先你需要写入你的 API,找到 `bilibili_api/data/api` 目录,会有许多的 `json` 文件,你需要找到对应的 `json` 文件介入你的 API。举个例子:你的 API 如果和用户有关,请写入 `user.json` 文件中。 + 每一个 `json` 文件会根据 API 的作用大致分类,你只要找到对应的分类就可以了。一般 `json` 文件将分为两个分类:`info` (有关获取信息的 API) 和 `operate` (有关操作用户相关信息的 API)。当然有的时候部分 API 也会被归类到另外一个分类,如 `video.json` 中有一个分类就存放着有关弹幕的 API (`danmaku`)。除非有大量与某个东西相关的 API (如视频 API 有许多是和弹幕有关的),否则千万不要创建在 `info` 和 `operate` 以外的新的分类。
-~~当然有的文件因为懒什么分类都没有弄,在 API 非常少的时候你可以这么做,但是不推荐。~~

+~~当然有的文件因为懒什么分类都没有弄,在 API 非常少的时候你可以这么做,但是不推荐。~~ + 然后你就可以进行编写了。首先找到对应的文件 (如和视频相关的 API 的具体实现要写在 `video.py` 中),然后 (在一个类里面 ( 有的时候不用写在一个类里面 )) 新建一个异步函数,一定要记得完善参数类型和返回值类型。( 建议让你的 IDE 打开检查 `typing` 的模式,就例如 `Visual Studio Code` 里面将 `python.analysis.typeCheckingMode` 设置为 `basic` 或 `strict`)。接着你需要编写注释,像下面那样子编写: ``` python @@ -27,7 +29,11 @@ async def get_user_real_name(self, uid: int, credential: Union[Credential, None] """ ``` -首先你要写上函数的用途,然后要写好参数的说明:名称 + 类型 + 用途。其中类型如果是多个的话,那么可以用 `|` 分隔而不是用 `Union` (写代码的时候务必要用 `Union`,需要支持 `Python3.8`),如果你的 API 需要登录的话,你要加上 `credential` 参数,类型是 `Credential | None`,描述可以用 `凭据类。`。(凭据类能传入 cookies 以保证能正常访问需要登录的 API,这里就做到了登录的作用 ) 最后要把返回值写好,一般情况下 API 返回的结果类型都是 `dict`,这个时候你的返回值说明就可以用 `调用 API 返回的结果`。
+首先你要写上函数的用途,然后要写好参数的说明:名称 + 类型 + 用途。其中类型如果是多个的话,那么写注释时可以用 `|` 分隔而不是用 `Union`,但写代码的时候务必要用 `Union`,需要支持 `Python3.8`。 + +如果你的 API 需要登录的话,你要加上 `credential` 参数,类型是 `Credential | None`,描述可以用 `凭据类。`。(凭据类能传入 cookies 以保证能正常访问需要登录的 API,这里就做到了登录的作用 ) + +最后要把返回值写好,一般情况下 API 返回的结果类型都是 `dict`,这个时候你的返回值说明就可以用 `调用 API 返回的结果`。
然后就是函数的主体了,你可以按照下面的写法来写: ``` python @@ -43,11 +49,19 @@ async def ...(...) -> dict: return await Api(**api, credential=credential).update_params(**params).result ``` -首先如果函数要传入凭据类,那么你要添加 `credential = credential if credential else Credential()` 以确保 `credential` 参数不会是 `None` 类型,~~当然不这么做也不会报错,但是你好歹要走个形式啊!~~。接着我们声明 `api` 变量,它是字典 `API` 的一部分,这里的字典 `API` 就是你写入 API 的那个 `json` 文件的内容。所以你的 API 也在里面,你只需要补充好字典的键值就可以了。接着就是可选的 `params` 或 `data`,如果你的 API 需要传入参数的话不要忘记创建它们。最后你只需要返回已经封装好了的函数 `request` 得到的结果就可以了。`request` 函数的第一个参数是访问 `API` 的方法,一般是 `GET`/`POST`/`PUT`/`DELETE`/`PATCH`,第二个参数是 `API` 的链接,你只需要填入 `api["url"]` 就可以了 ( 前提是你的键值没有输错 ),下面的参数最好要指定名称传参,最后不要忘记了:如果这个接口需要登录,那么你得要把凭据类传入进去!( 如果你的函数是在一个类里面,通常每一个类都有一个属性 `credential`,就是创建这个类的时候会传入的,这个时候你只需要传入 `self.credential` 就可以了。当然参数里面不用再写 `credential` 参数了!! )

+1. 首先如果函数要传入凭据类,那么你应该创建变量 `credential = credential if credential else Credential()` 以确保 `credential` 参数不会是 `None` 类型,~~当然不这么做也不会报错,但是你好歹要走个形式啊!~~。 + +2. 接着我们声明 `api` 变量,它是字典 `API` 的一部分,这里的字典 `API` 就是你写入 API 的那个 `json` 文件的内容。 +所以你的 API 也在里面,你只需要补充好字典的键值就可以了。接着就是可选的 `params` 或 `data`,如果你的 API 需要传入参数的话不要忘记传入它们。 + +3. 最后你只需要返回已经封装好了的函数 `Api` 得到的结果就可以了。`Api` 函数的第一个参数是 `**api`,通常里面包括 HTTP 方法、URL 等信息,`params`/`data`/`headers`/`files`参数应该通过 `Api().update()`/`Api().update_headers()` 等传入。 + +4. 不要忘记了:如果这个接口需要登录,那么你得把凭据类传入进去!( 如果你的函数是在一个类里面,通常每一个类都有一个属性 `credential`,就是创建这个类的时候会传入的,这个时候你只需要传入 `self.credential` 就可以了。当然参数里面不用再写 `credential` 参数了!! )

+ 恭喜你完成了代码的编写!你可以先进行一次新功能的提交: ``` bash -$ git commit -am "feat(user.User): 新增一个狗都不用的接口" +$ git commit -am "feat(user.User): 新增一个 ### 的接口" ``` 然后你还需要干两件事情:文档 & 测试。这里不详细说明了,因为这里不会提及除了写代码以外的任何事情。SO... @@ -56,13 +70,7 @@ $ git commit -am "feat(user.User): 新增一个狗都不用的接口" 当然,除了这个指南举的简单 API 样例,你还可以学习更加高级的功能,例如新建一个模块、事件监听器、`protobuf` 数据等等,这里~~因为懒~~先不写了,你可以查看这些功能的样例进行学习。 -所以做完功能不要忘记提交到线上仓库! (**PR 记得向 `dev` 分之提交!!!**) - -
-看不见我 +所以做完功能不要忘记提交到 Github 仓库! -``` bash -$ git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev;git push origin dev; -``` +**PR 记得向 `dev` 分支提交!!! `git push origin dev`** -
From 6be3ce19ae10b4a315f22245a3e8a9f888ede19f Mon Sep 17 00:00:00 2001 From: z0z0r4 Date: Tue, 25 Jul 2023 13:42:14 +0800 Subject: [PATCH 3/7] fix: album --- bilibili_api/album.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bilibili_api/album.py b/bilibili_api/album.py index 39459581..70d42e2c 100644 --- a/bilibili_api/album.py +++ b/bilibili_api/album.py @@ -74,7 +74,6 @@ async def get_info(self) -> dict: api = API["info"]["detail"] params = {"doc_id": self.get_doc_id()} resp = await Api(**api).update_params(**params).result - resp = await Api(**api).update_params(**params).result self.__info = resp return resp From 59a515d10ba4a311ccafa2f6676ef56c026997d0 Mon Sep 17 00:00:00 2001 From: z0z0r4 Date: Tue, 25 Jul 2023 13:56:31 +0800 Subject: [PATCH 4/7] release: v15.5.2 --- CHANGELOGS/v15.md | 13 +++++++++++++ bilibili_api/__init__.py | 2 +- setup.py | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOGS/v15.md b/CHANGELOGS/v15.md index e0accefa..4d1e7e5e 100644 --- a/CHANGELOGS/v15.md +++ b/CHANGELOGS/v15.md @@ -1,3 +1,16 @@ +# 15.5.2 2023/7/25 +- fix: 修改新请求函数为 Api 方法 by @Drelf2018 in https://github.com/Nemo2011/bilibili-api/pull/364 +- fix: 尝试修复发送图片私信的问题 by @Drelf2018 in https://github.com/Nemo2011/bilibili-api/pull/367 +- fix: 修复 params 中有汉字时计算 w_rid 错误的漏洞以及弹幕用户名打码问题 by @Drelf2018 in https://github.com/Nemo2011/bilibili-api/pull/373 +- fix: update get_followings by @z0z0r4 in https://github.com/Nemo2011/bilibili-api/pull/381 +- rechore: login term and tk by @z0z0r4 in https://github.com/Nemo2011/bilibili-api/pull/383 +* fix: import by @Nemo2011 https://github.com/Nemo2011/bilibili-api/commit/dacefba0d909a5dbbc9213100267b84bc54581d5 +* style: by @Nemo2011 https://github.com/Nemo2011/bilibili-api/commit/9ca10d2bb534a216e6dabadb1fb0c5093548b11d +* feat: settings.wbi_retry_times by @Nemo2011 https://github.com/Nemo2011/bilibili-api/commit/54087564b9a68cac800664d00846abf35b3d204e +* fix: testing & login by @Nemo2011 https://github.com/Nemo2011/bilibili-api/commit/b329fe6d16022981c89ffa2bec8738ce96881afd +* fix: buvid3 by @z0z0r4 in https://github.com/Nemo2011/bilibili-api/pull/391 +* 将 `request` 换到 `Api` by @z0z0r4 https://github.com/Nemo2011/bilibili-api/pull/403 + # 15.5.1 2023/6/24 - fix: credential 刷新异步问题 (https://github.com/Nemo2011/bilibili-api/issues/351) (https://github.com/Nemo2011/bilibili-api/issues/358) diff --git a/bilibili_api/__init__.py b/bilibili_api/__init__.py index 8809f05f..4d5c3962 100644 --- a/bilibili_api/__init__.py +++ b/bilibili_api/__init__.py @@ -83,7 +83,7 @@ interactive_video, ) -BILIBILI_API_VERSION = "15.5.1.b0" +BILIBILI_API_VERSION = "15.5.2" # 如果系统为 Windows,则修改默认策略,以解决代理报错问题 if "windows" in platform.system().lower(): diff --git a/setup.py b/setup.py index 35a95617..4d54f2c4 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ setuptools.setup( name="bilibili-api-python", - version="15.5.1.b0", + version="15.5.2", license="GPLv3+", author="Nemo2011", author_email="yimoxia@outlook.com", From 3421689ec283595c8c8cf882cb2dc5aa8b94e525 Mon Sep 17 00:00:00 2001 From: z0z0r4 Date: Tue, 25 Jul 2023 15:40:21 +0800 Subject: [PATCH 5/7] fix: API_video --- bilibili_api/cheese.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/bilibili_api/cheese.py b/bilibili_api/cheese.py index ca41223b..1dd73724 100644 --- a/bilibili_api/cheese.py +++ b/bilibili_api/cheese.py @@ -637,7 +637,7 @@ async def has_liked(self): """ self.credential.raise_for_no_sessdata() - api =get_api("video")["info"]["has_liked"] + api =API_video["info"]["has_liked"] params = {"aid": self.get_aid()} return await Api(**api, credential=self.credential).update_params(**params).result == 1 @@ -650,7 +650,7 @@ async def get_pay_coins(self): """ self.credential.raise_for_no_sessdata() - api =get_api("video")["info"]["get_pay_coins"] + api =API_video["info"]["get_pay_coins"] params = {"aid": self.get_aid()} return (await Api(**api, credential=self.credential).update_params(**params).result)[ "multiply" @@ -665,7 +665,7 @@ async def has_favoured(self): """ self.credential.raise_for_no_sessdata() - api =get_api("video")["info"]["has_favoured"] + api =API_video["info"]["has_favoured"] params = {"aid": self.get_aid()} return (await Api(**api, credential=self.credential).update_params(**params).result)[ "favoured" @@ -684,7 +684,7 @@ async def like(self, status: bool = True): self.credential.raise_for_no_sessdata() self.credential.raise_for_no_bili_jct() - api = get_api("video")["operate"]["like"] + api = API_video["operate"]["like"] data = {"aid": self.get_aid(), "like": 1 if status else 2} return await Api(**api, credential=self.credential).update_data(data).result @@ -706,7 +706,7 @@ async def pay_coin(self, num: int = 1, like: bool = False): if num not in (1, 2): raise ArgsException("投币数量只能是 1 ~ 2 个。") - api = get_api("video")["operate"]["coin"] + api = API_video["operate"]["coin"] data = { "aid": self.get_aid(), "multiply": num, @@ -734,7 +734,7 @@ async def set_favorite( self.credential.raise_for_no_sessdata() self.credential.raise_for_no_bili_jct() - api = get_api("video")["operate"]["favorite"] + api = API_video["operate"]["favorite"] data = { "rid": self.get_aid(), "type": 2, From 073a4f790d2a9c6c0fa3fbb331dc9fb67bd0f051 Mon Sep 17 00:00:00 2001 From: z0z0r4 Date: Tue, 25 Jul 2023 15:44:19 +0800 Subject: [PATCH 6/7] fix: request(files=files) --- bilibili_api/dynamic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bilibili_api/dynamic.py b/bilibili_api/dynamic.py index ab443f4e..39330da8 100644 --- a/bilibili_api/dynamic.py +++ b/bilibili_api/dynamic.py @@ -201,7 +201,7 @@ async def upload_image(image: Picture, credential: Credential, data: dict = None data = {"biz": "new_dyn", "category": "daily"} files={"file_up": raw} - return_info = await Api(**api, credential=credential).update_data(**data).update_files(**files).result + return_info = await Api(**api, credential=credential).update_data(**data).request(files=files) return return_info From 89b8d087b60f264308c6286e815cb38bf1cff1ed Mon Sep 17 00:00:00 2001 From: z0z0r4 Date: Tue, 25 Jul 2023 15:45:17 +0800 Subject: [PATCH 7/7] docs: add rechore flag --- CHANGELOGS/v15.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOGS/v15.md b/CHANGELOGS/v15.md index 4d1e7e5e..3e70b635 100644 --- a/CHANGELOGS/v15.md +++ b/CHANGELOGS/v15.md @@ -9,7 +9,7 @@ * feat: settings.wbi_retry_times by @Nemo2011 https://github.com/Nemo2011/bilibili-api/commit/54087564b9a68cac800664d00846abf35b3d204e * fix: testing & login by @Nemo2011 https://github.com/Nemo2011/bilibili-api/commit/b329fe6d16022981c89ffa2bec8738ce96881afd * fix: buvid3 by @z0z0r4 in https://github.com/Nemo2011/bilibili-api/pull/391 -* 将 `request` 换到 `Api` by @z0z0r4 https://github.com/Nemo2011/bilibili-api/pull/403 +* rechore: 将 `request` 换到 `Api` by @z0z0r4 https://github.com/Nemo2011/bilibili-api/pull/403 # 15.5.1 2023/6/24