From 4cf70b41db0e5d0e34f9efd20bad4e7dcac8e451 Mon Sep 17 00:00:00 2001 From: yeyang <746659424@qq.com> Date: Fri, 21 Oct 2022 14:58:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0pid=E6=90=9C=E5=9B=BE?= =?UTF-8?q?=E5=92=8Cpixiv=E6=A6=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/pixiv.js | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ model/Config.js | 16 +++++-- model/Pixiv.js | 82 ++++++++++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+), 4 deletions(-) create mode 100644 apps/pixiv.js create mode 100644 model/Pixiv.js diff --git a/apps/pixiv.js b/apps/pixiv.js new file mode 100644 index 0000000..fb82805 --- /dev/null +++ b/apps/pixiv.js @@ -0,0 +1,108 @@ +import plugin from '../../../lib/plugins/plugin.js' +import { segment } from "oicq"; +import Pixiv from '../model/Pixiv.js' +import Config from '../model/Config.js'; +import moment from 'moment'; +import fs from 'fs' + +let type = { + "日": "day", + "周": "week", + "月": "month", + "男性向": 'male', + "女性向": 'female', +} + +let listreg = new RegExp(`^#?看看(${Object.keys(type).join("|")})榜\\s?(第(\\d+)页)?$`) + +export class example extends plugin { + constructor() { + super({ + name: '涩涩', + dsc: '涩涩', + event: 'message', + priority: 5000, + rule: [ + { + reg: '^(p|P)(i|I)(d|D)搜图(\\d+)$', + fnc: 'saucenaoPid' + }, + { + reg: listreg, + fnc: 'pixivList' + } + ] + }) + this.path = "./plugins/yenai-plugin/config/setu/setu.json" + } + + //pid搜图 + async saucenaoPid(e) { + let pids = e.msg.replace(/#|(p|P)(i|I)(d|D)搜图/g, "").trim() + let res = await Pixiv.Worker(pids) + + if (!res) return e.reply("可能接口失效或无该Pid信息") + + let { title, pid, uresname, uresid, tags, url } = res + let msg = [ + `标题:${title}\n`, + `插画ID:${pid}\n`, + `画师:${uresname}\n`, + `画师ID:${uresid}\n`, + `tag:${tags.join(",")}\n`, + `直链:https://pixiv.re/${pid}.jpg`, + ] + await e.reply(msg) + + let img = []; + for (let i of url) { + img.push(segment.image(i)) + } + + if (!await this.getsendMsg(e, img)) e.reply("消息发送失败,可能被风控") + + return true; + } + + //p站排行榜 + async pixivList(e) { + + let regRet = listreg.exec(e.msg) + + let mode = `${type[regRet[1]]}`; + + let date = moment().subtract(2, "days").format("YYYY-MM-DD") + + let page = regRet[3] ? regRet[3] : "1" + + let res = await Pixiv.Rank(page, date, mode) + + if (!res) return e.reply("可能接口失效或无榜单信息") + + if (!await this.getsendMsg(e, res)) e.reply("消息发送失败,可能被风控") + + return true; + } + /** + * @description: + * @param {*} e oicq + * @param {Array} msg 发送的消息 + * @return {Boolean} + */ + async getsendMsg(e, msg) { + //获取CD + let cfgs = {} + let time = 120 + if (fs.existsSync(this.path)) { + cfgs = await Config.getread(this.path) + } + + if (cfgs[e.group_id]) { + time = cfgs[e.group_id].recall + } + let res = await Config.getforwardMsg(msg, e, time) + if (!res) return false; + return true; + } +} + diff --git a/model/Config.js b/model/Config.js index 2e3bd79..7d430eb 100644 --- a/model/Config.js +++ b/model/Config.js @@ -88,9 +88,10 @@ class Config { * @description: * @param {Array} message 发送的消息 * @param {*} e oicq - * @return {*} + * @param {Number} time 撤回时间 + * @return {Boolean} */ - async getforwardMsg(message, e) { + async getforwardMsg(message, e, time = 0) { //制作转发消息 let forwardMsg = [] for (let i of message) { @@ -110,8 +111,15 @@ class Config { } //发送消息 - e.reply(forwardMsg) - + let res = await e.reply(forwardMsg) + if (!res) return false + if (time > 0 && res && res.message_id) { + setTimeout(() => { + e.group.recallMsg(res.message_id); + logger.mark("[椰奶]执行撤回") + }, time * 1000); + } + return true; } } diff --git a/model/Pixiv.js b/model/Pixiv.js new file mode 100644 index 0000000..657aa7f --- /dev/null +++ b/model/Pixiv.js @@ -0,0 +1,82 @@ +import fetch from "node-fetch"; +import lodash from "lodash"; +import { segment } from "oicq"; + +class Pixiv { + /** + * @description: 获取插画信息 + * @param {String} ids 插画ID + * @return {Object} + */ + async Worker(ids) { + let api = `https://api.imki.moe/api/pixiv/illust?id=${ids}` + let res = await fetch(api).then(res => res.json()).catch(err => console.log(err)) + + if (!res) return false; + if (res.error) return false; + res = res.illust + let tags = lodash.flattenDeep(res.tags.map(item => Object.values(item))) + let caption = res.caption.replace(/<.*>/g, "").trim() + let { id: pid, title, meta_single_page, meta_pages, user, } = res + let url = [] + if (!lodash.isEmpty(meta_single_page)) { + url.push(meta_single_page.original_image_url.replace("i.pximg.net", "proxy.pixivel.moe")) + } else { + url = meta_pages.map(item => item.image_urls.original.replace("i.pximg.net", "proxy.pixivel.moe")); + } + return { + pid, + title, + url, + uresid: user.id, + uresname: user.name, + tags, + caption + } + } + /** + * @description: 获取Pixiv榜单 + * @param {String} page 页数 + * @param {String} date 时间 + * @param {String} mode 榜单类型 + * @return {Array} + */ + async Rank(page, date, mode = "day") { + let type = { + "day": "日榜", + "week": "周榜", + "month": "月榜", + 'male': "男性向榜", + 'female': "女性向榜", + } + let api = `https://api.bbmang.me/ranks?page=${page}&date=${date}&mode=${mode}&pageSize=30` + let res = await fetch(api).then(res => res.json()).catch(err => console.log(err)) + if (!res) return false; + if (!res.data) return false; + let list = [ + `${date}的${type[mode]}`, + `当前为第${page}页` + ]; + for (let i of res.data) { + let title = i.title; + let pid = i.id; + let uresname = i.artistPreView.name; + let uresid = i.artistPreView.id; + let tags = i.tags ? lodash.truncate(i.tags.map((item) => item.name).join(",")) : "" + let url = i.imageUrls[0].large.replace("i.pximg.net", "proxy.pixivel.moe") + list.push([ + `标题:${title}\n`, + `插画ID:${pid}\n`, + `画师:${uresname}\n`, + `画师ID:${uresid}\n`, + `tag:${tags}\n`, + segment.image(url) + ]) + } + return list + } + +} + + +export default new Pixiv(); \ No newline at end of file