Commit 5e540a2
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)}