Skip to content

Commit 9db8449

Browse files
committed
feat(bilibili): dynamic and live debug command
1 parent 9a868ba commit 9db8449

File tree

3 files changed

+64
-18
lines changed

3 files changed

+64
-18
lines changed

src/plugins/bilibili/plugins/_utils.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import re
22
import string
33
from random import choices
4-
from typing import Any
4+
from typing import Any, NoReturn
55

66
from httpx import AsyncClient, Response
7+
from nonebot import logger
8+
from nonebot_plugin_alconna import UniMessage
79

810

911
def bv2av(bvid: str) -> int:
@@ -83,3 +85,9 @@ async def get_share_placard(
8385
},
8486
)
8587
)
88+
89+
90+
async def handle_error(message: str) -> NoReturn:
91+
logger.error(message)
92+
await UniMessage(message).send()
93+
raise

src/plugins/bilibili/plugins/dynamic/__init__.py

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import backoff
88
from arclet.alconna import Arg
99
from httpx import AsyncClient
10-
from nonebot import get_driver, get_plugin_config, logger
10+
from nonebot import get_driver, get_plugin_config
1111
from nonebot.plugin import PluginMetadata
1212
from nonebot_plugin_alconna import Alconna, Image, UniMessage, on_alconna
1313
from nonebot_plugin_apscheduler import scheduler
@@ -20,7 +20,7 @@
2020

2121
from .....utils import ADMIN, run_task, send_message
2222
from ... import plugin_config as bilibili_config
23-
from .._utils import get_share_click, raise_for_status
23+
from .._utils import get_share_click, handle_error, raise_for_status
2424
from .config import Config
2525
from .models import Dynamic, Dynamics, Subscription
2626

@@ -168,9 +168,9 @@ async def broadcast(dynamic: Dynamic):
168168

169169

170170
@backoff.on_exception(backoff.constant, TimeoutError, max_tries=3)
171-
async def render_screenshot(dynamic: Dynamic) -> bytes:
171+
async def render_screenshot(id_str: str) -> bytes:
172172
async with get_new_page() as page:
173-
await page.goto(f"https://t.bilibili.com/{dynamic['id_str']}")
173+
await page.goto(f"https://t.bilibili.com/{id_str}")
174174
await page.wait_for_load_state("networkidle")
175175

176176
if "opus" in page.url:
@@ -222,9 +222,7 @@ async def _(db: async_scoped_session, sess: EventSession, uid: str):
222222
] not in {1, 2, 6}:
223223
await modify_relation(uid, 1)
224224
except Exception:
225-
logger.error("订阅B站动态失败")
226-
await UniMessage("订阅B站动态失败").send()
227-
raise
225+
await handle_error("订阅B站动态失败")
228226

229227
sub = Subscription(uid=int(uid), session_id=await get_session_persist_id(sess))
230228
if sub in dynamic_subs[uid]:
@@ -258,7 +256,7 @@ async def _(db: async_scoped_session, sess: EventSession, uid: str):
258256
] in {1, 2, 6}:
259257
await modify_relation(uid, 2)
260258
except Exception:
261-
logger.error("取消关注失败")
259+
await handle_error("取消关注失败")
262260

263261
await UniMessage(f"成功取订 UID:{uid} 的动态").send()
264262

@@ -287,3 +285,25 @@ async def _(db: async_scoped_session, sess: EventSession):
287285
await UniMessage(
288286
"已订阅动态:\n" + "\n".join(f"UID:{sub.uid}" for sub in subs)
289287
).send()
288+
289+
290+
@on_alconna(Alconna("展示B站动态", Arg("id_str", r"re:\d+")), permission=ADMIN).handle()
291+
async def _(id_str: str):
292+
try:
293+
dynamic = raise_for_status(
294+
await client.get("/polymer/web-dynamic/v1/detail", params={"id": id_str})
295+
)["item"]
296+
except Exception:
297+
await handle_error("获取动态信息失败")
298+
299+
screenshot, url = await gather(
300+
render_screenshot(id_str),
301+
get_share_click(id_str, "dynamic", "dt.dt-detail.0.0.pv"),
302+
)
303+
await plugin_config.template.format(
304+
name=dynamic["modules"]["module_author"]["name"],
305+
action=dynamic["modules"]["module_author"]["pub_action"]
306+
or plugin_config.types[dynamic["type"]],
307+
screenshot=Image(raw=screenshot),
308+
url=url,
309+
).send()

src/plugins/bilibili/plugins/live/__init__.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@
55

66
from arclet.alconna import Arg
77
from httpx import AsyncClient
8-
from nonebot import get_driver, get_plugin_config, logger
8+
from nonebot import get_driver, get_plugin_config
99
from nonebot.plugin import PluginMetadata
10-
from nonebot_plugin_alconna import Alconna, Image, UniMessage, on_alconna
10+
from nonebot_plugin_alconna import Alconna, AtAll, Image, UniMessage, on_alconna
1111
from nonebot_plugin_apscheduler import scheduler
1212
from nonebot_plugin_orm import async_scoped_session, get_session
1313
from nonebot_plugin_session import EventSession
1414
from nonebot_plugin_session_orm import get_session_persist_id
1515
from sqlalchemy import select
1616

1717
from .....utils import ADMIN, run_task, send_message
18-
from .._utils import get_share_click, raise_for_status
18+
from .._utils import get_share_click, handle_error, raise_for_status
1919
from .config import Config
2020
from .models import RoomInfo, Subscription
2121

@@ -106,9 +106,7 @@ async def broadcast(uids: list[str]) -> None:
106106
send_message(
107107
sub.session.session,
108108
plugin_config.live_template.format(
109-
url=url,
110-
cover=cover,
111-
**info,
109+
url=url, cover=cover, **info
112110
),
113111
)
114112
)
@@ -139,9 +137,7 @@ async def _(db: async_scoped_session, sess: EventSession, uid: str):
139137
await client.post(GET_ROOM_STATUS_INFO_URL, json={"uids": [uid]})
140138
)
141139
except Exception:
142-
logger.error("获取直播间信息失败")
143-
await UniMessage("获取直播间信息失败").send()
144-
raise
140+
await handle_error("获取直播间信息失败")
145141

146142
try:
147143
info = infos[uid]
@@ -194,3 +190,25 @@ async def _(db: async_scoped_session, sess: EventSession):
194190
"{uname} (UID:{uid})".format_map(room_infos[str(sub.uid)]) for sub in subs
195191
)
196192
).send()
193+
194+
195+
@on_alconna(
196+
Alconna("展示B站直播", Arg("uid", r"re:(?:UID:)?\d+")), permission=ADMIN
197+
).handle()
198+
async def _(uid: str):
199+
try:
200+
info = raise_for_status(
201+
await client.post(GET_ROOM_STATUS_INFO_URL, json={"uids": [uid]})
202+
)[uid]
203+
except Exception:
204+
await handle_error("获取直播间信息失败")
205+
206+
url = await get_share_click(
207+
info["room_id"], "vertical-three-point", "live.live-room-detail.0.0.pv"
208+
)
209+
cover = Image(
210+
raw=(await client.get(info["cover_from_user"] or info["face"])).content
211+
)
212+
await plugin_config.live_template.format(url=url, cover=cover, **info).exclude(
213+
AtAll
214+
).send()

0 commit comments

Comments
 (0)