Commit 5e540a2

benny-dou <60535774+benny-dou@users.noreply.github.com>
2025-08-19 16:53:01
fix(bilibili): fix bilibili opus preview
1 parent 7cbbd85
Changed files (1)
src
preview
src/preview/bilibili.py
@@ -1,19 +1,19 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
+from bilibili_api import opus
 from glom import glom
 from loguru import logger
 from pyrogram.client import Client
 from pyrogram.types import Message
 
-from config import DB, PROXY, TELEGRAM_UA, cache
-from cookies import cookie_cloud_bilibili
+from config import DB, cache
 from database.database import get_db
 from messages.database import copy_messages_from_db, save_messages
 from messages.progress import modify_progress
 from messages.sender import send2tg
 from messages.utils import summay_media
-from networking import download_file, download_media, hx_req
+from networking import download_file, download_media
 from others.emoji import emojify
 from utils import ts_to_dt
 
@@ -59,8 +59,11 @@ async def preview_bilibili(
 
     if dt := post_info["dt"]:
         msg += f"\n🕒{dt}"
+    if title := post_info["title"]:
+        msg += f"\n📝[{title}]({url})"
+
     if texts := post_info.get("texts"):
-        msg += f"\n📝[{texts}]({url})"
+        msg += f"\n{texts}"
 
     media = post_info.get("media", [])
     sent_messages = await send2tg(client, message, texts=emojify(msg.strip()), media=media, **kwargs)
@@ -70,31 +73,46 @@ async def preview_bilibili(
 
 @cache.memoize(ttl=30)
 async def parse_bilibili_opus(post_id: str, **kwargs) -> dict:  # type: ignore
-    cookie = await cookie_cloud_bilibili()
-    if not cookie:
-        return {"error_msg": "Bilibili cookie not found"}
-    url = f"https://api.bilibili.com/x/polymer/web-dynamic/v1/detail?id={post_id}"
     try:
-        response = await hx_req(url, headers={"cookie": cookie}, check_keys=["data.item.modules"], check_kv={"code": 0}, max_retry=0, timeout=3)
+        op = opus.Opus(int(post_id))
+        resp = await op.get_info()
     except Exception:
         logger.warning("Bilibili Opus API failed")
         return {"error_msg": "Bilibili Opus API failed"}
     info = {}
+    media = []
+    texts = ""
     try:
-        data = response["data"]["item"]["modules"]
-        author_name = glom(data, "module_author.name", default="")
-        author_uid = glom(data, "module_author.mid", default="")
-        info["author"] = f"**[{author_name}](https://space.bilibili.com/{author_uid})**" if author_uid else f"**{author_name}**"
+        modules = glom(resp, "item.modules", default=[])
+        if banner_module := next((module for module in modules if module.get("module_type") == "MODULE_TYPE_TOP"), None):
+            img_urls = glom(banner_module, "module_top.display.album.pics.*.url", default=[])
+            media.extend([{"photo": download_file(img_url)} for img_url in img_urls])
+
+        if title_module := next((module for module in modules if module.get("module_type") == "MODULE_TYPE_TITLE"), None):
+            info["title"] = glom(title_module, "module_title.text", default="")
 
-        timestamp = glom(data, "module_author.pub_ts", default=0)
-        info["dt"] = f"{ts_to_dt(timestamp):%Y-%m-%d %H:%M:%S}" if timestamp else ""
+        if author_module := next((module for module in modules if module.get("module_type") == "MODULE_TYPE_AUTHOR"), None):
+            author_name = glom(author_module, "module_author.name", default="B站用户")
+            author_uid = glom(author_module, "module_author.mid", default="")
+            info["author"] = f"**[{author_name}](https://space.bilibili.com/{author_uid})**" if author_uid else f"**{author_name}**"
+            timestamp = glom(author_module, "module_author.pub_ts", default=0)
+            info["dt"] = f"{ts_to_dt(timestamp):%Y-%m-%d %H:%M:%S}" if timestamp else ""
 
-        info["texts"] = glom(data, "module_dynamic.desc.text", default="")
+        if content_module := next((module for module in modules if module.get("module_type") == "MODULE_TYPE_CONTENT"), None):
+            for paragraph in glom(content_module, "module_content.paragraphs", default=[]):
+                img_urls = glom(paragraph, "pic.pics.*.url", default=[])
+                media.extend([{"photo": download_file(img_url)} for img_url in img_urls])
+                for piece in glom(paragraph, "text.nodes", default=[]):
+                    if words := glom(piece, "word.words", default=""):
+                        texts += words
+                    elif rich_text := glom(piece, "rich.text", default=""):
+                        texts += rich_text
+                texts += "\n"
 
-        images = glom(data, "module_dynamic.major.draw.items.*.src", default=[])
-        media = [{"photo": download_file(photo_url, headers={"user-agent": TELEGRAM_UA}, proxy=PROXY.WEIBO, **kwargs)} for photo_url in images]
-        await modify_progress(text=f"⏬正在下载:\n{summay_media(media)}", force_update=True, **kwargs)
+        if media:
+            await modify_progress(text=f"⏬正在下载:\n{summay_media(media)}", force_update=True, **kwargs)
         info["media"] = await download_media(media, **kwargs)
+        info["texts"] = texts.strip()
     except Exception as e:
         logger.warning(f"Bilibili Opus parse failed: {e}")
         return {"error_msg": str(e)}