From f62bb7a6955e4785e817a90b6d0ae588aa44d993 Mon Sep 17 00:00:00 2001 From: zhiyu <542716863@qq.com> Date: Sat, 24 Feb 2024 22:35:20 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20V1.4.0=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=B1=B3=E6=B8=B8=E7=A4=BE=E6=96=87=E7=AB=A0=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增米游社文章解析,感谢群友mix提供的想法 2. 新增ks的图片解析,感谢群友风をした提供手机端图片的例子 3. 格式化部分代码 --- apps/query.js | 39 +++++---- apps/tools.js | 145 ++++++++++++++++++-------------- config/help.yaml | 6 ++ config/version.yaml | 3 +- constants/tools.js | 7 ++ resources/img/icon/miyoushe.png | Bin 0 -> 42445 bytes resources/img/icon/xigua.png | Bin 0 -> 6938 bytes utils/common.js | 63 ++++++++++++-- utils/mihoyo.js | 14 +++ 9 files changed, 190 insertions(+), 87 deletions(-) create mode 100644 resources/img/icon/miyoushe.png create mode 100644 resources/img/icon/xigua.png create mode 100644 utils/mihoyo.js diff --git a/apps/query.js b/apps/query.js index f012c3f..59c6338 100644 --- a/apps/query.js +++ b/apps/query.js @@ -8,12 +8,17 @@ import axios from "axios"; // 常量 import { CAT_LIMIT } from "../constants/constant.js"; // 书库 -import { getZHelper, getYiBook, getZBook } from "../utils/books.js"; +import { getYiBook, getZBook, getZHelper } from "../utils/books.js"; // 工具类 -import _ from "lodash"; import TokenBucket from '../utils/token-bucket.js' export class query extends plugin { + /** + * 令牌桶 拿来限流 + * @type {TokenBucket} + */ + static #tokenBucket = new TokenBucket(1, 1, 60); + constructor() { super({ name: "R插件查询类", @@ -59,19 +64,19 @@ export class query extends plugin { async doctor(e) { const keyword = e.msg.replace("#医药查询", "").trim(); - const url = `https://api2.dayi.org.cn/api/search2?keyword=${keyword}&pageNo=1&pageSize=10`; + const url = `https://api2.dayi.org.cn/api/search2?keyword=${ keyword }&pageNo=1&pageSize=10`; try { const res = await fetch(url) .then(resp => resp.json()) .then(resp => resp.list); const promises = res.map(async element => { const title = this.removeTag(element.title); - const template = `${title}\n标签:${element.secondTitle}\n介绍:${element.introduction}`; + const template = `${ title }\n标签:${ element.secondTitle }\n介绍:${ element.introduction }`; if (title === keyword) { const browser = await puppeteer.browserInit(); const page = await browser.newPage(); - await page.goto(`https://www.dayi.org.cn/drug/${element.id}`); + await page.goto(`https://www.dayi.org.cn/drug/${ element.id }`); const buff = await page.screenshot({ fullPage: true, type: "jpeg", @@ -101,8 +106,8 @@ export class query extends plugin { async cat(e) { const [shibes, cats] = await Promise.allSettled([ - fetch(`https://shibe.online/api/cats?count=${CAT_LIMIT}`).then(data => data.json()), - fetch(`https://api.thecatapi.com/v1/images/search?limit=${CAT_LIMIT}`).then(data => + fetch(`https://shibe.online/api/cats?count=${ CAT_LIMIT }`).then(data => data.json()), + fetch(`https://api.thecatapi.com/v1/images/search?limit=${ CAT_LIMIT }`).then(data => data.json(), ), ]); @@ -139,7 +144,7 @@ export class query extends plugin { .filter(result => result.status === "fulfilled") // 只保留已解决的 Promise .flatMap(result => result.value.data.list.map(element => { - const template = `推荐软件:${element.title}\n地址:${element.url}\n`; + const template = `推荐软件:${ element.title }\n地址:${ element.url }\n`; return { message: { type: "text", text: template }, nickname: e.sender.card || e.user_id, @@ -228,14 +233,14 @@ export class query extends plugin { // 封装答案 let ans = ""; for (let i = 0; i < result.length; i++) { - ans += `${i + 1}. ${result[i]}\n`; + ans += `${ i + 1 }. ${ result[i] }\n`; } e.reply(ans); const imgMatch = uri.match(/[^\/]+/g); const imgId = imgMatch[imgMatch.length - 2]; axios - .get(`https://h5.cyol.com/special/daxuexi/${imgId}/images/end.jpg`, { + .get(`https://h5.cyol.com/special/daxuexi/${ imgId }/images/end.jpg`, { headers: { "User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Mobile Safari/537.36", @@ -353,15 +358,15 @@ export class query extends plugin { .sort((a, b) => b.luSort - a.luSort) .map(item => { const { pn, pa, zn, lu, pu, pq, aa, hl } = item; - const template = `标题:${pn}\n${pa}\n期刊:${zn}\n发布日期距今:${lu}\n链接1:${pu}\n链接2:${pq}\n\n 大致描述:${hl + const template = `标题:${ pn }\n${ pa }\n期刊:${ zn }\n发布日期距今:${ lu }\n链接1:${ pu }\n链接2:${ pq }\n\n 大致描述:${ hl .join("\n") - .replace(/<\/?font[^>]*>/g, "")}`; + .replace(/<\/?font[^>]*>/g, "") }`; return { message: [segment.image(aa), template], nickname: this.e.sender.card || this.e.user_id, user_id: this.e.user_id, }; - }); + }); e.reply(await Bot.makeForwardMsg(content)); }); return true; @@ -377,7 +382,7 @@ export class query extends plugin { if (query.#tokenBucket.consume(e.user_id, 1)) { await func(); } else { - e.reply(`🙅‍${e.nickname}你已经被限流,请稍后再试!`, true); + e.reply(`🙅‍${ e.nickname }你已经被限流,请稍后再试!`, true); } } @@ -386,10 +391,4 @@ export class query extends plugin { const titleRex = /<[^>]+>/g; return title.replace(titleRex, ""); } - - /** - * 令牌桶 拿来限流 - * @type {TokenBucket} - */ - static #tokenBucket = new TokenBucket(1, 1, 60); } diff --git a/apps/tools.js b/apps/tools.js index 8453bdb..573a1d2 100644 --- a/apps/tools.js +++ b/apps/tools.js @@ -26,7 +26,7 @@ import { TWITTER_BEARER_TOKEN, XHS_NO_WATERMARK_HEADER, } from "../constants/constant.js"; -import { containsChinese, formatBiliInfo, getIdVideo, secondsToTime } from "../utils/common.js"; +import { containsChinese, downloadImg, formatBiliInfo, getIdVideo, secondsToTime } from "../utils/common.js"; import config from "../model/index.js"; import Translate from "../utils/trans-strategy.js"; import * as xBogus from "../utils/x-bogus.cjs"; @@ -38,6 +38,7 @@ import { getWbi } from "../utils/biliWbi.js"; import { BILI_SUMMARY, DY_INFO, + MIYOUSHE_ARTICLE, TIKTOK_INFO, TWITTER_TWEET_INFO, XHS_REQ_LINK, @@ -47,6 +48,7 @@ import { import child_process from 'node:child_process' import { getAudio, getVideo } from "../utils/y2b.js"; import { processTikTokUrl } from "../utils/tiktok.js"; +import { getDS } from "../utils/mihoyo.js"; export class tools extends plugin { /** @@ -134,6 +136,10 @@ export class tools extends plugin { { reg: "(ixigua.com)", fnc: "xigua" + }, + { + reg: "(miyoushe.com)", + fnc: "miyoushe" } ], }); @@ -566,7 +572,7 @@ export class tools extends plugin { for (let item of resp.includes.media) { if (item.type === "photo") { // 图片 - task.push(this.downloadImg(item.url, downloadPath, "", true)); + task.push(downloadImg(item.url, downloadPath, "", true)); } else if (item.type === "video") { // 视频 await this.downloadVideo(resp.includes.media[0].variants[0].url, true).then( @@ -686,7 +692,7 @@ export class tools extends plugin { } else if (type === "normal") { e.reply(`识别:小红书, ${ title }\n${ desc }`); noteData.imageList.map(async (item, index) => { - imgPromise.push(this.downloadImg(item.urlDefault, downloadPath, index.toString())); + imgPromise.push(downloadImg(item.urlDefault, downloadPath, index.toString())); }); } const paths = await Promise.all(imgPromise); @@ -773,7 +779,7 @@ export class tools extends plugin { // 判断是否是海外服务器 const isOversea = await this.isOverseasServer(); // 简单封装图片下载 - const downloadImg = (url, destination) => { + const downloadInsImg = (url, destination) => { return new Promise((resolve, reject) => { fetch(url, { timeout: 10000, @@ -805,7 +811,7 @@ export class tools extends plugin { .exec(item)[0] .replace(/#38/g, "") .replace(/;/g, ""); - imgPromise.push(downloadImg(imgUrl, `${ downloadPath }/${ index }.jpg`)); + imgPromise.push(downloadInsImg(imgUrl, `${ downloadPath }/${ index }.jpg`)); }); } // TODO 视频,会出bug暂时不做 @@ -924,10 +930,25 @@ export class tools extends plugin { }, timeout: 10000 // 设置超时时间 }).then(resp => { - const url = resp.data.data.url; - this.downloadVideo(url).then(path => { - e.reply(segment.video(path + "/temp.mp4")); - }); + // 图片:https://kph8gvfz.m.chenzhongtech.com/fw/photo/3x45s52s9wchwwm + + if (resp.data.data?.imageUrl) { + const imageUrl = resp.data.data.imageUrl; + const images = imageUrl.map(item => { + return { + message: segment.image(item), + nickname: this.e.sender.card || this.e.user_id, + user_id: this.e.user_id, + } + }) + e.reply(Bot.makeForwardMsg(images)); + } else { + // 视频:https://www.kuaishou.com/short-video/3xhjgcmir24m4nm + const url = resp.data.data.url; + this.downloadVideo(url).then(path => { + e.reply(segment.video(path + "/temp.mp4")); + }); + } }); } @@ -1075,6 +1096,60 @@ export class tools extends plugin { return true } + async miyoushe(e) { + let msg = /(?:https?:\/\/)?(m|www)\.miyoushe\.com\/[A-Za-z\d._?%&+\-=\/#]*/.exec(e.msg)[0]; + const id = /\/(\d+)$/.exec(msg)?.[0].replace("\/", ""); + + fetch(MIYOUSHE_ARTICLE.replace("{}", id), { + headers: { + "Accept-Encoding": "gzip, deflate, br", + "Accept-Language": "zh-cn", + "Connection": "keep-alive", + "Host": "api-takumi.mihoyo.com", + "x-rpc-app_version": "2.11.0", + "x-rpc-client_type": "4", + "Referer": "https://bbs.mihoyo.com/", + "DS": getDS(), + } + }).then(async resp => { + const respJson = await resp.json(); + const data = respJson.data.post.post; + // 分别获取:封面、主题、内容、图片 + const { cover, subject, content, images, structured_content } = data; + let realContent = ""; + // safe JSON.parse + try { + realContent = JSON.parse(content); + } catch (e) { + realContent = content; + } + const normalMsg = `识别:米游社,${ subject }\n${ realContent }`; + const replyMsg = cover ? [segment.image(cover), normalMsg] : normalMsg; + e.reply(replyMsg); + // 视频 + if (structured_content) { + const sc = JSON.parse(structured_content); + const resolutions = sc?.[1].insert.vod.resolutions; + // 暂时选取分辨率较低的video进行解析 + const videoUrl = resolutions[0].url; + this.downloadVideo(videoUrl).then(path => { + e.reply(segment.video(path + "/temp.mp4")); + }); + } + // 这个判断防止发送重复图片 + if (images && images.length > 1) { + const replyImages = images.map(item => { + return { + message: segment.image(item), + nickname: this.e.sender.card || this.e.user_id, + user_id: this.e.user_id, + } + }); + e.reply(Bot.makeForwardMsg(replyImages)); + } + }) + } + /** * 哔哩哔哩下载 * @param title @@ -1111,58 +1186,6 @@ export class tools extends plugin { }); } - /** - * 下载一张网络图片(自动以url的最后一个为名字) - * @param img - * @param dir - * @param fileName - * @param isProxy - * @returns {Promise} - */ - async downloadImg(img, dir, fileName = "", isProxy = false) { - if (fileName === "") { - fileName = img.split("/").pop(); - } - const filepath = `${ dir }/${ fileName }`; - await mkdirIfNotExists(dir) - const writer = fs.createWriteStream(filepath); - const axiosConfig = { - headers: { - "User-Agent": - "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Mobile Safari/537.36", - }, - responseType: "stream", - }; - - if (isProxy) { - axiosConfig.httpAgent = tunnel.httpOverHttp({ - proxy: { host: this.proxyAddr, port: this.proxyPort }, - }); - axiosConfig.httpsAgent = tunnel.httpOverHttp({ - proxy: { host: this.proxyAddr, port: this.proxyPort }, - }); - } - try { - const res = await axios.get(img, axiosConfig); - res.data.pipe(writer); - - return new Promise((resolve, reject) => { - writer.on("finish", () => { - writer.close(() => { - resolve(filepath); - }); - }); - writer.on("error", err => { - fs.unlink(filepath, () => { - reject(err); - }); - }); - }); - } catch (err) { - logger.error("图片下载失败"); - } - } - /** * douyin 请求参数 * @param url diff --git a/config/help.yaml b/config/help.yaml index a9774b7..44c14ba 100644 --- a/config/help.yaml +++ b/config/help.yaml @@ -56,6 +56,12 @@ - icon: kuaishou title: "快手(测试阶段)" desc: 快手分享实时下载 + - icon: xigua + title: "西瓜(测试阶段)" + desc: 西瓜分享实时下载 + - icon: miyoushe + title: "米游社" + desc: 米游社文章分享实时下载 - icon: literature title: "论文" desc: SCI论文实时解析 diff --git a/config/version.yaml b/config/version.yaml index ca7c2ed..5fdca3e 100644 --- a/config/version.yaml +++ b/config/version.yaml @@ -1,7 +1,8 @@ - { - version: 1.3.5, + version: 1.4.0, data: [ + 新增米游社解析功能, 新增🍉解析功能, 新增油管解析功能, 新增小红书无水印下载功能, diff --git a/constants/tools.js b/constants/tools.js index a8858ef..d6ef3cd 100644 --- a/constants/tools.js +++ b/constants/tools.js @@ -40,6 +40,13 @@ export const BILI_VIDEO_INFO = "http://api.bilibili.com/x/web-interface/view" */ export const BILI_NAV = "https://api.bilibili.com/x/web-interface/nav" +/** + * 米游社网页端获取文章 + * https://github.com/UIGF-org/mihoyo-api-collect/blob/main/hoyolab/article/article.md#%E8%8E%B7%E5%8F%96%E5%AE%8C%E6%95%B4%E6%96%87%E7%AB%A0%E4%BF%A1%E6%81%AF + * @type {string} + */ +export const MIYOUSHE_ARTICLE = "https://bbs-api.miyoushe.com/post/wapi/getPostFull?post_id={}" + /** * 视频请求链接CDN * @type {string} diff --git a/resources/img/icon/miyoushe.png b/resources/img/icon/miyoushe.png new file mode 100644 index 0000000000000000000000000000000000000000..ef94bbf85adc05ba299d7b15a6dd065b2fd9f04d GIT binary patch literal 42445 zcmV*IKxe;+P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 g5|FGy_?LnI2QADlK~Ul%ZU6uP07*qoM6N<$f attempt(remainingTries - 1), delay); } }); @@ -79,7 +80,7 @@ export function retry(func, maxRetries = 3, delay = 1000) { * @param filename * @returns {Promise} */ -export function downloadPDF (url, filename) { +export function downloadPDF(url, filename) { return axios({ url: url, responseType: "stream", @@ -111,7 +112,7 @@ export async function getIdVideo(url) { return idVideo.length > 19 ? idVideo.substring(0, idVideo.indexOf("?")) : idVideo; } -export function generateRandomStr(randomlength = 16){ +export function generateRandomStr(randomlength = 16) { const base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789=' let random_str = '' for (let i = 0; i < randomlength; i++) { @@ -163,6 +164,58 @@ export async function downloadMp3(mp3Url, path, redirect = "manual") { }); } +/** + * 下载一张网络图片(自动以url的最后一个为名字) + * @param img + * @param dir + * @param fileName + * @param isProxy + * @returns {Promise} + */ +export async function downloadImg(img, dir, fileName = "", isProxy = false) { + if (fileName === "") { + fileName = img.split("/").pop(); + } + const filepath = `${ dir }/${ fileName }`; + await mkdirIfNotExists(dir) + const writer = fs.createWriteStream(filepath); + const axiosConfig = { + headers: { + "User-Agent": + "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Mobile Safari/537.36", + }, + responseType: "stream", + }; + + if (isProxy) { + axiosConfig.httpAgent = tunnel.httpOverHttp({ + proxy: { host: this.proxyAddr, port: this.proxyPort }, + }); + axiosConfig.httpsAgent = tunnel.httpOverHttp({ + proxy: { host: this.proxyAddr, port: this.proxyPort }, + }); + } + try { + const res = await axios.get(img, axiosConfig); + res.data.pipe(writer); + + return new Promise((resolve, reject) => { + writer.on("finish", () => { + writer.close(() => { + resolve(filepath); + }); + }); + writer.on("error", err => { + fs.unlink(filepath, () => { + reject(err); + }); + }); + }); + } catch (err) { + logger.error("图片下载失败"); + } +} + /** * 千位数的数据处理 * @param data @@ -178,7 +231,7 @@ const dataProcessing = data => { * @return {string} */ export function formatBiliInfo(data) { - return Object.keys(data).map(key => `${key}:${dataProcessing(data[key])}`).join(' | '); + return Object.keys(data).map(key => `${ key }:${ dataProcessing(data[key]) }`).join(' | '); } /** @@ -197,7 +250,7 @@ export function secondsToTime(seconds) { // return `${pad(minutes, 2)}:${pad(secs, 2)}`; // 完整的 HH:MM:SS 格式 - return `${pad(hours, 2)}:${pad(minutes, 2)}:${pad(secs, 2)}`; + return `${ pad(hours, 2) }:${ pad(minutes, 2) }:${ pad(secs, 2) }`; } /** diff --git a/utils/mihoyo.js b/utils/mihoyo.js new file mode 100644 index 0000000..1195107 --- /dev/null +++ b/utils/mihoyo.js @@ -0,0 +1,14 @@ +import md5 from 'md5'; + +export const getDS = () => { + const salt = "ZSHlXeQUBis52qD1kEgKt5lUYed4b7Bb"; + const lettersAndNumbers = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + + const i = Math.floor(Date.now() / 1000); + let r = "" + for (let i; i < 6; i++) { + r += lettersAndNumbers[Math.floor(Math.random() * lettersAndNumbers.length)] + } + const c = md5(`salt=${ salt }&t=${ i }&r=${ r }`); + return `${ i },${ r },${ c }`; +} \ No newline at end of file