// 主库 import { segment } from 'oicq' import common from '../../../lib/common/common.js' import fetch from 'node-fetch' // 配置文件 import config from '../model/index.js' // 其他库 import _ from 'lodash' import mongodb from 'mongodb' // Mongodb初始化 function initMongo () { const MongoClient = mongodb.MongoClient const url = 'mongodb://localhost:27017/' return new Promise((resolve, reject) => { MongoClient.connect(url, (err, db) => { const dbo = db.db('test') if (err) { throw err // 和调用 reject(err) 效果类似 } let collection = dbo.collection('temp') resolve(collection) }) }) } const mongo = initMongo() // 60s后撤回 const recallTime = 109 export class mystery extends plugin { constructor () { super({ name: '神秘区域', dsc: '神秘指令', event: 'message.group', priority: 500, rule: [ { reg: '^#(雀食|确实)$', fnc: 'mystery' }, { reg: '^#*来份涩图 (.*)$', fnc: 'setu' }, { reg: '^#(累了)$', fnc: 'cospro' }, { reg: '^#(啊?|啊?)$', fnc: 'aaa' }, { reg: '^#我去', fnc: 'tuiimg' } ] }) this.mysteryConfig = config.getConfig('mystery') } // 接受到消息都会先执行一次 async accept () { let oldReply = this.e.reply this.e.reply = async function (msgs, quote, data) { if (!msgs) return false if (!Array.isArray(msgs)) msgs = [ msgs ] let result = await oldReply(msgs, quote, data) if (!result || !result.message_id) { let isxml = false for (let msg of msgs) { if (msg && msg?.type == 'xml' && msg?.data) { msg.data = msg.data.replace(/^<\?xml.*update=.*?>/g, '') isxml = true } } if (isxml) { result = await oldReply(msgs, quote, data) } else { let MsgList = [ { message: msgs, nickname: Bot.nickname, user_id: Bot.user_id } ] let forwardMsg = await Bot.makeForwardMsg(MsgList) forwardMsg.data = forwardMsg.data .replace('', '') .replace(/\n/g, '') .replace(/(.+?)<\/title>/g, '___') .replace(/___+/, '<title color="#777777" size="26">请点击查看内容') msgs = forwardMsg result = await oldReply(msgs, quote, data) } if (!result || !result.message_id) { logger.error('风控消息处理失败,请登录手机QQ查看是否可手动解除风控!') } } return result } } async mystery (e) { // 最大页数 const maxPage = this.mysteryConfig.mystery.maxPage const maxPigObj = this.mysteryConfig.mystery.maxPigObj // 限制最大图片数量 const imageCountLimit = this.mysteryConfig.mystery.imageCountLimit // 随机算法 const page = _.random(1, maxPage) const randomIndex = _.random(0, maxPigObj - 1) // 回复 this.reply('确实是吧, 正在探索...') // 请求 let url = `https://www.cos6.net/wp-json/wp/v2/posts?page=${ page }` let images = [] await fetch(url) .then((resp) => { return resp.json() }) .then((json) => { const template = { nickname: this.e.sender.card || this.e.user_id, user_id: this.e.user_id } const content = json[randomIndex].content images = this.getCos6Img(content.rendered) // 洗牌 images = _.shuffle(images) // 限制长度 if (images.length > imageCountLimit) { images = images.slice(1, imageCountLimit + 1) } // 循环队列 for (let i = 0; i < images.length; i++) { images[i] = { message: segment.image(images[i]), ...template } } }) .catch((err) => { this.e.reply('探索失败,你再我去一次吧') logger.error(err) return false }) return !!(await this.reply(await Bot.makeForwardMsg(images))) } async cospro (e) { let req = [ ...await fetch('https://imgapi.cn/cos2.php?return=jsonpro').then((resp) => resp.json()).then((json) => json.imgurls), ...await fetch('https://imgapi.cn/cos.php?return=jsonpro').then((resp) => resp.json()).then((json) => json.imgurls) ] e.reply('哪天克火掉一定是在这个群里面...') let images = [] req.forEach(item => { images.push({ message: segment.image(encodeURI(item)), nickname: this.e.sender.card || this.e.user_id, user_id: this.e.user_id }) }) return !!(await this.reply(await Bot.makeForwardMsg(images))) } async aaa (e) { // https://yingtall.com/wp-json/wp/v2/posts?page=64 // 最大页数 const maxPage = this.mysteryConfig.aaa.maxPage const maxPigObj = this.mysteryConfig.aaa.maxPigObj // 限制最大图片数量 const imageCountLimit = this.mysteryConfig.aaa.imageCountLimit // 随机算法 const page = _.random(1, maxPage) const randomIndex = _.random(0, maxPigObj - 1) // 回复 this.reply('真变态啊...') // 请求 let images = [] let imgData = [] let url = `https://yingtall.com/wp-json/wp/v2/posts?page=${ page }` await fetch(url) .then((resp) => { return resp.json() }) .then((json) => { if (!json.length) { e.reply('探索失败,你再我去一次吧') return false } const content = json[randomIndex].content images = this.getImages2(content.rendered) // 如果图片为空直接返回 if (images.length === 0) { e.reply('探索失败,你再我去一次吧') return false } // 洗牌 images = _.shuffle(images) // 限制长度 if (images.length > imageCountLimit) { images = images.slice(1, imageCountLimit + 1) } // 循环队列 images.forEach((item) => { imgData.push({ message: segment.image(item), nickname: e.sender.card || e.user_id, user_id: e.user_id }) }) }) .catch((err) => logger.error(err)) return !!(await this.reply(await Bot.makeForwardMsg(imgData))) } async setu (e) { const keyword = e.msg.split(' ')[1] const numb = this.mysteryConfig.setu.count await e.reply('正在给你找图片啦~', true, { recallMsg: 7 }); let url = `https://api.lolicon.app/setu/v2?r18=${ keyword }&num=${ numb }`;//←此处修改图片类型,0为非18,1为18,2为18非18混合 const response = await fetch(url); const imgJson = await response.json(); const images = [] for (let image of imgJson.data) { images.push({ message: segment.image(image.urls.original), nickname: e.sender.card || e.user_id, user_id: e.user_id }) } const res = await this.reply( await Bot.makeForwardMsg(images), false, { recallMsg: 60 }) if (!res) { return e.reply('好、好涩(//// ^ ////)……不、不行啦……被、被吞啦o(≧口≦)o',true,{recallMsg:60}); } return true } async tuiimg (e) { const MAX_SIZE = this.mysteryConfig.tuiimg.count this.reply('这群早晚被你整没了...') let images = [] const template = { nickname: this.e.sender.card || this.e.user_id, user_id: this.e.user_id } await mongo.then(conn => { return conn.aggregate([ { $sample: { size: MAX_SIZE } } ]).toArray() }).then((result) => { result.forEach((item) => { images.push({ message: segment.image(item.url), ...template }) }) }) return !!(await this.reply(await Bot.makeForwardMsg(images), false, { recallMsg: recallTime })) } // 正则:获取图片 getCos6Img (string) { const imgRex = /\/([\w].*?).(jpg|JPG|png|PNG|gif|GIF|jpeg|JPEG|svg)/g const images = [] let img while ((img = imgRex.exec(string))) { images.push(`https://www.cos6.net/${ img[1] }.jpg`) } return images } // 正则:获取图片 getImages2 (string) { const imgRex = /]+>/g const images = [] let img while ((img = imgRex.exec(string))) { images.push(img[1]) } return images } }