diff --git a/apps/assistant.js b/apps/assistant.js index cd0f6e6..e7f23f8 100644 --- a/apps/assistant.js +++ b/apps/assistant.js @@ -99,10 +99,6 @@ export class example extends plugin { reg: '^#获取(群|好友)列表$', fnc: 'Grouplist' }, - { - reg: '^#群星级$', - fnc: 'Group_xj' - }, { reg: '^#(开启|关闭)戳一戳$', fnc: 'cyc' @@ -686,72 +682,33 @@ export class example extends plugin { async Grouplist(e) { if (!e.isMaster) return; - let listMap; - let message = []; - let list = [] - let yes = false + let msg = []; if (/群列表/.test(e.msg)) { //获取群列表并转换为数组 - listMap = Array.from(Bot.gl.values()) + let listMap = Array.from(Bot.gl.values()) //添加有几个群 - message.push(`群列表如下,共${listMap.length}个群`) + msg.push(`群列表如下,共${listMap.length}个群`) //遍历添加 - listMap.forEach((item, index) => { - list.push(`${index + 1}、${item.group_name}(${item.group_id})\n`) - }) - yes = true + msg.push(listMap.map((item, index) => `${index + 1}、${item.group_name}(${item.group_id})`).join("\n")) + //提示信息 + msg.push("可使用 #退群123456789 来退出某群") + msg.push("可使用 #发群列表 <序号> <消息> 来快速发送消息") + msg.push(`多个群聊请用 "," 分隔 不能大于3 容易寄`) } else if (/好友列表/.test(e.msg)) { //获取好友列表并转换为数组 - listMap = Array.from(Bot.fl.values()) + let listMap = Array.from(Bot.fl.values()) //添加有多少个好友 - message.push(`好友列表如下,共${listMap.length}个好友`) + msg.push(`好友列表如下,共${listMap.length}个好友`) //遍历添加 - listMap.forEach((item, index) => { - list.push(`${index + 1}、${item.nickname}(${item.user_id})\n`) - }) + msg.push(listMap.map((item, index) => `${index + 1}、${item.nickname}(${item.user_id})`).join("\n")) + //提示信息 + msg.push("可使用 #删好友123456789 来删除某人") } - //去除最后一个的换行符 - list[list.length - 1] = list[list.length - 1].replace(/\n/, "") - message.push(list) - if (yes) { - message.push("可使用 #退群123456789 来退出某群") - message.push("可使用 #发群列表 <序号> <消息> 来快速发送消息") - message.push(`多个群聊请用 "," 分隔 不能大于3 容易寄`) - } else { - message.push("可使用 #删好友123456789 来删除某人") - } - - Cfg.getforwardMsg(e, message) - - return true + Cfg.getforwardMsg(e, msg) } - /**群星级 */ - async Group_xj(e) { - if (e.isPrivate) return e.reply("请在群聊使用哦~") - if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) return; - - QQInterface.getGroup_xj(e) - } - - /**戳一戳 */ - async cyc(e) { - if (!e.isMaster) return; - - let yes = 1; - if (/开启/.test(e.msg)) yes = 0; - let ck = Cfg.getck("vip.qq.com") - let url = `http://xiaobai.klizi.cn/API/qqgn/qun_cyc.php?uin=${Bot.uin}&skey=${ck.skey}&pskey=${ck.p_skey}&switch=${yes}` - - let result = await fetch(url).then(res => res.json()).catch(err => console.log(err)) - - if (!result) return e.reply("❎ 接口失效") - - e.reply(`✅ 已${yes ? '关闭' : '开启'}戳一戳功能`) - - } //引用撤回 async recallMsgown(e) { if (!e.source) return @@ -795,31 +752,38 @@ export class example extends plugin { } if (e.isGroup) await e.recall(); } + //开关好友添加 async friend_switch(e) { if (!e.isMaster) return - let ck = Cfg.getck("ti.qq.com") - let api = `http://xiaobai.klizi.cn/API/qqgn/friend_switch.php?uin=${Bot.uin}&skey=${ck.skey}&pskey=${ck.p_skey}&type=${/开启/.test(e.msg) ? 1 : 2}` - let res = await fetch(api).then(res => res.json()).catch(err => console.log(err)) + let res = await QQInterface.addFriendSwitch(/开启/.test(e.msg) ? 1 : 2) if (!res) return e.reply("接口失效辣(๑ŐдŐ)b") e.reply(res.ActionStatus) } + //好友申请方式 async friend_type(e) { if (!e.isMaster) return let regRet = friend_typeReg.exec(e.msg) - let ck = Cfg.getck("ti.qq.com") - if (regRet[1] == 0) return e.reply("1为允许所有人,2为需要验证,3为问答正确问答(需填参数question,answer)") + if (regRet[1] == 0) return e.reply("1为允许所有人,2为需要验证,3为问答正确问答(需填问题和答案,格式为:#更改好友申请方式3 问题 答案)") //单独处理 - let isproblem = ''; - if (regRet[1] == 3) { - if (!regRet[3] && !regRet[4]) return e.reply("❎ 请正确输入问题和答案!") - isproblem = `&question=${regRet[3]}&answer=${regRet[4]}` - } - let api = `http://xiaobai.klizi.cn/API/qqgn/friend_type.php?uin=${Bot.uin}&skey=${ck.skey}&pskey=${ck.p_skey}&type=${regRet[1]}${isproblem}` - let res = await fetch(api).then(res => res.json()).catch(err => console.log(err)) + if ((!regRet[3] || !regRet[4]) && regRet[1] == 3) return e.reply("❎ 请正确输入问题和答案!") + + let res = await QQInterface.setFriendType(regRet[1], regRet[3], regRet[4]) if (!res) return e.reply("接口失效辣(๑ŐдŐ)b") + if (res.ec != 0) return e.reply("❎ 修改失败\n" + JSON.stringify(res)) e.reply(res.msg) } + /**开关戳一戳 */ + async cyc(e) { + if (!e.isMaster) return; + + let result = await QQInterface.setcyc(/开启/.test(e.msg) ? 0 : 1) + if (!result) return e.reply("❎ 接口失效") + + if (result.ret != 0) return e.reply("❎ 未知错误\n" + JSON.stringify(result)) + e.reply(`✅ 已${/开启/.test(e.msg) ? '开启' : '关闭'}戳一戳功能`) + } + } diff --git a/apps/gp_admin.js b/apps/gp_admin.js index 36a8b08..dbc5e01 100644 --- a/apps/gp_admin.js +++ b/apps/gp_admin.js @@ -51,15 +51,15 @@ export class Basics extends plugin { }, { reg: '^#发群公告.*$', - fnc: 'Announce' + fnc: 'AddAnnounce' + }, + { + reg: '^#删群公告(\\d+)$', + fnc: 'DelAnnounce' }, { reg: '^#查群公告$', - fnc: 'DelAnnounce' - }, - { - reg: '^#删群公告.*$', - fnc: 'DelAnnounce' + fnc: 'GetAnnounce' }, { reg: '^#修改头衔.*$', @@ -129,6 +129,10 @@ export class Basics extends plugin { reg: "^#?(谁|哪个吊毛|哪个屌毛|哪个叼毛)是龙王$", fnc: 'dragonKing' }, + { + reg: '^#群星级$', + fnc: 'Group_xj' + }, ] }) @@ -416,72 +420,51 @@ export class Basics extends plugin { } //发群公告 - async Announce(e) { - - if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) { - return e.reply("❎ 该命令仅限管理员可用", true); - } + async AddAnnounce(e) { //判断是否有管理 if (!e.group.is_admin && !e.group.is_owner) { return e.reply("做不到,怎么想我都做不到吧ヽ(≧Д≦)ノ", true); } + //判断权限 + if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) { + return e.reply("❎ 该命令仅限管理员可用", true); + } + //获取发送的内容 let msg = e.msg.replace(/#|发群公告/g, "").trim() - if (!msg) return e.reply("❎ 公告不能为空"); - let ck = Cfg.getck("qun.qq.com") + let result = await QQInterface.setAnnounce(e.group_id, msg) - let url = `http://xiaobai.klizi.cn/API/qqgn/gg_send.php?data=&skey=${ck.skey}&pskey=${ck.p_skey}&uin=${Bot.uin}&group=${e.group_id}&text=${msg}` - - let result = await fetch(url).then(res => res.json()).catch(err => console.log(err)) - if (!result) return e.reply("❎ 接口出错") - - if (result.ec == 0) { - e.reply("✅ 已发送群公告,群员们要好好看哦~") - } else { - e.reply("❎ 发送失败") + if (!result) return e.reply("❎ 出错辣,请稍后重试"); + if (result.ec != 0) { + e.reply("❎ 发送失败\n" + JSON.stringify(result, null, '\t')) } - return true; - } - - //查群公告+删群公告 + //查群公告 + async GetAnnounce(e) { + if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) { + return e.reply("❎ 该命令仅限管理员可用", true); + } + let res = await QQInterface.getAnnouncelist(e.group_id) + if (!res) return e.reply("❎ 出错辣,请稍后重试"); + return e.reply(res) + } + //删群公告 async DelAnnounce(e) { if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) { return e.reply("❎ 该命令仅限管理员可用", true); } - if (/查群公告/.test(e.msg)) { - let res = await Gpadmin.getAnnouncelist(e) - if (!res) return; - await e.reply(res) - return; - } - let msg = e.msg.replace(/#|删群公告/, "").trim() - if (!msg) return e.reply(`❎ 序号不可为空`) - msg = msg.match(/\d/) + let result = await QQInterface.delAnnounce(e.group_id, msg) + if (!result) return e.reply("❎ 出错辣,请稍后重试"); - if (!msg) return e.reply(`❎ 请检查序号是否正确`) - - let ck = Cfg.getck("qun.qq.com") - - let list = await Gpadmin.getAnnouncelist(e, msg) - - if (!list) return; - - let url = `http://xiaobai.klizi.cn/API/qqgn/gg_delete.php?data=&skey=${ck.skey}&pskey=${ck.p_skey}&uin=${Bot.uin}&group=${e.group_id}&fid=${list.fid}` - - let result = await fetch(url).then(res => res.json()) - .catch(err => console.log(err)) - - if (!result) return e.reply("接口失效辣!!!") if (result.ec == 0) { - e.reply("✅ 已删除这个公告哦~") + e.reply(`✅ 已删除「${result.text}」`) } else { - e.reply("❎ 删除失败") + e.reply("❎ 删除失败\n" + JSON.stringify(result, null, '\t')) } } @@ -768,4 +751,18 @@ export class Basics extends plugin { `蝉联天数:${res.desc}`, ]); } + /**群星级 */ + async Group_xj(e) { + let result = await QQInterface.getCreditLevelInfo(e.group_id) + if (!result) return e.reply("❎ 接口失效") + if (result.ec != 0) return e.reply("❎ 查询错误\n" + JSON.stringify(result)) + let { uiGroupLevel, group_name, group_uin } = result.info + let str = "⭐" + str = str.repeat(uiGroupLevel) + e.reply([ + `群名:${group_name}\n`, + `群号:${group_uin}\n`, + `群星级:${str}` + ]) + } } diff --git a/apps/pixiv.js b/apps/pixiv.js index 5c733d6..48d7156 100644 --- a/apps/pixiv.js +++ b/apps/pixiv.js @@ -25,15 +25,15 @@ export class example extends plugin { }, { reg: rankingrReg, - fnc: 'PixivRanking' + fnc: 'pixivRanking' }, { reg: tagReg, - fnc: 'Tags' + fnc: 'saucenaoTags' }, { reg: '^#?(查看|获取)?热门(t|T)(a|A)(g|G)$', - fnc: 'trend_tags' + fnc: 'trendTags' }, { reg: uidReg, @@ -41,15 +41,15 @@ export class example extends plugin { }, { reg: randomImgReg, - fnc: 'randomimg' + fnc: 'randomImg' }, { reg: relatedReg, - fnc: 'related_works' + fnc: 'relatedWorks' }, { reg: '^#?(P|p)ximg(pro)?$', - fnc: 'Pximg' + fnc: 'pximg' }, ] }) @@ -79,7 +79,7 @@ export class example extends plugin { } //p站排行榜 - async PixivRanking(e) { + async pixivRanking(e) { let regRet = rankingrReg.exec(e.msg) if (!e.isMaster) { if (!Config.getGroup(e.group_id).sese || regRet[4] && !await setu.getr18(e)) return e.reply("主人没有开放这个功能哦(*/ω\*)") @@ -104,7 +104,7 @@ export class example extends plugin { } /**关键词搜图 */ - async Tags(e) { + async saucenaoTags(e) { let regRet = tagReg.exec(e.msg) if (!e.isMaster) { @@ -138,7 +138,7 @@ export class example extends plugin { return true; } /**获取热门tag */ - async trend_tags(e) { + async trendTags(e) { if (!e.isMaster) { if (!Config.getGroup(e.group_id).sese) return e.reply("主人没有开放这个功能哦(*/ω\*)") } @@ -182,7 +182,7 @@ export class example extends plugin { } //随机原创插画 - async randomimg(e) { + async randomImg(e) { if (!e.isMaster) { if (!Config.getGroup(e.group_id).sese) return e.reply("主人没有开放这个功能哦(*/ω\*)") } @@ -204,7 +204,7 @@ export class example extends plugin { } //相关作品 - async related_works(e) { + async relatedWorks(e) { if (!e.isMaster) { if (!Config.getGroup(e.group_id).sese) return e.reply("主人没有开放这个功能哦(*/ω\*)") } @@ -216,7 +216,7 @@ export class example extends plugin { } //p站单图 - async Pximg(e) { + async pximg(e) { let pro = /pro/.test(e.msg) if (!e.isMaster) { if (!Config.getGroup(e.group_id).sese || !Config.getGroup(e.group_id).sesepro && pro) { diff --git a/model/Group_admin.js b/model/Group_admin.js index bb87c10..e70e149 100644 --- a/model/Group_admin.js +++ b/model/Group_admin.js @@ -8,27 +8,7 @@ class Group_admin { constructor() { this.ck = Cfg.getck("qun.qq.com"); } - /** - * @description: 获取群公告 - * @param {String} group 群号 - * @param {String} item 序号 - * @return {Object} - */ - async getAnnouncelist(e, item = "") { - let ck = this.ck - let url = `http://xiaobai.klizi.cn/API/qqgn/qun_gg.php?data=&skey=${ck.skey}&pskey=${ck.p_skey}&uin=${Bot.uin}&group=${e.group_id}&n=${item}` - let result = await fetch(url).then(res => res.text()).catch(err => console.log(err)) - - if (!result) return false - - if (item) { - return JSON.parse(result) - } else { - return result - } - - } /** * @description: 幸运字符抽取和列表 * @param {*} e oicq diff --git a/model/QQInterface.js b/model/QQInterface.js index 782f97e..a8f39cd 100644 --- a/model/QQInterface.js +++ b/model/QQInterface.js @@ -94,22 +94,15 @@ export default new class assistant { } /**群星级 */ - async getGroup_xj(e) { - let ck = Cfg.getck("qqweb.qq.com") - - let url = `http://xiaobai.klizi.cn/API/qqgn/qun_xj.php?data=&uin=${Bot.uin}&skey=${ck.skey}&pskey=${ck.p_skey}&group=${e.group_id}` - - let result = await fetch(url).then(res => res.json()).catch(err => console.log(err)) - - if (!result) return e.reply("❎ 接口失效") - - let str = "⭐" - str = str.repeat(result.uiGroupLevel) - e.reply([ - `群名:${result.group_name}\n`, - `群号:${result.group_uin}\n`, - `群星级:${str}` - ]) + async getCreditLevelInfo(group_id) { + let url = `https://qqweb.qq.com/c/activedata/get_credit_level_info?bkn=${Bot.bkn}&uin=${Bot.uin}&gc=${group_id}` + return await fetch(url, { + headers: { + "Cookie": Bot.cookies["qqweb.qq.com"], + "Referer": `https://qqweb.qq.com/m/business/qunlevel/index.html?gc=${group_id}&from=0&_wv=1027`, + "User-agent": "Mozilla/5.0 (Linux; Android 12; M2012K11AC Build/SKQ1.220303.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.72 MQQBrowser/6.2 TBS/046141 Mobile Safari/537.36 V1_AND_SQ_8.3.9_350_TIM_D QQ/3.5.0.3148 NetType/WIFI WebP/0.3.0 Pixel/1080 StatusBarHeight/81 SimpleUISwitch/0 QQTheme/1015712" + } + }).then(res => res.json()).catch(err => console.error(err)) } /**查看本群龙王 */ @@ -125,4 +118,140 @@ export default new class assistant { desc } } + + /** + * @description: 获取群公告 + * @param {String} group 群号 + * @param {String} item 序号 + * @return {Object} + */ + async getAnnouncelist(group_id, s = 0) { + let n = s ? 1 : 20; + let url = `https://web.qun.qq.com/cgi-bin/announce/get_t_list?bkn=${Bot.bkn}&qid=${group_id}&ft=23&s=${s - 1}&n=${n}` + let res = await fetch(url, { headers: { "Cookie": Bot.cookies["qun.qq.com"], } }).then(res => res.json()).catch(err => console.error(err)) + if (!res) return false; + if (s) { + return { + text: res.feeds[0].msg.text, + fid: res.feeds[0].fid + } + } else { + return res.feeds.map((item, index) => `${index + 1}、${lodash.truncate(item.msg.text)}`).join('\n') + } + + } + /** + * @description: 发送群公告 + * @param {Number} group_id 发送群号 + * @param {String} msg 发送内容 + */ + async setAnnounce(group_id, msg) { + let url = `https://web.qun.qq.com/cgi-bin/announce/add_qun_notice?bkn=${Bot.bkn}` + return await fetch(url, { + method: 'POST', + body: `qid=${group_id}&bkn=${Bot.bkn}&text=${msg}&pinned=0&type=1&settings={"is_show_edit_card":1,"tip_window_type":1,"confirm_required":1}`, + headers: { + "Cookie": Bot.cookies["qun.qq.com"], + } + }).then(res => res.json()).catch(err => console.error(err)) + } + /** + * @description: 删群公告 + * @param {Number} group_id 群号 + * @param {Number} num 序号 + */ + async delAnnounce(group_id, num) { + let fid = await this.getAnnouncelist(group_id, num) + if (!fid) return false; + + let url = `https://web.qun.qq.com/cgi-bin/announce/del_feed?bkn=${Bot.bkn}` + let res = await fetch(url, { + method: 'POST', + body: `bkn=${Bot.bkn}&fid=${fid.fid}&qid=${group_id}`, + headers: { + "Cookie": Bot.cookies["qun.qq.com"], + } + }).then(res => res.json()).catch(err => console.error(err)) + return { + ...res, + text: lodash.truncate(fid.text) + } + } + /** + * @description: 开关好友添加 + * @param {Number} type 1关闭2开启 + */ + async addFriendSwitch(type) { + let url = `https://ti.qq.com/proxy/domain/oidb.tim.qq.com/v3/oidbinterface/oidb_0x587_75?sdkappid=39998&actype=2&bkn=${Bot.bkn}` + return await fetch(url, { + method: "POST", + body: JSON.stringify({ + "uint32_allow": type + }), + headers: { + "Cookie": Bot.cookies["ti.qq.com"], + "Content-type": "application/json", + } + }).then(res => res.json()).catch(err => console.error(err)) + } + /** + * @description: 更改好友申请方式 + * @param {*} at 类型1 + * @param {*} q + * @param {*} a + * @return {*} + */ + async setFriendType(at, q = "", a = "") { + const type = { + '1': '0', + '2': '1', + '3': '3' + } + let url = `https://ti.qq.com/cgi-node/friend-auth/set` + return await fetch(url, { + method: "POST", + body: JSON.stringify({ + "req": `{"at": ${type[at]},"q": "${q}","a": "${a}","l": [],"viaphone": 0}` + }), + headers: { + "Cookie": Bot.cookies["ti.qq.com"], + "Content-type": "application/json", + } + }).then(res => res.json()).catch(err => console.error(err)) + } + /** + * @description: 设置戳一戳开关 + * @param {Number} is 0为开启1为关闭 + */ + async setcyc(is) { + let url = `https://zb.vip.qq.com/srf/QC_UniBusinessLogicServer_UniBusinessLogicObj/uniSet?g_tk=${Bot.bkn}` + return await fetch(url, { + method: "POST", + body: JSON.stringify({ + "stLogin": { + "iKeyType": 1, + "iOpplat": 2, + "lUin": Bot.uin, + "sClientIp": "", + "sClientVer": "8.9.10", + "sSKey": "MGOy0oTuvl" + }, + "stUniBusinessItem": { + "appid": 46, + "itemid": 1 + }, + "stNudge": { + "ischangeswitch": 1, + "isclose": is, + "ischangecustomtext": 1, + "customtext": "" + } + } + ), + headers: { + "Cookie": Bot.cookies["vip.qq.com"], + "Content-type": "application/json", + } + }).then(res => res.json()).catch(err => console.error(err)) + } } \ No newline at end of file