From a8d632ffa358018f735f4e11bc39968bb43f2a85 Mon Sep 17 00:00:00 2001 From: UKM Date: Tue, 23 May 2023 00:05:50 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9E=20=E6=9B=B4=E6=8D=A2=E8=8E=B7?= =?UTF-8?q?=E5=8F=96B=E7=AB=99=E7=94=A8=E6=88=B7=E5=90=8D=E7=9A=84api=20(#?= =?UTF-8?q?261)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🐞 fix(platform-bilibili): 更改获取b站用户名的api 原先的api又用不了,换了一个api * 🧪 test(tests/bilibili): 添加了部分B站的单元测试 1.修正番剧链接识别正则表达式出错 2.添加了直播和番剧的解析目标的单元测试 --- nonebot_bison/platform/bilibili.py | 10 +- .../static/bilibili_arknights_profile.json | 2 +- tests/platforms/test_bilibili_bangumi.py | 17 ++ tests/test_config_manager_add.py | 180 +++++++++++++++++- 4 files changed, 202 insertions(+), 7 deletions(-) diff --git a/nonebot_bison/platform/bilibili.py b/nonebot_bison/platform/bilibili.py index e29cf6a..bfe78dc 100644 --- a/nonebot_bison/platform/bilibili.py +++ b/nonebot_bison/platform/bilibili.py @@ -73,13 +73,13 @@ class Bilibili(NewMessage): cls, client: AsyncClient, target: Target ) -> Optional[str]: res = await client.get( - "https://api.bilibili.com/x/space/wbi/acc/info", params={"mid": target} + "https://api.bilibili.com/x/web-interface/card", params={"mid": target} ) res.raise_for_status() res_data = res.json() if res_data["code"]: return None - return res_data["data"]["name"] + return res_data["data"]["card"]["name"] @classmethod async def parse_target(cls, target_text: str) -> Target: @@ -290,12 +290,12 @@ class Bilibililive(StatusChange): cls, client: AsyncClient, target: Target ) -> Optional[str]: res = await client.get( - "https://api.bilibili.com/x/space/wbi/acc/info", params={"mid": target} + "https://api.bilibili.com/x/web-interface/card", params={"mid": target} ) res_data = json.loads(res.text) if res_data["code"]: return None - return res_data["data"]["name"] + return res_data["data"]["card"]["name"] async def get_status(self, target: Target) -> Info: params = {"uids[]": target} @@ -389,7 +389,7 @@ class BilibiliBangumi(StatusChange): elif m := re.match(r"md(\d+)", target_string): return Target(m.group(1)) elif m := re.match( - r"(?:https?://)?www\.bilibili\.com/bangumi/media/md(\d+)/", target_string + r"(?:https?://)?www\.bilibili\.com/bangumi/media/md(\d+)", target_string ): return Target(m.group(1)) raise cls.ParseTargetException() diff --git a/tests/platforms/static/bilibili_arknights_profile.json b/tests/platforms/static/bilibili_arknights_profile.json index 6e46b23..3da4b9c 100644 --- a/tests/platforms/static/bilibili_arknights_profile.json +++ b/tests/platforms/static/bilibili_arknights_profile.json @@ -1 +1 @@ -{"code":0,"message":"0","ttl":1,"data":{"mid":161775300,"name":"明日方舟","sex":"保密","face":"http://i0.hdslb.com/bfs/face/89154378c06a5ed332c40c2ca56f50cd641c0c90.jpg","face_nft":0,"sign":"重铸未来 方舟启航","rank":10000,"level":6,"jointime":0,"moral":0,"silence":0,"coins":0,"fans_badge":true,"fans_medal":{"show":false,"wear":false,"medal":null},"official":{"role":3,"title":"明日方舟官方账号","desc":"","type":1},"vip":{"type":2,"status":1,"due_date":1648828800000,"vip_pay_type":0,"theme_type":0,"label":{"path":"","text":"年度大会员","label_theme":"annual_vip","text_color":"#FFFFFF","bg_style":1,"bg_color":"#FB7299","border_color":""},"avatar_subscript":1,"nickname_color":"#FB7299","role":3,"avatar_subscript_url":"http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png"},"pendant":{"pid":5305,"name":"明日方舟音律系列","image":"http://i0.hdslb.com/bfs/garb/item/615a1653281141ddf64cbb98c792ddaee78f7f40.png","expire":0,"image_enhance":"http://i0.hdslb.com/bfs/garb/item/516ecdf2d495a62f1bac31497c831b711823140c.webp","image_enhance_frame":"http://i0.hdslb.com/bfs/garb/item/c0751afbf950373c260254d02768eabf30ff3906.png"},"nameplate":{"nid":0,"name":"","image":"","image_small":"","level":"","condition":""},"user_honour_info":{"mid":0,"colour":null,"tags":[]},"is_followed":true,"top_photo":"http://i1.hdslb.com/bfs/space/6c6084808ec5bdff1985acc05ce0e126c49ad76e.png","theme":{},"sys_notice":{},"live_room":{"roomStatus":1,"liveStatus":0,"url":"https://live.bilibili.com/5555734?broadcast_type=0\u0026is_room_feed=1","title":"《明日方舟》2022新春前瞻特辑","cover":"http://i0.hdslb.com/bfs/live/new_room_cover/79af83a27f6001c1acfb47d1c0b879290f7c3308.jpg","roomid":5555734,"roundStatus":1,"broadcast_type":0,"watched_show":{"switch":true,"num":13033,"text_small":"1.3万","text_large":"1.3万人看过","icon":"https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png","icon_location":"","icon_web":"https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png"}},"birthday":"","school":null,"profession":{"name":"","department":"","title":"","is_show":0},"tags":null,"series":{"user_upgrade_status":3,"show_upgrade_window":false},"is_senior_member":0}} +{"code":0,"message":"0","ttl":1,"data":{"card":{"mid":"161775300","name":"明日方舟","approve":false,"sex":"保密","rank":"10000","face":"https://i0.hdslb.com/bfs/face/d4005a0f9b898d8bb049caf9c6355f8e8f772a8f.jpg","face_nft":0,"face_nft_type":0,"DisplayRank":"0","regtime":0,"spacesta":0,"birthday":"","place":"","description":"","article":0,"attentions":[],"fans":5421712,"friend":3,"attention":3,"sign":"重铸未来 方舟启航","level_info":{"current_level":6,"current_min":0,"current_exp":0,"next_exp":0},"pendant":{"pid":1990,"name":"明日方舟","image":"https://i0.hdslb.com/bfs/garb/item/0c8e7d627a35c378b757f39419889ef1fcc0ed9b.png","expire":0,"image_enhance":"https://i0.hdslb.com/bfs/garb/item/1815c81da71069ea3db4553cad7d233f782da2f2.webp","image_enhance_frame":"https://i0.hdslb.com/bfs/garb/item/ed2b4ef1da228c0b937753542b33af8f04d1d70c.png"},"nameplate":{"nid":0,"name":"","image":"","image_small":"","level":"","condition":""},"Official":{"role":3,"title":"明日方舟官方账号","desc":"","type":1},"official_verify":{"type":1,"desc":"明日方舟官方账号"},"vip":{"type":2,"status":1,"due_date":1715097600000,"vip_pay_type":0,"theme_type":0,"label":{"path":"","text":"年度大会员","label_theme":"annual_vip","text_color":"#FFFFFF","bg_style":1,"bg_color":"#FB7299","border_color":"","use_img_label":true,"img_label_uri_hans":"","img_label_uri_hant":"","img_label_uri_hans_static":"https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png","img_label_uri_hant_static":"https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png"},"avatar_subscript":1,"nickname_color":"#FB7299","role":3,"avatar_subscript_url":"","tv_vip_status":0,"tv_vip_pay_type":0,"tv_due_date":0,"vipType":2,"vipStatus":1},"is_senior_member":0},"following":false,"archive_count":282,"article_count":0,"follower":5421712,"like_num":83977549}} diff --git a/tests/platforms/test_bilibili_bangumi.py b/tests/platforms/test_bilibili_bangumi.py index 226d98f..0077840 100644 --- a/tests/platforms/test_bilibili_bangumi.py +++ b/tests/platforms/test_bilibili_bangumi.py @@ -19,6 +19,23 @@ def bili_bangumi(app: App): return platform_manager["bilibili-bangumi"](ProcessContext(), AsyncClient()) +async def test_parse_target(bili_bangumi: "BilibiliBangumi"): + from nonebot_bison.platform.platform import Platform + + res1 = await bili_bangumi.parse_target("28339726") + assert res1 == "28339726" + res2 = await bili_bangumi.parse_target("md28339726") + assert res2 == "28339726" + res3 = await bili_bangumi.parse_target( + "https://www.bilibili.com/bangumi/media/md28339726" + ) + assert res3 == "28339726" + with pytest.raises(Platform.ParseTargetException): + await bili_bangumi.parse_target( + "https://www.bilibili.com/bangumi/play/ep683045" + ) + + @pytest.mark.asyncio @respx.mock async def test_fetch_bilibili_bangumi_status( diff --git a/tests/test_config_manager_add.py b/tests/test_config_manager_add.py index 59e684d..2707d0f 100644 --- a/tests/test_config_manager_add.py +++ b/tests/test_config_manager_add.py @@ -423,7 +423,7 @@ async def test_add_with_bilibili_target_parser(app: App, init_scheduler): from nonebot_bison.platform.bilibili import Bilibili ak_list_router = respx.get( - "https://api.bilibili.com/x/space/wbi/acc/info?mid=161775300" + "https://api.bilibili.com/x/web-interface/card?mid=161775300" ) ak_list_router.mock( return_value=Response(200, json=get_json("bilibili_arknights_profile.json")) @@ -532,3 +532,181 @@ async def test_add_with_bilibili_target_parser(app: App, init_scheduler): assert sub.categories == [platform_manager["bilibili"].reverse_category["视频"]] assert sub.target.platform_name == "bilibili" assert sub.target.target_name == "明日方舟" + + +@pytest.mark.asyncio +@respx.mock +async def test_add_with_bilibili_live_target_parser(app: App, init_scheduler): + from nonebot.adapters.onebot.v11.event import Sender + from nonebot.adapters.onebot.v11.message import Message + + from nonebot_bison.config import config + from nonebot_bison.config_manager import add_sub_matcher, common_platform + from nonebot_bison.platform import platform_manager + from nonebot_bison.platform.bilibili import Bilibililive + + ak_list_router = respx.get( + "https://api.bilibili.com/x/web-interface/card?mid=161775300" + ) + ak_list_router.mock( + return_value=Response(200, json=get_json("bilibili_arknights_profile.json")) + ) + + bilibili_main_page_router = respx.get("https://www.bilibili.com/") + bilibili_main_page_router.mock(return_value=Response(200)) + + async with app.test_matcher(add_sub_matcher) as ctx: + bot = ctx.create_bot() + event_1 = fake_group_message_event( + message=Message("添加订阅"), + sender=Sender(card="", nickname="test", role="admin"), + to_me=True, + ) + ctx.receive_event(bot, event_1) + ctx.should_pass_rule() + ctx.should_call_send( + event_1, + Message( + BotReply.add_reply_on_platform( + platform_manager=platform_manager, common_platform=common_platform + ) + ), + True, + ) + event_2 = fake_group_message_event( + message=Message("全部"), sender=Sender(card="", nickname="test", role="admin") + ) + ctx.receive_event(bot, event_2) + ctx.should_rejected() + ctx.should_call_send( + event_2, + BotReply.add_reply_on_platform_input_allplatform(platform_manager), + True, + ) + event_3 = fake_group_message_event( + message=Message("bilibili-live"), sender=fake_admin_user + ) + ctx.receive_event(bot, event_3) + ctx.should_call_send( + event_3, + Message(BotReply.add_reply_on_id(Bilibililive)), + True, + ) + + event_4_ok = fake_group_message_event( + message=Message("161775300"), + sender=fake_admin_user, + ) + ctx.receive_event(bot, event_4_ok) + ctx.should_call_send( + event_4_ok, + BotReply.add_reply_on_target_confirm("bilibili-live", "明日方舟", "161775300"), + True, + ) + ctx.should_call_send( + event_4_ok, + Message(BotReply.add_reply_on_cats(platform_manager, "bilibili-live")), + True, + ) + event_5_ok = fake_group_message_event( + message=Message("开播提醒"), sender=fake_admin_user + ) + ctx.receive_event(bot, event_5_ok) + ctx.should_call_send( + event_5_ok, BotReply.add_reply_subscribe_success("明日方舟"), True + ) + ctx.should_finished() + subs = await config.list_subscribe(10000, "group") + assert len(subs) == 1 + sub = subs[0] + assert sub.target.target == "161775300" + assert sub.tags == [] + assert sub.categories == [ + platform_manager["bilibili-live"].reverse_category["开播提醒"] + ] + assert sub.target.platform_name == "bilibili-live" + assert sub.target.target_name == "明日方舟" + + +@pytest.mark.asyncio +@respx.mock +async def test_add_with_bilibili_bangumi_target_parser(app: App, init_scheduler): + from nonebot.adapters.onebot.v11.event import Sender + from nonebot.adapters.onebot.v11.message import Message + + from nonebot_bison.config import config + from nonebot_bison.config_manager import add_sub_matcher, common_platform + from nonebot_bison.platform import platform_manager + from nonebot_bison.platform.bilibili import BilibiliBangumi + + ak_list_router = respx.get( + "https://api.bilibili.com/pgc/review/user?media_id=28235413" + ) + ak_list_router.mock( + return_value=Response(200, json=get_json("bilibili-gangumi-hanhua1.json")) + ) + + bilibili_main_page_router = respx.get("https://www.bilibili.com/") + bilibili_main_page_router.mock(return_value=Response(200)) + + async with app.test_matcher(add_sub_matcher) as ctx: + bot = ctx.create_bot() + event_1 = fake_group_message_event( + message=Message("添加订阅"), + sender=Sender(card="", nickname="test", role="admin"), + to_me=True, + ) + ctx.receive_event(bot, event_1) + ctx.should_pass_rule() + ctx.should_call_send( + event_1, + Message( + BotReply.add_reply_on_platform( + platform_manager=platform_manager, common_platform=common_platform + ) + ), + True, + ) + event_2 = fake_group_message_event( + message=Message("全部"), sender=Sender(card="", nickname="test", role="admin") + ) + ctx.receive_event(bot, event_2) + ctx.should_rejected() + ctx.should_call_send( + event_2, + BotReply.add_reply_on_platform_input_allplatform(platform_manager), + True, + ) + event_3 = fake_group_message_event( + message=Message("bilibili-bangumi"), sender=fake_admin_user + ) + ctx.receive_event(bot, event_3) + ctx.should_call_send( + event_3, + Message(BotReply.add_reply_on_id(BilibiliBangumi)), + True, + ) + + event_4_ok = fake_group_message_event( + message=Message("md28235413"), + sender=fake_admin_user, + ) + ctx.receive_event(bot, event_4_ok) + ctx.should_call_send( + event_4_ok, + BotReply.add_reply_on_target_confirm( + "bilibili-bangumi", "汉化日记 第三季", "28235413" + ), + True, + ) + ctx.should_call_send( + event_4_ok, BotReply.add_reply_subscribe_success("汉化日记 第三季"), True + ) + ctx.should_finished() + subs = await config.list_subscribe(10000, "group") + assert len(subs) == 1 + sub = subs[0] + assert sub.target.target == "28235413" + assert sub.tags == [] + assert sub.target.platform_name == "bilibili-bangumi" + assert sub.target.target_name == "汉化日记 第三季"