Files
yenai-plugin/apps/fun.js
2023-02-02 16:40:58 +08:00

444 lines
15 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import plugin from '../../../lib/plugins/plugin.js'
import fetch from 'node-fetch'
import { segment } from 'oicq'
import lodash from 'lodash'
import { Config } from '../components/index.js'
import { common, uploadRecord, QQInterface, Interface } from '../model/index.js'
const heisitype = {
白丝: { type: 'baisi', page: 17 },
黑丝: { type: 'heisi', page: 43 },
巨乳: { type: 'juru', page: 8 },
jk: { type: 'jk', page: 6 },
网红: { type: 'mcn', page: 36 },
美足: { type: 'meizu', page: 9 }
}
/** API请求错误文案 */
const API_ERROR = '❎ 出错辣,请稍后重试'
/** 未启用文案 */
const SWITCH_ERROR = '主人没有开放这个功能哦(*/ω\*)'
/** 开始执行文案 */
const START_EXECUTION = '椰奶产出中......'
const picapis = Config.getConfig('picApi')
/** 解析匹配模式 */
let picApiKeys = []
lodash.forIn(picapis, (values, key) => {
let mode = values.mode !== undefined ? values.mode : picapis.mode
key = key.split('|').map(item => mode ? '^' + item + '$' : item).join('|')
picApiKeys.push(key)
})
const apiReg = new RegExp(`(${picApiKeys.join('|')}|^jktj$|^接口统计$)`)
export class Fun extends plugin {
constructor () {
super({
name: '椰奶娱乐',
event: 'message',
priority: 500,
rule: [
{
reg: '^#唱歌$',
fnc: 'Sing'
},
{
reg: '^#支付宝到账.*$',
fnc: 'ZFB'
},
{
reg: '^#(([\u4e00-\u9fa5]{2,6})-)?([\u4e00-\u9fa5]{2,6})?翻译(.*)$',
fnc: 'youdao'
},
{
reg: '^#?(我要|给我)?(资料卡)?(点赞|赞我)$',
fnc: 'zan'
},
{
reg: 'github.com/[a-zA-Z0-9-]{1,39}/[a-zA-Z0-9_-]{1,100}',
fnc: 'GH'
},
{
reg: '^#?coser$',
fnc: 'coser'
},
{
reg: `#?来点(${Object.keys(heisitype).join('|')})$`,
fnc: 'heisiwu'
},
{
reg: '^#?铃声搜索.*$',
fnc: 'lingsheng'
},
{
reg: '^#?半次元话题$',
fnc: 'bcy_topic'
},
{
reg: apiReg,
fnc: 'picture'
},
{
reg: '^#?来点神秘图(\\d+|s.*)?$',
fnc: 'mengdui'
},
{
reg: '^#?acg.*$',
fnc: 'acg'
}
]
})
}
/** 随机唱鸭 */
async Sing (e) {
let data = await Interface.randomSinging()
if (data.error) return e.reply(data.error)
await e.reply(await uploadRecord(data.audioUrl, 0, false))
await e.reply(data.lyrics)
}
/** 支付宝语音 */
async ZFB (e) {
let amount = parseFloat(e.msg.replace(/#|支付宝到账|元|圆/g, '').trim())
if (!/^\d+(\.\d{1,2})?$/.test(amount)) return e.reply('你觉得这河里吗!!', true)
if (!(amount >= 0.01 && amount <= 999999999999.99)) {
return e.reply('数字大小超出限制支持范围为0.01~999999999999.99')
}
e.reply([segment.record(`https://mm.cqu.cc/share/zhifubaodaozhang/mp3/${amount}.mp3`)])
}
/** 有道翻译 */
async youdao (e) {
let msg = e.msg.match(/#(([\u4e00-\u9fa5]{2,6})-)?([\u4e00-\u9fa5]{2,6})?翻译(.*)/)
if (!msg) return
if (e.source) {
let source
if (e.isGroup) {
source = (await e.group.getChatHistory(e.source.seq, 1)).pop()
} else {
source = (await e.friend.getChatHistory(e.source.time, 1)).pop()
}
msg[4] = source.message.filter(item => item.type == 'text').map(item => item.text).join('')
}
let results = await Interface.youdao(msg[4], msg[3], msg[2])
return e.reply(results, true)
}
/** 点赞 */
async zan (e) {
if (Bot.config.platform == 3) return e.reply('❎ 手表协议暂不支持点赞请更换协议后重试')
/** 判断是否为好友 */
let isFriend = await Bot.fl.get(e.user_id)
let likeByStrangers = Config.Notice.Strangers_love
if (!isFriend && !likeByStrangers) return e.reply('不加好友不点🙄', true)
/** 点赞成功回复的图片 */
let imgs = [
'https://xiaobai.klizi.cn/API/ce/zan.php?qq=',
// "https://xiaobai.klizi.cn/API/ce/xin.php?qq=",
'http://ovooa.com/API/zan/api.php?QQ=',
'http://api.caonm.net/api/bix/b.php?qq=',
'http://api.caonm.net/api/kan/kan_3.php?qq='
]
/** 一个随机数 */
let random = Math.floor(Math.random() * (imgs.length - 0))
let successImg = segment.image(imgs[random] + e.user_id)
/** 点赞失败的图片 */
let faildsImg = segment.image(`https://xiaobai.klizi.cn/API/ce/paa.php?qq=${e.user_id}`)
/** 执行点赞 */
let n = 0
let failsmsg = '今天已经点过了,还搁这讨赞呢!!!'
while (true) {
// 好友点赞
if (!likeByStrangers || isFriend) {
let res = await Bot.sendLike(e.user_id, 10)
logger.debug(`${e.logFnc}好友点赞`, res)
if (res) {
n += 10
} else break
} else {
// 陌生人点赞
let res = await QQInterface.thumbUp(e.user_id, 10)
logger.debug(`${e.logFnc}陌生人点赞`, res)
if (res.code != 0) {
if (res.code == 1) {
failsmsg = '点赞失败,请检查是否开启陌生人点赞或添加好友'
} else {
failsmsg = res.msg
}
break
} else {
n += 10
}
}
}
/** 回复的消息 */
let successResult = ['\n', `给你点了${n}下哦,记得回我~${isFriend ? '' : '(如点赞失败请添加好友)'}`, successImg]
let faildsResult = ['\n', failsmsg, faildsImg]
/** 判断点赞是否成功 */
let msg = n > 0 ? successResult : faildsResult
/** 回复 */
await e.reply(msg, false, { at: true })
return true
}
// github
async GH (e) {
const api = 'https://opengraph.githubassets.com'
let reg = /github.com\/[a-zA-Z0-9-]{1,39}\/[a-zA-Z0-9_-]{1,100}/
const isMatched = e.msg.match(reg)
const id = 'Yenai'
if (isMatched) {
const res = isMatched[0].split('/')
const [user, repo] = [res[1], res[2].split('#')[0]]
e.reply(segment.image(`${api}/${id}/${user}/${repo}`))
}
return true
}
// coser
async coser (e) {
let { sese, sesepro } = Config.getGroup(e.group_id)
if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR)
e.reply(START_EXECUTION)
const api = 'http://ovooa.com/API/cosplay/api.php'
let res = await fetch(api).then((res) => res.json()).catch((err) => console.error(err))
if (!res) return e.reply(API_ERROR)
res = res.data
let item = 1
let msg = [res.Title]
for (let i of res.data) {
msg.push(segment.image(i))
if (item >= 20) {
break
} else {
item++
}
}
common.getRecallsendMsg(e, msg)
return true
}
// cos/acg搜索
async acg (e) {
let { sese, sesepro } = Config.getGroup(e.group_id)
if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR)
e.reply(START_EXECUTION)
let keywords = e.msg.replace(/#|acg/g, '').trim()
let domain = 'https://www.pandadiu.com'
let url = ''
if (keywords) {
url = `${domain}/index.php?m=search&c=index&a=init&typeid=1&siteid=1&q=${keywords}`
} else {
url = `${domain}/list-31-${lodash.random(1, 177)}.html`
}
// 搜索页面
let search = await fetch(url).then(res => res.text()).catch(err => console.error(err))
let searchlist = search.match(/<a href=".*?" target="_blank">/g)
?.map(item => item.match(/<a href="(.*?)"/)[1])
// 无则返回
if (lodash.isEmpty(searchlist)) return e.reply('哎呦,木有找到', true)
// 图片页面
let imgurl = domain + lodash.sample(searchlist)
let imghtml = await fetch(imgurl).then(res => res.text()).catch(err => console.error(err))
// 处理图片
let imglist = imghtml.match(/<img src=".*?" (style|title)=.*?\/>/g)
?.map(item => (!/www.pandadiu.com/.test(item) ? domain : '') + (item.match(/<img src="(.*?)".*/)[1]))
?.map(item => segment.image(item)) || false
if (!imglist) return e.reply(API_ERROR)
common.getRecallsendMsg(e, imglist)
}
// 黑丝
async heisiwu (e) {
if (!Config.getGroup(e.group_id).sesepro && !e.isMaster) return e.reply(SWITCH_ERROR)
e.reply(START_EXECUTION)
// 获取类型
let { type, page } = heisitype[e.msg.match(/#?来点(.*)/)[1]]
// 请求主页面
let url = `http://hs.heisiwu.com/${type}/page/${lodash.random(1, page)}`
console.log(url)
let homePage = await fetch(url).then(res => res.text()).catch(err => console.error(err))
if (!homePage) return e.reply(API_ERROR)
// 解析html
let childPageUrlList = homePage.match(/<a target(.*?)html/g)
let childPageUrl = lodash.sample(childPageUrlList).match(/href="(.*)/)
// 请求图片页面
let childPage = await fetch(childPageUrl[1]).then(res => res.text()).catch(err => console.error(err))
if (!childPage) return e.reply(API_ERROR)
// 获取html列表
let imghtml = childPage.match(/<img loading(.*?)jpg/g)
// 提取图片并转换
let imglist = imghtml.map(item => {
item = segment.image(item.match(/src="(.*)/)[1])
item.headers = {
Referer: 'http://hs.heisiwu.com',
'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'
}
return item
})
// 发送消息
common.getRecallsendMsg(e, lodash.take(imglist, 20))
}
// 萌堆
async mengdui (e) {
if (!Config.getGroup(e.group_id).sesepro && !e.isMaster) return e.reply(SWITCH_ERROR)
let domain = 'https://b8m9.com'
// 开始执行
e.reply(START_EXECUTION)
let url = ''
let appoint = ''
if (/#?来点神秘图s/.test(e.msg)) {
let keywords = e.msg.match(/#?来点神秘图s(.*)/)[1]
let mengduipage = JSON.parse(await redis.get('yenai:mengduipage')) || {}
let randomPage = lodash.random(1, mengduipage[keywords] || 1)
let searchurl = `${domain}/search.php?mdact=community&q=${keywords}&page=${randomPage}`
let search = await fetch(searchurl).then(res => res.text())
let searchList = lodash.uniq(search.match(/https?:\/\/.*?\.com\/post\/\d+.html/g))
if (lodash.isEmpty(searchList)) {
let ERROR = search.match(/抱歉,未找到(.*)相关内容,建议简化一下搜索的关键词|搜索频率太快,请等一等再尝试!/)
return ERROR ? e.reply(ERROR[0]?.replace(/<.*?>/g, '') || '未找到相关内容') : e.reply('未找到相关内容')
}
// 保存该关键词的最大页数
let searchpage = Math.max(...search.match(/<a href=".*?" class="(now-page)?">(\d+)<\/a>/g)?.map(item => item.match(/<a href=".*?" class="(now-page)?">(\d+)<\/a>/)[2])) || 1
mengduipage[keywords] = searchpage
await redis.set('yenai:mengduipage', JSON.stringify(mengduipage))
url = lodash.sample(searchList)
} else {
appoint = e.msg.match(/\d+/g)
let random
if (!appoint) {
random = lodash.random(1, 11687)
while (lodash.inRange(random, 7886, 10136)) {
random = lodash.random(1, 11687)
}
} else {
random = appoint[0]
}
url = `${domain}/post/${random}.html`
}
let res = await fetch(url).then(res => res.text()).catch(err => console.error(err))
let div = res.match(/<div class="md-text mb20 f-16">[\s\S]+?<\/div>/)
let title = res.match(/<h1.*?>(.*?)</)
if (!div) return e.reply('未获取到图片,请稍后重试')
let list = div[0].match(/https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*/ig)
if (!list) {
if (!appoint) {
return e.reply('可能超过今日限制,请稍后再试', true)
} else {
return e.reply('请检查指定是否正确', true)
}
}
let msg = lodash.take(list.map(item => segment.image(item)), 30)
if (title) msg.unshift(title[1])
common.getRecallsendMsg(e, msg)
}
// 铃声多多
async lingsheng (e) {
let msg = e.msg.replace(/#|铃声搜索/g, '')
let api = `https://xiaobai.klizi.cn/API/music/lingsheng.php?msg=${msg}&n=1`
let res = await fetch(api).then(res => res.json()).catch(err => console.log(err))
if (!res) return e.reply(API_ERROR)
if (res.title == null && res.author == null) return e.reply('❎ 没有找到相关的歌曲哦~', true)
await e.reply([
`标题:${res.title}\n`,
`作者:${res.author}`
])
await e.reply(await uploadRecord(res.aac, 0, false))
}
/** 半次元话题 */
async bcy_topic (e) {
let api = 'https://xiaobai.klizi.cn/API/other/bcy_topic.php'
let res = await fetch(api).then(res => res.json()).catch(err => console.log(err))
if (!res) return e.reply(API_ERROR)
if (res.code != 200) return e.reply('❎ 出错辣' + JSON.stringify(res))
if (lodash.isEmpty(res.data)) return e.reply('请求错误!无数据,请稍后再试')
let msg = []
for (let i of res.data) {
if (!i.title || lodash.isEmpty(i.image)) continue
msg.push(i.title)
msg.push(i.image.map(item => segment.image(item)))
}
if (lodash.isEmpty(msg)) return this.bcy_topic(e)
common.getforwardMsg(e, msg)
}
// api大集合
async picture (e) {
let { sese, sesepro } = Config.getGroup(e.group_id)
if (!sese && !sesepro && !e.isMaster) return false
let key = 'yenai:apiAggregate:CD'
if (await redis.get(key)) return false
if (/jktj|接口统计/.test(e.msg)) {
let msg = ['现接口数量如下']
for (let i in picapis) {
if (i == 'mode') continue
let urls = picapis[i].url || picapis[i]
msg.push(`\n${i} => ${Array.isArray(urls) ? urls.length : 1}`)
}
return e.reply(msg)
}
// 解析消息中的类型
let regRet = apiReg.exec(e.msg)
if (regRet[1] == 'mode') return false
let picObj = picapis[lodash.sample(Object.keys(picapis).filter(item => new RegExp(item).test(regRet[1])))]
if (Array.isArray(picObj)) picObj = lodash.sample(picObj)
let urlReg = /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i
if (!picObj.url && !urlReg.test(encodeURI(picObj)) && !Array.isArray(picObj)) {
return logger.error(`${e.logFnc}未找到url`)
}
if (picObj.type !== 'image' && picObj.type !== 'text' && picObj.type !== 'json' && picObj.type) {
return logger.error(`${e.logFnc}类型不正确`)
}
let url = encodeURI(picObj.url || picObj)
// 数组随机取或指定
if (Array.isArray(url)) {
// url = (regRet[2] ? picObj[regRet[2] - 1] : lodash.sample(url)) || lodash.sample(url)
url = lodash.sample(url)
}
if (picObj.type == 'text') {
url = await fetch(url).then(res => res.text()).catch(err => console.log(err))
} else if (picObj.type == 'json') {
if (!picObj.path) return logger.error(`${e.logFnc}json未指定路径`)
let res = await fetch(url).then(res => res.json()).catch(err => console.log(err))
url = lodash.get(res, picObj.path)
}
if (!url) return logger.error(`${e.logFnc}未获取到图片链接`)
logger.debug(`${e.logFnc}使用接口:${url}`)
common.recallsendMsg(e, segment.image(url))
redis.set(key, 'cd', { EX: 2 })
}
}