mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 06:12:53 +08:00
update bilibili_sub
This commit is contained in:
parent
4c5302bd4c
commit
d6110e3c6f
@ -250,6 +250,7 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__
|
|||||||
* 修复图库内图片无法被连续删除的问题 [@pull/879](https://github.com/HibiKier/zhenxun_bot/pull/879)
|
* 修复图库内图片无法被连续删除的问题 [@pull/879](https://github.com/HibiKier/zhenxun_bot/pull/879)
|
||||||
* 色图提供配置项`MAX_ONCE_NUM2FORWARD`:群聊中单次发送图片数量达到指定时使用合并转发
|
* 色图提供配置项`MAX_ONCE_NUM2FORWARD`:群聊中单次发送图片数量达到指定时使用合并转发
|
||||||
* 优化修复了商品修改命令
|
* 优化修复了商品修改命令
|
||||||
|
* B站订阅UP动态改为详情页截图
|
||||||
|
|
||||||
### 2022/6/28
|
### 2022/6/28
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
from bilireq.exceptions import ResponseCodeError
|
from bilireq.exceptions import ResponseCodeError
|
||||||
|
from nonebot.adapters.onebot.v11 import MessageSegment
|
||||||
|
|
||||||
from utils.manager import resources_manager
|
from utils.manager import resources_manager
|
||||||
from asyncio.exceptions import TimeoutError
|
from asyncio.exceptions import TimeoutError
|
||||||
from .model import BilibiliSub
|
from .model import BilibiliSub
|
||||||
@ -8,7 +10,7 @@ from utils.message_builder import image
|
|||||||
from bilireq.user import get_user_info
|
from bilireq.user import get_user_info
|
||||||
from bilireq import dynamic
|
from bilireq import dynamic
|
||||||
from .utils import get_videos
|
from .utils import get_videos
|
||||||
from typing import Optional
|
from typing import Optional, Tuple
|
||||||
from configs.path_config import IMAGE_PATH
|
from configs.path_config import IMAGE_PATH
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from utils.browser import get_browser
|
from utils.browser import get_browser
|
||||||
@ -304,7 +306,7 @@ async def _get_season_status(id_) -> Optional[str]:
|
|||||||
|
|
||||||
async def get_user_dynamic(
|
async def get_user_dynamic(
|
||||||
uid: int, local_user: BilibiliSub
|
uid: int, local_user: BilibiliSub
|
||||||
) -> "Optional[MessageSegment], int":
|
) -> Tuple[Optional[MessageSegment], int]:
|
||||||
"""
|
"""
|
||||||
获取用户动态
|
获取用户动态
|
||||||
:param uid: 用户uid
|
:param uid: 用户uid
|
||||||
@ -317,14 +319,15 @@ async def get_user_dynamic(
|
|||||||
if dynamic_info.get("cards") and browser:
|
if dynamic_info.get("cards") and browser:
|
||||||
dynamic_upload_time = dynamic_info["cards"][0]["desc"]["timestamp"]
|
dynamic_upload_time = dynamic_info["cards"][0]["desc"]["timestamp"]
|
||||||
if local_user.dynamic_upload_time < dynamic_upload_time:
|
if local_user.dynamic_upload_time < dynamic_upload_time:
|
||||||
page = await browser.new_page()
|
context = await browser.new_context()
|
||||||
|
page = await context.new_page()
|
||||||
try:
|
try:
|
||||||
await page.goto(
|
await page.goto(
|
||||||
f"https://space.bilibili.com/{local_user.uid}/dynamic",
|
f"https://space.bilibili.com/{local_user.uid}/dynamic",
|
||||||
wait_until="networkidle",
|
wait_until="networkidle",
|
||||||
timeout=10000,
|
timeout=10000,
|
||||||
)
|
)
|
||||||
await page.set_viewport_size({"width": 2560, "height": 1080, "timeout": 10000*20}) # timeout: 200s
|
# await page.set_viewport_size({"width": 2560, "height": 1080, "timeout": 10000*20}) # timeout: 200s
|
||||||
# 删除置顶
|
# 删除置顶
|
||||||
await page.evaluate(
|
await page.evaluate(
|
||||||
"""
|
"""
|
||||||
@ -334,15 +337,30 @@ async def get_user_dynamic(
|
|||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
card = page.locator(".bili-dyn-list__item").first
|
async with page.expect_popup() as popup_info:
|
||||||
|
await page.locator(".bili-rich-text__content").click()
|
||||||
|
details_page = await popup_info.value
|
||||||
|
await details_page.set_viewport_size(
|
||||||
|
{"width": 2560, "height": 1080, "timeout": 10000 * 20}
|
||||||
|
)
|
||||||
|
await details_page.wait_for_selector(".panel-area")
|
||||||
|
await details_page.evaluate(
|
||||||
|
"""
|
||||||
|
xs = document.getElementById('internationalHeader');
|
||||||
|
xs.remove();
|
||||||
|
xs = document.getElementsByClassName('panel-area')
|
||||||
|
xs[0].remove();
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
card = details_page.locator(".detail-card")
|
||||||
await card.wait_for()
|
await card.wait_for()
|
||||||
# 截图并保存
|
|
||||||
await card.screenshot(
|
await card.screenshot(
|
||||||
path=dynamic_path / f"{local_user.sub_id}_{dynamic_upload_time}.jpg",
|
path=dynamic_path / f"{local_user.sub_id}_{dynamic_upload_time}.jpg",
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"B站订阅:获取用户动态 发送错误 {type(e)}:{e}")
|
logger.error(f"B站订阅:获取用户动态 发送错误 {type(e)}:{e}")
|
||||||
finally:
|
finally:
|
||||||
|
await context.close()
|
||||||
await page.close()
|
await page.close()
|
||||||
return (
|
return (
|
||||||
image(
|
image(
|
||||||
@ -351,7 +369,7 @@ async def get_user_dynamic(
|
|||||||
),
|
),
|
||||||
dynamic_upload_time,
|
dynamic_upload_time,
|
||||||
)
|
)
|
||||||
return None, None
|
return None, 0
|
||||||
|
|
||||||
|
|
||||||
class SubManager:
|
class SubManager:
|
||||||
|
|||||||
@ -10,7 +10,8 @@
|
|||||||
"poetry.lock",
|
"poetry.lock",
|
||||||
"pyproject.toml",
|
"pyproject.toml",
|
||||||
"resources/font",
|
"resources/font",
|
||||||
"bot.py"
|
"resources/image/zhenxun",
|
||||||
|
"resources/image/other"
|
||||||
],
|
],
|
||||||
"add_file": [],
|
"add_file": [],
|
||||||
"delete_file": []
|
"delete_file": []
|
||||||
|
|||||||
@ -2,14 +2,9 @@ import asyncio
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
from nonebot.log import logger
|
from nonebot.log import logger
|
||||||
from playwright.async_api import Browser, async_playwright
|
from playwright.async_api import Browser, async_playwright
|
||||||
import nonebot
|
|
||||||
from nonebot import Driver
|
|
||||||
from services.log import logger
|
from services.log import logger
|
||||||
|
|
||||||
|
|
||||||
driver: Driver = nonebot.get_driver()
|
|
||||||
|
|
||||||
|
|
||||||
_browser: Optional[Browser] = None
|
_browser: Optional[Browser] = None
|
||||||
|
|
||||||
|
|
||||||
@ -20,8 +15,8 @@ async def init(**kwargs) -> Optional[Browser]:
|
|||||||
_browser = await browser.chromium.launch(**kwargs)
|
_browser = await browser.chromium.launch(**kwargs)
|
||||||
return _browser
|
return _browser
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"启动chromium发生错误 {type(e)}:{e}")
|
# logger.warning(f"启动chromium发生错误 {type(e)}:{e}")
|
||||||
asyncio.get_event_loop().run_in_executor(None, install)
|
await asyncio.get_event_loop().run_in_executor(None, install)
|
||||||
_browser = await browser.chromium.launch(**kwargs)
|
_browser = await browser.chromium.launch(**kwargs)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ from pathlib import Path
|
|||||||
from httpx import Response
|
from httpx import Response
|
||||||
from asyncio.exceptions import TimeoutError
|
from asyncio.exceptions import TimeoutError
|
||||||
from nonebot.adapters.onebot.v11 import MessageSegment
|
from nonebot.adapters.onebot.v11 import MessageSegment
|
||||||
from playwright.async_api import Page
|
from playwright.async_api import Page, BrowserContext
|
||||||
from .message_builder import image
|
from .message_builder import image
|
||||||
from httpx import ConnectTimeout
|
from httpx import ConnectTimeout
|
||||||
from .browser import get_browser
|
from .browser import get_browser
|
||||||
@ -135,6 +135,7 @@ class AsyncHttpx:
|
|||||||
:param url: url
|
:param url: url
|
||||||
:param path: 存储路径
|
:param path: 存储路径
|
||||||
:param params: params
|
:param params: params
|
||||||
|
:param verify: verify
|
||||||
:param use_proxy: 使用代理
|
:param use_proxy: 使用代理
|
||||||
:param proxy: 指定代理
|
:param proxy: 指定代理
|
||||||
:param headers: 请求头
|
:param headers: 请求头
|
||||||
@ -297,6 +298,19 @@ class AsyncPlaywright:
|
|||||||
return await browser.new_page(user_agent=user_agent, **kwargs)
|
return await browser.new_page(user_agent=user_agent, **kwargs)
|
||||||
raise BrowserIsNone("获取Browser失败...")
|
raise BrowserIsNone("获取Browser失败...")
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
async def new_context(cls, user_agent: Optional[str] = None, **kwargs) -> BrowserContext:
|
||||||
|
"""
|
||||||
|
说明:
|
||||||
|
获取一个新上下文
|
||||||
|
参数:
|
||||||
|
:param user_agent: 请求头
|
||||||
|
"""
|
||||||
|
browser = await get_browser()
|
||||||
|
if browser:
|
||||||
|
return await browser.new_context(user_agent=user_agent, **kwargs)
|
||||||
|
raise BrowserIsNone("获取Browser失败...")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def goto(
|
async def goto(
|
||||||
cls,
|
cls,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user