From 061002f24d4302d92ed8b901b80b6546d307a06c Mon Sep 17 00:00:00 2001 From: zhiyu <542716863@qq.com> Date: Fri, 26 Jan 2024 12:49:16 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=96=B0=E5=A2=9E=E5=93=94?= =?UTF-8?q?=E5=93=A9=E5=93=94=E5=93=A9=E5=AE=98=E6=96=B9AI=E6=80=BB?= =?UTF-8?q?=E7=BB=93=E3=80=81=E5=93=94=E5=93=A9=E5=93=94=E5=93=A9=E9=9F=B3?= =?UTF-8?q?=E4=B9=90=E6=8F=90=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增哔哩哔哩音乐提取,使用“bili音乐+链接”即可提取视频中的音乐 2. 重构部分代码 3. 更换tiktok API 4. 更换视频总结方式GPT为官方的视频摘要(免费使用) 5. 删除GPT相关内容 --- constants/bili.js | 20 +++++++++ constants/constant.js | 43 +++++++++++++++++++ resources/img/icon/bilimusic.png | Bin 0 -> 3469 bytes utils/biliWbi.js | 71 +++++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+) create mode 100644 constants/bili.js create mode 100644 constants/constant.js create mode 100644 resources/img/icon/bilimusic.png create mode 100644 utils/biliWbi.js diff --git a/constants/bili.js b/constants/bili.js new file mode 100644 index 0000000..8e0c8d9 --- /dev/null +++ b/constants/bili.js @@ -0,0 +1,20 @@ +/** + * AI总结API + * https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/misc/sign/wbi.md + * @type {string} + */ +export const BILI_SUMMARY = "https://api.bilibili.com/x/web-interface/view/conclusion/get" + +/** + * 视频基本信息API + * https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/video/info.md + * @type {string} + */ +export const BILI_VIDEO_INFO = "http://api.bilibili.com/x/web-interface/view" + +/** + * 登录基本信息 + * https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/login/login_info.md#%E5%AF%BC%E8%88%AA%E6%A0%8F%E7%94%A8%E6%88%B7%E4%BF%A1%E6%81%AF + * @type {string} + */ +export const BILI_NAV = "https://api.bilibili.com/x/web-interface/nav" \ No newline at end of file diff --git a/constants/constant.js b/constants/constant.js new file mode 100644 index 0000000..88bde22 --- /dev/null +++ b/constants/constant.js @@ -0,0 +1,43 @@ +/** + * 用于百度翻译的常量控制 + * + * @type {{英: string, 日: string, 文: string, 中: string}} + */ +export const transMap = { 中: "zh", 日: "jp", 文: "wyw", 英: "en", 俄: "ru", 韩: "kr" }; +/** + * 用于腾讯交互式翻译的常量控制 + * + * @type {{英: string, 俄: string, 日: string, 韩: string, 中: string}} + */ +export const tencentTransMap = { 中: "zh", 日: "ja", 韩: "ko", 英: "en", 俄: "ru" }; +/** + * 用于腾讯交互式翻译的常量控制 + * + * @type {{英: string, 俄: string, 日: string, 韩: string, 中: string}} + */ +export const googleTransMap = { 中: "zh-CN", 日: "jp", 韩: "ko", 英: "en", 俄: "ru" }; + +/** + * 以下为抖音/TikTok类型代码 + * + * @type {{"0": string, "55": string, "2": string, "68": string, "58": string, "4": string, "61": string, "51": string, "150": string}} + */ +export const douyinTypeMap = { + 2: "image", + 4: "video", + 68: "image", + 0: "video", + 51: "video", + 55: "video", + 58: "video", + 61: "video", + 150: "image", +}; + +export const TEN_THOUSAND = 10000; + +export const CAT_LIMIT = 10; + +export const XHS_CK = 'eGhzVHJhY2tlcklkPTczODhhYmY2LTI0MDgtNGU5YS04MTUyLTE0MGVhOGY1MTQ5ZjsgeGhzVHJhY2tlcklkLnNpZz1UcGUxTkNaX3B3UkFYdG01SVJmVEs0SWUxM0xBaGZuNmNZU2N4Vi1JYWxFOyBhMT0xODY2ZDkwMDM0NmI2NmppcjMzcGpxZ2MwM3JvcG1mczAydXMxdWNoeDEwMDAwMTM1MDUzOyB3ZWJJZD1mMTNkOGJkYjhiZGM3ZGE0MzY0NjA4NWJjYzQ1MDQ1YTsgZ2lkPXlZS0tmajg4SzA4MnlZS0tmajg4cUo3UzRLREtLVjNGcXFVVjd4Q0FrUzhxRk15OGxVNmlNeTg4OHlxMjgycThmMlk0UzAySjsgZ2lkLnNpZ249YlpzcFFzSUxEUmN5akZLQmN2L1FMWVhkU3lvPTsgd2ViX3Nlc3Npb249MDMwMDM3YTRjMDQyYjE1ZTVjMTg4OTUwOGIyNDRhZDExM2UwNTM7IHhoc1RyYWNrZXI9dXJsPW5vdGVEZXRhaWwmeGhzc2hhcmU9V2VpeGluU2Vzc2lvbjsgeGhzVHJhY2tlci5zaWc9YzdmcDVRclk2SGNvVERhUzluX2N3Z2RCRHh2MFZmWnpSU1NTcnlzbG5lQTsgZXh0cmFfZXhwX2lkcz1oNV8yMzAyMDExX29yaWdpbixoNV8xMjA4X2NsdCxoNV8xMTMwX2NsdCxpb3Nfd3hfbGF1bmNoX29wZW5fYXBwX2V4cCxoNV92aWRlb191aV9leHAzLHd4X2xhdW5jaF9vcGVuX2FwcF9kdXJhdGlvbl9vcmlnaW4scXVlc19jbHQyOyBleHRyYV9leHBfaWRzLnNpZz1DVUdrR3NYT3lBZmpVSXkyVGo3SjN4YmRNakFfSnpoR1JkYWd6cVlkbmJnOyB3ZWJCdWlsZD0xLjEuMjE7IHhzZWNhcHBpZD14aHMtcGMtd2ViOyB3ZWJzZWN0aWdhPTU5ZDNlZjFlNjBjNGFhMzdhN2RmM2MyMzQ2N2JkNDZkN2YxZGEwYjE5MThjZjMzNWVlN2YyZTllNTJhYzA0Y2Y7IHNlY19wb2lzb25faWQ9MTI0OTE1NWQtOWU5ZS00MzkyLTg2NTgtNTA1Yzc0YTUzMTM1' + +export const RESTRICTION_DESCRIPTION = "\n-----------------------限制说明-----------------------" \ No newline at end of file diff --git a/resources/img/icon/bilimusic.png b/resources/img/icon/bilimusic.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ba2767997477438677d17e695a8935bc9e1b7a GIT binary patch literal 3469 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 literal 0 HcmV?d00001 diff --git a/utils/biliWbi.js b/utils/biliWbi.js new file mode 100644 index 0000000..a4303b5 --- /dev/null +++ b/utils/biliWbi.js @@ -0,0 +1,71 @@ +import md5 from 'md5' +import { BILI_NAV } from "../constants/bili.js"; + +const mixinKeyEncTab = [ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 +] + +// 对 imgKey 和 subKey 进行字符顺序打乱编码 +const getMixinKey = (orig) => mixinKeyEncTab.map(n => orig[n]).join('').slice(0, 32) + +// 为请求参数进行 wbi 签名 +function encWbi(params, img_key, sub_key) { + const mixin_key = getMixinKey(img_key + sub_key), + curr_time = Math.round(Date.now() / 1000), + chr_filter = /[!'()*]/g + + Object.assign(params, { wts: curr_time }) // 添加 wts 字段 + // 按照 key 重排参数 + const query = Object + .keys(params) + .sort() + .map(key => { + // 过滤 value 中的 "!'()*" 字符 + const value = params[key].toString().replace(chr_filter, '') + return `${encodeURIComponent(key)}=${encodeURIComponent(value)}` + }) + .join('&') + + const wbi_sign = md5(query + mixin_key) // 计算 w_rid + + return query + '&w_rid=' + wbi_sign +} + +// 获取最新的 img_key 和 sub_key +async function getWbiKeys(SESSDATA) { + const res = await fetch(BILI_NAV, { + headers: { + // SESSDATA 字段 + Cookie: `SESSDATA=${SESSDATA}` + } + }) + const { data: { wbi_img: { img_url, sub_url } } } = await res.json() + + return { + img_key: img_url.slice( + img_url.lastIndexOf('/') + 1, + img_url.lastIndexOf('.') + ), + sub_key: sub_url.slice( + sub_url.lastIndexOf('/') + 1, + sub_url.lastIndexOf('.') + ) + } +} + +/** + * 算法来自:https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/misc/sign/wbi.md + * 参考了算法来源:https://github.com/SocialSisterYi/bilibili-API-collect/issues/631 + * @return {Promise} + */ +export async function getWbi(videoData, SESSDATA) { + const web_keys = await getWbiKeys(SESSDATA) + const params = { ...videoData }, + img_key_res = web_keys.img_key, + sub_key_res = web_keys.sub_key + // eg. bar=514&baz=1919810&foo=114&wts=1684805578&w_rid=bb97e15f28edf445a0e4420d36f0157e + return encWbi(params, img_key_res, sub_key_res); +} \ No newline at end of file