From 424a4290229b1b5c4e79aa8d4c7c8fbb224f5ed3 Mon Sep 17 00:00:00 2001 From: filesite Date: Tue, 21 May 2024 07:57:22 +0800 Subject: [PATCH] bilibili livestream support --- bot/Bilibili.mjs | 41 ++++++++++++++++++++++++++++++++++++++++- test/scrap_test.mjs | 3 +++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/bot/Bilibili.mjs b/bot/Bilibili.mjs index 47bc6d4..e32f934 100644 --- a/bot/Bilibili.mjs +++ b/bot/Bilibili.mjs @@ -39,6 +39,10 @@ class Bilibili extends HeroBot { await tab.waitForLoad('DomContentLoaded', {timeoutMs: configs.heroTabOptions.timeoutMs}); await hero.waitForPaintingStable({timeoutMs: configs.heroTabOptions.timeoutMs}); + let rnd_secods = 10 + parseInt(Math.random() * 10); + console.log("Sleep %s seconds...", rnd_secods); + await common.delay(rnd_secods); + //解析网页HTML数据 data.title = await hero.document.title; //data.url = await hero.url; @@ -57,12 +61,47 @@ class Bilibili extends HeroBot { } } + //支持正在直播页面 + if (typeof(data.cover) == 'undefined' || !data.cover) { + console.log('Try to get video poster...'); + let videoElem = await hero.querySelector('.live-player-mounter video'); + let posterDiv = await videoElem.nextSibling; + if (posterDiv) { + let styleDeclaration = await posterDiv.style; + if (styleDeclaration) { + let backgroundImage = await styleDeclaration.getPropertyValue("background-image"); + //console.log('Poster element find', backgroundImage); + backgroundImage = backgroundImage.replace('url("', '').replace('")', ''); + data.cover_type = common.getImageType(backgroundImage); + data.cover_base64 = backgroundImage.replace(/^data:image\/[a-z]+;base64,/i, ''); + } + } + } + + //支持已结束直播 + if ( + (typeof(data.cover) == 'undefined' || !data.cover) + && + (typeof(data.cover_base64) == 'undefined' || !data.cover_base64) + ) { + console.log('Try to get avatar...'); + let avatarElem = await hero.querySelector('.blive-avatar-face'); + if (avatarElem) { + let styleDeclaration = await avatarElem.style; + if (styleDeclaration) { + let backgroundImage = await styleDeclaration.getPropertyValue("background-image"); + //console.log('Avatar element find', backgroundImage); + data.cover = backgroundImage.replace('url("', '').replace('")', ''); + } + } + } + //get cover image's base64 data //sample: //i1.hdslb.com/bfs/archive/ef6204c8788134064dc6b7e8cb20870f1341e604.jpg@100w_100h_1c.png //替换成://i1.hdslb.com/bfs/archive/ef6204c8788134064dc6b7e8cb20870f1341e604.jpg@480w_270h_1c.png if (typeof(data.cover) != 'undefined' && data.cover) { data.cover = common.getAbsoluteUrl(data.cover); - data.cover = data.cover.replace(/@[\w]+\./ig, '@480w_270h_1c.'); + data.cover = data.cover.replace(/@[\w]+\./ig, '@480w_270h_1c.'); //获取480x270尺寸图片 const response = await hero.goto(data.cover); const imgBuffer = await response.buffer; diff --git a/test/scrap_test.mjs b/test/scrap_test.mjs index eef5f94..e040b15 100644 --- a/test/scrap_test.mjs +++ b/test/scrap_test.mjs @@ -94,6 +94,9 @@ import getConfigs from '../config.mjs'; url = 'https://www.bilibili.com/video/BV1ep4y1J75y/?share_source=copy_web&vd_source=00bead49a4c2df31bbf3e609d7d95899'; //pc url = 'https://b23.tv/Lo0jIEt'; //mob + //正在直播页面 + url = 'https://b23.tv/EnwbTKc'; + configs.heroTabOptions.timeoutMs = 20000; //所有内容加载完成超时 configs.userAgent = configs.userAgents.mac_chrome;