🐞 更换获取B站用户名的api (#261)

* 🐞 fix(platform-bilibili): 更改获取b站用户名的api

原先的api又用不了,换了一个api

* 🧪 test(tests/bilibili): 添加了部分B站的单元测试

1.修正番剧链接识别正则表达式出错
2.添加了直播和番剧的解析目标的单元测试
This commit is contained in:
UKM 2023-05-23 00:05:50 +08:00 committed by GitHub
parent 9e9805557d
commit a8d632ffa3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 202 additions and 7 deletions

View File

@ -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()

View File

@ -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}}

View File

@ -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(

View File

@ -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 == "汉化日记 第三季"