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 0000000..e9ba276 Binary files /dev/null and b/resources/img/icon/bilimusic.png differ 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