diff --git a/apps/pixiv.js b/apps/pixiv.js index b011f28..44a19a6 100644 --- a/apps/pixiv.js +++ b/apps/pixiv.js @@ -5,13 +5,15 @@ import { Pixiv, common, setu } from '../model/index.js' // 文案 const SWITCH_ERROR = '主人没有开放这个功能哦(*/ω\*)' // 汉字数字匹配正则 -let numReg = '[一壹二两三四五六七八九十百千万亿\\d]+' +const numReg = '[一壹二两三四五六七八九十百千万亿\\d]+' // 正则 -let rankingrReg = new RegExp(`^#?看看((\\d{4}-\\d{1,2}-\\d{1,2})的)?(${Object.keys(Pixiv.ranktype).join('|')})(r18)?榜\\s?(第(${numReg})页)?$`, 'i') -let tagReg = /^#?tag(pro)?搜图(.*)$/i -let pidReg = /^#?pid搜图\s?(\d+)$/i -let uidReg = /^#?uid搜图(.*)$/i -let randomImgReg = new RegExp(`^#?来(${numReg})?张(好(康|看)(的|哒)|hkd|涩图)$|#有内鬼$`) +const pidReg = /^#?pid搜图\s?(\d+)$/i + +const rankingrReg = new RegExp(`^#?看看((\\d{4}-\\d{1,2}-\\d{1,2})的)?(${Object.keys(Pixiv.ranktype).join('|')})(r18)?榜\\s?(第(${numReg})页)?$`, 'i') +const tagReg = new RegExp(`^#?tag(pro)?搜图(.*?)(第(${numReg})页)?$`, 'i') +const uidReg = new RegExp(`^#?uid搜图(.*?)(第(${numReg})页)?$`, 'i') +const searchUser = new RegExp(`^#?user搜索(.*?)(第(${numReg})页)?$`, 'i') +const randomImgReg = new RegExp(`^#?来(${numReg})?张(好(康|看)(的|哒)|hkd|涩图)$|#有内鬼$`) export class example extends plugin { constructor () { @@ -32,29 +34,34 @@ export class example extends plugin { reg: tagReg, fnc: 'searchTags' }, - { - reg: '^#?(查看|获取)?热门(t|T)(a|A)(g|G)$', - fnc: 'trendTags' - }, { reg: uidReg, fnc: 'searchUid' }, + { + reg: searchUser, + fnc: 'searchUser' + }, { reg: randomImgReg, fnc: 'randomImg' }, + { + reg: '^#?(查看|获取)?热门(t|T)(a|A)(g|G)$', + fnc: 'trendTags' + }, { reg: '^#?看?看?相关作品(\\d+)$', - fnc: 'relatedWorks' + fnc: 'related' }, { reg: '^#?(P|p)ximg(pro)?$', fnc: 'pximg' }, { - reg: '^#?user搜索.*$', - fnc: 'searchUser' + reg: '^#(p站|pixiv)((查看|更换)代理.*|(开启|关闭)直连)$', + fnc: 'setProxy', + permission: 'master' } ] }) @@ -69,7 +76,7 @@ export class example extends plugin { let regRet = pidReg.exec(e.msg) - let res = await Pixiv.Worker(regRet[1], !e.isMaster && !setu.getR18(e.group_id)) + let res = await Pixiv.illust(regRet[1], !e.isMaster && !setu.getR18(e.group_id)) if (res?.error) return e.reply(res.error) @@ -90,7 +97,7 @@ export class example extends plugin { e.reply(Pixiv.startMsg) - let page = common.translateChinaNum(regRet[6] || 1) + let page = common.translateChinaNum(regRet[6]) let res = await Pixiv.Rank(page, regRet[2], regRet[3], regRet[4]) if (res?.error) return e.reply(res.error) @@ -105,44 +112,25 @@ export class example extends plugin { let regRet = tagReg.exec(e.msg) let { sese, sesepro } = Config.getGroup(e.group_id) - if (((!sese && !sesepro) || (!sesepro && regRet[1])) && !e.isMaster) { - return e.reply('主人没有开放这个功能哦(*/ω\*)') - } + if (((!sese && !sesepro) || (!sesepro && regRet[1])) && !e.isMaster) return e.reply(SWITCH_ERROR) e.reply(Pixiv.startMsg) - let tag = regRet[2] - - let pagereg = new RegExp(`第(${numReg})页`) - - let page = pagereg.exec(e.msg) - - if (page) { - tag = tag.replace(page[0], '') - page = common.translateChinaNum(page[1]) - } else { - page = '1' - } - let res = null - if (regRet[1]) { - res = await Pixiv.searchTagspro(tag, page, !setu.getR18(e.group_id)) - } else { - res = await Pixiv.searchTags(tag, page) - } + let page = common.translateChinaNum(regRet[4]) + let res = await Pixiv[`searchTags${regRet[1] ? 'pro' : ''}`](regRet[2], page, !setu.getR18(e.group_id)) if (res?.error) return e.reply(res.error) - common.getRecallsendMsg(e, res) - return true + common.getRecallsendMsg(e, res) } /** 获取热门tag */ - async trendTags (e) { + async PopularTags (e) { let { sese, sesepro } = Config.getGroup(e.group_id) if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) e.reply(Pixiv.startMsg) - let res = await Pixiv.gettrend_tags() + let res = await Pixiv.PopularTags() if (res?.error) return e.reply(res.error) @@ -157,22 +145,9 @@ export class example extends plugin { e.reply(Pixiv.startMsg) let regRet = uidReg.exec(e.msg) + let page = common.translateChinaNum(regRet[3]) - let key = regRet[1] - - let pagereg = new RegExp(`第(${numReg})页`) - - let page = pagereg.exec(e.msg) - - if (page) { - key = key.replace(page[0], '') - page = page[1] - } else { - page = '1' - } - page = common.translateChinaNum(page) - - let res = await Pixiv.userIllust(key, page, !setu.getR18(e.group_id)) + let res = await Pixiv.userIllust(regRet[1], page, !setu.getR18(e.group_id)) if (res?.error) return e.reply(res.error) @@ -194,7 +169,7 @@ export class example extends plugin { num = 1 } num = common.translateChinaNum(num) - let res = await Pixiv.getrandomimg(num) + let res = await Pixiv.randomImg(num) if (res?.error) return e.reply(res.error) @@ -202,14 +177,14 @@ export class example extends plugin { } // 相关作品 - async relatedWorks (e) { + async related (e) { let { sese, sesepro } = Config.getGroup(e.group_id) if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) e.reply(Pixiv.startMsg) let regRet = e.msg.match(/\d+/) - let res = await Pixiv.getrelated_works(regRet[0], !setu.getR18(e.group_id)) + let res = await Pixiv.related(regRet[0], !setu.getR18(e.group_id)) if (res?.error) return e.reply(res.error) common.getRecallsendMsg(e, res) } @@ -221,7 +196,7 @@ export class example extends plugin { let { sese, sesepro } = Config.getGroup(e.group_id) if (((!sese && !sesepro) || (!sesepro && ispro)) && !e.isMaster) return e.reply(SWITCH_ERROR) - let res = await Pixiv.getPximg(ispro) + let res = await Pixiv.pximg(ispro) if (res?.error) return e.reply(res.error) ispro ? common.getRecallsendMsg(e, [res]) : common.recallsendMsg(e, res) } @@ -232,11 +207,31 @@ export class example extends plugin { if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) e.reply(Pixiv.startMsg) - let regRet = e.msg.match(new RegExp(`^#?user搜索(.*?)(第(${numReg})页)?$`)) + let regRet = e.msg.match(searchUser) let page = common.translateChinaNum(regRet[3]) let msg = await Pixiv.searchUser(regRet[1], page, !setu.getR18(e.group_id)) if (msg.error) return e.reply(msg.error) common.getRecallsendMsg(e, msg) } + + // 更换代理 + async setProxy (e) { + let proxydef = [ + 'i.pixiv.re', + 'proxy.pixivel.moe', + 'px2.rainchan.win', + 'sex.nyan.xyz' + ] + if (/查看/.test(e.msg)) return e.reply(await redis.get('yenai:proxy')) + let proxy = e.msg.replace(/#|(p站|pixiv)更换代理/g, '').trim() + if (/直连/.test(e.msg)) { + proxy = /开启/.test(e.msg) ? 'i.pximg.net' : proxydef[0] + } + if (/^[1234]$/.test(proxy)) proxy = proxydef[proxy - 1] + if (!/([\w\d]+\.){2}[\w\d]+/.test(proxy)) return e.reply('请检查代理地址是否正确') + logger.mark(`${e.logFnc}切换为${proxy}`) + Pixiv.proxy = proxy + e.reply(`✅ 已经切换代理为「${proxy}」`) + } } diff --git a/apps/set.js b/apps/set.js index 09f8f24..08499db 100644 --- a/apps/set.js +++ b/apps/set.js @@ -2,7 +2,7 @@ import plugin from '../../../lib/plugins/plugin.js' import fs from 'fs' import lodash from 'lodash' import { Config } from '../components/index.js' -import { setu, puppeteer, Pixiv } from '../model/index.js' +import { setu, puppeteer } from '../model/index.js' const configs = { 好友消息: 'privateMessage', 群消息: 'groupMessage', @@ -61,16 +61,6 @@ export class NewConfig extends plugin { fnc: 'SetAll', permission: 'master' }, - { - reg: '^#椰奶(查看|更换)代理.*$', - fnc: 'proxy', - permission: 'master' - }, - { - reg: '^#(开启|关闭)(p站|pixiv)直连$', - fnc: 'proxy', - permission: 'master' - }, { reg: '^#(增加|减少|查看)头衔屏蔽词.*$', fnc: 'NoTitle', @@ -205,29 +195,6 @@ export class NewConfig extends plugin { }) } - // 更换代理 - async proxy (e) { - let proxykey = 'yenai:proxy' - let proxydef = [ - 'i.pixiv.re', - 'proxy.pixivel.moe', - 'px2.rainchan.win', - 'sex.nyan.xyz' - ] - if (/查看/.test(e.msg)) return e.reply(await redis.get(proxykey)) - let proxy = e.msg.replace(/#|椰奶更换代理/g, '').trim() - if (/直连/.test(e.msg)) { - proxy = /开启/.test(e.msg) ? 'i.pximg.net' : proxydef[0] - } - if (/^[1234]$/.test(proxy)) proxy = proxydef[proxy - 1] - if (!/([\w\d]+\.){2}[\w\d]+/.test(proxy)) return e.reply('请检查代理地址是否正确') - logger.mark(`${e.logFnc}切换为${proxy}`) - await redis.set(proxykey, proxy) - .then(() => e.reply(`✅ 已经切换代理为「${proxy}」`)) - .catch(err => console.log(err)) - Pixiv.init() - } - // 查看涩涩设置 async View_Settings (e) { let set = setu.getSeSeConfig(e) diff --git a/model/Pixiv.js b/model/Pixiv.js index 053e29a..09b3e28 100644 --- a/model/Pixiv.js +++ b/model/Pixiv.js @@ -8,8 +8,7 @@ const API_ERROR = '❎ 出错辣,请稍后重试' export default new class Pixiv { constructor () { - this.proxy = 'i.pixiv.re' - this.headers = {} + this._proxy = 'i.pixiv.re' this.ranktype = { 日: { type: 'day', @@ -80,28 +79,41 @@ export default new class Pixiv { } async init () { - this.proxy = await redis.get('yenai:proxy') + this._proxy = await redis.get('yenai:proxy') if (!this.proxy) { await redis.set('yenai:proxy', 'i.pixiv.re') - this.proxy = 'i.pixiv.re' + this._proxy = 'i.pixiv.re' } + } + + get headers () { if (this.proxy == 'i.pximg.net') { - this.headers = { + return { Host: 'i.pximg.net', Referer: 'https://www.pixiv.net/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46' } } else { - delete this.headers + return undefined } } + get proxy () { + console.log('proxy:' + this._proxy) + return this._proxy + } + + set proxy (value) { + redis.set('yenai:proxy', value) + this._proxy = value + } + /** * @description: 获取插画信息 * @param {String} ids 插画ID * @return {Object} */ - async Worker (ids, filter = false) { + async illust (ids, filter = false) { let api = `${this.domain}/illust?id=${ids}` let res = await fetch(api).then(res => res.json()).catch(err => console.log(err)) if (!res) return { error: API_ERROR } @@ -136,7 +148,7 @@ export default new class Pixiv { } return { error: linkmsg } } - + console.log(this.headers) let img = await Promise.all(url.map(async item => await this.proxyFetchImg(item, { headers: this.headers }))) return { msg, img } } @@ -299,7 +311,7 @@ export default new class Pixiv { * @description: 获取热门tag * @return {Array} */ - async gettrend_tags () { + async PopularTags () { let api = `${this.domain}/tags` let res = await fetch(api).then(res => res.json()).catch(err => console.log(err)) @@ -380,6 +392,13 @@ export default new class Pixiv { ] } + /** + * @description:搜索用户 + * @param {String} word 用户name + * @param {Number} page 页数 + * @param {Boolean} isfilter 是否过滤敏感内容 + * @return {Array} 可直接发送的消息数组 + */ async searchUser (word, page = 1, isfilter = true) { let api = `${this.domain}/search_user?word=${word}&page=${page}&size=10` let user = await fetch(api).then(res => res.json()).catch(err => console.log(err)) @@ -413,7 +432,7 @@ export default new class Pixiv { * @description: 随机图片 * @return {Array} */ - async getrandomimg (num) { + async randomImg (num) { let api = `https://www.vilipix.com/api/v1/picture/public?limit=${num}&offset=${lodash.random(1500)}&sort=hot&type=0` let res = await fetch(api).then(res => res.json()).catch(err => console.log(err)) if (!res) return { error: API_ERROR } @@ -438,7 +457,7 @@ export default new class Pixiv { * @param {String} pid * @return {*} */ - async getrelated_works (pid, isfilter = true) { + async related (pid, isfilter = true) { let api = `${this.domain}/related?id=${pid}` let res = await fetch(api).then(res => res.json()).catch(err => console.log(err)) if (!res) return { error: API_ERROR } @@ -472,7 +491,7 @@ export default new class Pixiv { } /** p站单图 */ - async getPximg (type) { + async pximg (type) { let url = 'https://ovooa.com/API/Pximg/' if (type) { url = 'https://xiaobapi.top/api/xb/api/setu.php' @@ -480,7 +499,7 @@ export default new class Pixiv { let res = await fetch(url).then(res => res.json()).catch(err => console.log(err)) if (!res) return { error: API_ERROR } let { pid, uid, title, author, tags, urls, r18 } = res.data[0] || res.data - urls = urls.original.replace('i.der.ink', this.proxy) + urls = urls.original.replace(/i.der.ink|i.pixiv.re/, this.proxy) let msg = [ `Pid: ${pid}\n`, `Uid: ${uid}\n`,