// 主库
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(/___+/, '请点击查看内容')
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
}
}