From aff926a6c8325353bd952a5a64720117a537bf61 Mon Sep 17 00:00:00 2001 From: shanmite Date: Sat, 27 Apr 2024 17:14:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=E6=96=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=9B=BF=E6=8D=A2=E5=8A=A8=E6=80=81=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E8=80=81=E6=8E=A5=E5=8F=A3=20(#382)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/searcher.js | 161 +++++++++++++++++-------------------------- lib/net/api.bili.js | 2 +- lib/net/bili.js | 26 ++----- 3 files changed, 73 insertions(+), 116 deletions(-) diff --git a/lib/core/searcher.js b/lib/core/searcher.js index a487a98e12..415501029c 100644 --- a/lib/core/searcher.js +++ b/lib/core/searcher.js @@ -55,131 +55,100 @@ const { log } = utils * @property {number} type * @property {boolean} hasOfficialLottery 是否官方 * - * @param {object} dynamic_detail_card + * @param {object} ditem * @return {UsefulDynamicInfo} */ -function parseDynamicCard(dynamic_detail_card) { - const { strToJson } = utils; +function parseDynamicCard(ditem) { /**临时储存单个动态中的信息 */ let obj = {}; try { - const { desc = {}, card = "{}", extension = {}, extend_json = "{}", display = {} } = dynamic_detail_card - , { is_liked = 1, user_profile = {} } = desc || {} - , { info = {} } = user_profile || {} - , cardToJson = strToJson(card) - , extendjsonToJson = strToJson(extend_json) - , { add_on_card_info = [] } = display || {} - , { item = {} } = cardToJson; - const dy_type2chat_type = new Map([[1, 17], [2, 11], [4, 17], [8, 1], [64, 12]]); + const dy_typeenum2num = new Map([ + ["DYNAMIC_TYPE_FORWARD", 1], + ["DYNAMIC_TYPE_DRAW", 2], + ["DYNAMIC_TYPE_WORD", 4], + ["DYNAMIC_TYPE_AV", 8], + ["DYNAMIC_TYPE_ARTICLE", 64] + ]); /* 转发者的UID */ - obj.uid = desc.uid + obj.uid = ditem?.modules?.module_author?.mid || 0 /* 转发者的name */ - obj.uname = info.uname || '' + obj.uname = ditem?.modules?.module_author?.name || '' /* 动态是否点过赞 */ - obj.is_liked = is_liked > 0 + obj.is_liked = ditem?.modules?.module_stat?.like?.status || false /* 动态的ts10 */ - obj.create_time = desc.timestamp + obj.create_time = ditem?.modules?.module_author?.pub_ts || 0 /* 动态类型 */ - obj.type = desc.type + obj.type = dy_typeenum2num.get(ditem?.type) || 0 /* 用于发送评论 */ - obj.rid_str = desc.rid_str.length > 12 ? desc.dynamic_id_str : desc.rid_str; + obj.rid_str = ditem?.basic?.comment_id_str || "" /* 用于发送评论 */ - obj.chat_type = dy_type2chat_type.get(obj.type) || 0; + obj.chat_type = ditem?.basic?.comment_type || 0 /* 转发者的动态ID !!!!此为大数需使用字符串值,不然JSON.parse()会有丢失精度 */ - obj.dynamic_id = desc.dynamic_id_str; + obj.dynamic_id = ditem?.id_str || "" /* 定位@信息 */ - obj.ctrl = (extendjsonToJson.ctrl) || []; - /* 预约抽奖信息 */ - if (add_on_card_info.length > 0) { - const [status, oid_str, text] = add_on_card_info - .filter(it => typeof it.reserve_attach_card !== 'undefined' - && typeof it.reserve_attach_card.reserve_lottery !== 'undefined' - && typeof it.reserve_attach_card.reserve_button !== 'undefined') - .map(({ reserve_attach_card }) => [ - reserve_attach_card.reserve_button.status, - reserve_attach_card.oid_str, - reserve_attach_card.reserve_lottery.text])[0] || []; - if (status === 1) { - obj.reserve_id = oid_str; - obj.reserve_lottery_text = text; + obj.ctrl = []; + /* 是否有官方抽奖 */ + obj.hasOfficialLottery = false + /* 转发描述 */ + obj.description = "" + let _total_len = 0; + ditem?.modules?.module_dynamic?.desc?.rich_text_nodes.forEach(node => { + if (node.type === "RICH_TEXT_NODE_TYPE_AT") { + obj.ctrl.push({ + data: node.rid, + location: _total_len, + length: node.text.length, + type: 1 + }) } - } - if (extendjsonToJson[""]) { - let r = extendjsonToJson[""].reserve || {}; - let { reserve_id, reserve_lottery } = r; - if (reserve_lottery === 1) { - obj.reserve_id = reserve_id + ""; - obj.reserve_lottery_text = "信息丢失"; + /* 是否有官方抽奖 */ + if (node.type === "RICH_TEXT_NODE_TYPE_LOTTERY") { + obj.hasOfficialLottery = true } - } - if (extend_json.match(/"":\{"lottery/)) { + obj.description += node.orig_text + _total_len += node.text.length + }) + /* 预约抽奖信息 */ + obj.reserve_id = ditem?.modules?.module_dynamic?.additional?.reserve?.rid || 0 + obj.reserve_lottery_text = ditem?.modules?.module_dynamic?.additional?.reserve?.title || "信息丢失" + /* 充电抽奖 */ + if (ditem?.modules?.module_dynamic?.additional?.type === "ADDITIONAL_TYPE_UPOWER_LOTTERY") { obj.is_charge_lottery = true } - /* 是否有官方抽奖 */ - obj.hasOfficialLottery = extension && extension.lott && true; - /* 转发者的描述 纯文字内容 图片动态描述 后两个分别是视频动态的描述和视频本身的描述*/ - obj.description = - (item && ((item.content || '') + (item.description || ''))) - || ( - (cardToJson.dynamic || '') - + (cardToJson.desc || '') - + (cardToJson.vest && cardToJson.vest.content || '') - ) - || ''; /* 转发 */ if (obj.type === 1) { - const { origin_extension = {}, origin = "{}", origin_extend_json = "{}" } = cardToJson - , originToJson = strToJson(origin) - , { add_on_card_info = [] } = display.origin || {} - , originExtendjsonToJson = strToJson(origin_extend_json) - , { user = {}, item = {} } = originToJson; - /* 源动态的ts10 */ - obj.origin_create_time = desc.origin.timestamp; /* 被转发者的UID */ - obj.origin_uid = desc.origin.uid; + obj.origin_uid = ditem?.orig?.modules?.module_author?.mid || 0 + /* 被转发者的name */ + obj.origin_uname = ditem?.orig?.modules?.module_author?.name || '' + /* 源动态的ts10 */ + obj.origin_create_time = ditem?.orig?.modules?.module_author?.pub_ts || 0 /* 源动态类型 */ - obj.origin_type = desc.orig_type + obj.origin_type = dy_typeenum2num.get(ditem?.orig?.type) || 0 /* 被转发者的rid(用于发评论) */ - obj.origin_rid_str = desc.origin.rid_str.length > 12 ? desc.origin.dynamic_id_str : desc.origin.rid_str; + obj.origin_rid_str = ditem?.orig?.basic?.comment_id_str || "" /* 用于发送评论 */ - obj.origin_chat_type = dy_type2chat_type.get(obj.origin_type) || 0 + obj.origin_chat_type = ditem?.orig?.basic?.comment_type || 0 /* 被转发者的动态的ID !!!!此为大数需使用字符串值,不然JSON.parse()会有丢失精度 */ - obj.origin_dynamic_id = desc.orig_dy_id_str; + obj.origin_dynamic_id = ditem?.orig?.id_str || "" /* 预约抽奖信息 */ - if (add_on_card_info.length > 0) { - const [status, oid_str, text] = add_on_card_info - .filter(it => typeof it.reserve_attach_card !== 'undefined' - && typeof it.reserve_attach_card.reserve_lottery !== 'undefined' - && typeof it.reserve_attach_card.reserve_button !== 'undefined') - .map(({ reserve_attach_card }) => [ - reserve_attach_card.reserve_button.status, - reserve_attach_card.oid_str, - reserve_attach_card.reserve_lottery.text])[0] || []; - if (status === 1) { - obj.origin_reserve_id = oid_str; - obj.origin_reserve_lottery_text = text; - } - } - if (originExtendjsonToJson[""]) { - let r = originExtendjsonToJson[""].reserve || {}; - let { reserve_id, reserve_lottery } = r; - if (reserve_lottery === 1) { - obj.origin_reserve_id = reserve_id + ""; - obj.origin_reserve_lottery_text = "信息丢失"; - } - } - if (origin_extend_json.match(/"":\{"lottery/)) { + obj.origin_reserve_id = ditem?.orig?.modules?.module_dynamic?.additional?.reserve?.rid || 0 + obj.origin_reserve_lottery_text = ditem?.orig?.modules?.module_dynamic?.additional?.reserve?.title || "信息丢失" + /* 充电抽奖 */ + if (ditem?.orig?.modules?.module_dynamic?.additional?.type === "ADDITIONAL_TYPE_UPOWER_LOTTERY") { obj.origin_is_charge_lottery = true } /* 是否有官方抽奖 */ - obj.origin_hasOfficialLottery = origin_extension && origin_extension.lott; - /* 被转发者的name */ - obj.origin_uname = (user && (user.name || user.uname)) || ''; - /* 被转发者的描述 */ - obj.origin_description = - (item && (item.content || '' + item.description || '')) - || (originToJson.dynamic || '' + originToJson.desc || '') - || ''; + obj.origin_hasOfficialLottery = false + /* 转发描述 */ + obj.origin_description = "" + ditem?.modules?.module_dynamic?.desc?.rich_text_nodes.forEach(node => { + /* 是否有官方抽奖 */ + if (node.type === "RICH_TEXT_NODE_TYPE_LOTTERY") { + obj.origin_hasOfficialLottery = true + } + obj.origin_description += node.orig_text + }) } } catch (e) { log.error("动态卡片解析", e) diff --git a/lib/net/api.bili.js b/lib/net/api.bili.js index c17cd28c06..245240b554 100644 --- a/lib/net/api.bili.js +++ b/lib/net/api.bili.js @@ -5,7 +5,7 @@ module.exports = Object.freeze({ DYNAMIC_REPOST_SHARE: 'https://api.vc.bilibili.com/dynamic_repost/v1/dynamic_repost/share', DYNAMIC_SVR_CREATE_DRAW: 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/create_draw', DYNAMIC_SVR_CREATE: 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/create', - DYNAMIC_SVR_GET_DYNAMIC_DETAIL_V: 'https://api.vc.bilibili.com/dynamic_svr/v{{v}}/dynamic_svr/get_dynamic_detail', + X_POLYMER_WEB_DYNAMIC_V1_DETAIL: 'https://api.bilibili.com/x/polymer/web-dynamic/v1/detail', DYNAMIC_SVR_RM_DYNAMIC: 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic', DYNAMIC_SVR_SPACE_HISTORY: 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history', FEED_GET_ATTENTION_LIST: 'https://api.vc.bilibili.com/feed/v1/feed/get_attention_list', diff --git a/lib/net/bili.js b/lib/net/bili.js index 466a141e2a..d824ff8417 100644 --- a/lib/net/bili.js +++ b/lib/net/bili.js @@ -415,39 +415,27 @@ const bili_client = { _getOneDynamicByDyid: new Line( '获取一个动态的细节', [ - (dynamic_id) => get({ - url: API.DYNAMIC_SVR_GET_DYNAMIC_DETAIL_V.replace('{{v}}', 1), + (id) => get({ + url: API.X_POLYMER_WEB_DYNAMIC_V1_DETAIL, config: { retry: false }, query: { - dynamic_id + id } }), - ...Array(10) - .fill( - (dynamic_id) => get({ - url: API.DYNAMIC_SVR_GET_DYNAMIC_DETAIL_V.replace('{{v}}', Math.floor(Math.random() * 10 ** 10)), - config: { retry: false }, - query: { - dynamic_id - } - }) - ) ] , responseText => { const res = strToJson(responseText), { code, data } = res, - { card } = data || {}, - { desc } = card || {}; + { item } = data || {}, + { id_str } = item || {}; switch (code) { case 0: - if (card && desc) { - return [false, card, `ok`]; + if (item && id_str) { + return [false, item, `ok`]; } else { return [false, undefined, `获取动态数据异常:\n${responseText}`]; } - case 500207: - return [false, undefined, `该动态为包月充电专属可以给UP主充电后观看`]; default: return [true, undefined, `获取动态数据出错:\n${responseText}`] }