添加pid搜图和pixiv榜单

This commit is contained in:
yeyang
2022-10-21 14:58:10 +08:00
parent 5dcee0b20d
commit 4cf70b41db
3 changed files with 202 additions and 4 deletions

108
apps/pixiv.js Normal file
View File

@@ -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;
}
}

View File

@@ -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;
}
}

82
model/Pixiv.js Normal file
View File

@@ -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();