From 202366dbd2f8f3ee2bd43bd6abb4c7e4796383c6 Mon Sep 17 00:00:00 2001 From: qq_21051503 Date: Thu, 15 Feb 2024 16:53:00 +0800 Subject: [PATCH] Thu Feb 15 16:53:00 CST 2024 inscode --- index.js | 514 +++++++++++++++++++++++++++---------------------------- 1 file changed, 257 insertions(+), 257 deletions(-) diff --git a/index.js b/index.js index 89eea61..e7e7653 100644 --- a/index.js +++ b/index.js @@ -4,286 +4,286 @@ //1、微信扫码(17年注册的微信可以直接扫,17年后注册的微信自己要绑定手机号和个人认证下,我记得还要开通收付款。) //2、本机器人只适用于微信群聊时触发,私聊无法触发 //3、扫码之后,在群里@小白+关键字(比如@小白抽签,或者小白厦门天气,所有关键字在) -process.on('uncaughtException', function(err) { - console.log('Caught exception: ' + err); +process.on('uncaughtException', function (err) { + console.log('Caught exception: ' + err); }); -import {FileBox} from 'file-box' +import { FileBox } from 'file-box' import QrcodeTerminal from 'qrcode-terminal' import axios from "axios" -import {WechatyBuilder} from 'wechaty' +import { WechatyBuilder } from 'wechaty' const ajax = async (url, param, type) => { - return new Promise((resolve, reject) => { - var axiosOption = { - method: type ? type : "get", - url: url, - data: param, - timeout: 0, // 10秒 - headers: { - 'Content-Type': 'application/json;charset=utf-8' - } - } - axios(axiosOption).then(function(res) { - resolve(res) - }).catch(error => { - console.log(error) - }) - }) + return new Promise((resolve, reject) => { + var axiosOption = { + method: type ? type : "get", + url: url, + data: param, + timeout: 0, // 10秒 + headers: { + 'Content-Type': 'application/json;charset=utf-8' + } + } + axios(axiosOption).then(function (res) { + resolve(res) + }).catch(error => { + console.log(error) + }) + }) } const page = { - data: { - // qunArr:[ + data: { + // qunArr:[ // "北京web前后端、ui交流群", // "公众号:程序员野区群", // "小程序:程序员实用资源群", // "视频号:程序员整活日常群", // ], - token: "bwT9c8eYI6AHu23EYofE8HOPZ7meY7", - signature: null, - wechaty: null - }, - async mounted() { - let m = this; - await m.methods.wxjqrInit(); - this.methods.wechatyInit(); - }, - methods: { - //微信机器人登录 - wxjqrInit() { - return new Promise(async (resolve, reject) => { - let res = await ajax("https://chatbot.weixin.qq.com/openapi/sign/" + page.data.token, { - userid: 1 - }, "post") - page.data.signature = res.data.signature; - resolve() - }); - }, - async wechatyInit() { - page.data.wechaty = WechatyBuilder.build() - page.data.wechaty.on('scan', (qrcode, status) => { - console.log("开发教程地址:https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI1NjAxODkzMg==&action=getalbum&album_id=3102070220246171651&scene=173&from_msgid=2572037584&from_itemidx=1&count=3&nolastread=1&uin=&key=&devicetype=Windows+10+x64&version=6309071d&lang=zh_CN&ascene=0") - console.log(`目前关键字有["抽签", "天气", "讲笑话", "讲情话", "梦到", "解第", "动漫图", "去水印-", "历史今天", "星座-", "答案", "转语音-", "黄历"]`) - console.log("1、微信扫码(17年注册的微信可以直接扫,17年后注册的微信自己要绑定手机号和个人认证下,我记得还要开通收付款。)\n2、把自己的的机器人拉个群聊\n3、你发送@小白抽签、@小白厦门天气、@小白动漫图"); + token: "bwT9c8eYI6AHu23EYofE8HOPZ7meY7", + signature: null, + wechaty: null + }, + async mounted() { + let m = this; + await m.methods.wxjqrInit(); + this.methods.wechatyInit(); + }, + methods: { + //微信机器人登录 + wxjqrInit() { + return new Promise(async (resolve, reject) => { + let res = await ajax("https://chatbot.weixin.qq.com/openapi/sign/" + page.data.token, { + userid: 1 + }, "post") + page.data.signature = res.data.signature; + resolve() + }); + }, + async wechatyInit() { + page.data.wechaty = WechatyBuilder.build() + page.data.wechaty.on('scan', (qrcode, status) => { + console.log("开发教程地址:https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI1NjAxODkzMg==&action=getalbum&album_id=3102070220246171651&scene=173&from_msgid=2572037584&from_itemidx=1&count=3&nolastread=1&uin=&key=&devicetype=Windows+10+x64&version=6309071d&lang=zh_CN&ascene=0") + console.log(`目前关键字有["抽签", "天气", "讲笑话", "讲情话", "梦到", "解第", "动漫图", "去水印-", "历史今天", "星座-", "答案", "转语音-", "黄历"]`) + console.log("1、微信扫码(17年注册的微信可以直接扫,17年后注册的微信自己要绑定手机号和个人认证下,我记得还要开通收付款。)\n2、把自己的的机器人拉个群聊\n3、你发送@小白抽签、@小白厦门天气、@小白动漫图"); - QrcodeTerminal.generate(qrcode, { - small: true - }) + QrcodeTerminal.generate(qrcode, { + small: true }) - .on('login', user => { - console.log('登录成功:' + user) - }) - .on('message', async msg => { - page.methods.message(msg,false,1) - }) - .start() - }, - async message(msg, isTest,role) { + }) + .on('login', user => { + console.log('登录成功:' + user) + }) + .on('message', async msg => { + page.methods.message(msg, false, 1) + }) + .start() + }, + async message(msg, isTest, role) { // msg是 接收到的信息、 //isTest其实原来有测试的PuppetMock 可以参考博主 博主写的这篇https://mp.weixin.qq.com/s/nhchTzEcxramFTS_0CyU1g //role是为了你一次性启动多个机器人预留的 参考博主这篇https://mp.weixin.qq.com/s/r75D51GUXKgPSLCub38OfA - let text = msg.text() //获取聊天内容 - let room = msg.room() //获取房间信息 - let userNice=msg.talker(); - let msgType = msg.type() //7 是文本 6是图片 8是视频 https://wechaty.js.org/zh/docs/api/message - if (text.length == 0 || !room) { - return; - } - if (isTest) { - var topic = await room.topic() //房间名 - text = text.replace(/\s*/g, '').replace(/@小白/g, ''); - userEvent.init(room, text); - return; - } - if (room && text.length > 0) { - var topic = await room.topic() //房间名 - // if (page.data.qunArr.indexOf(topic)!=-1 ) { - switch(role){ - case 1: - if(text.indexOf("@小白") != -1){//这里可以定义你的触发条件,比如 @小白你好啊 识别到小白,才触发机器人的自动回复 - text = text.replace(/\s*/g, '').replace(/@小白/g, '');//这里可以定义你的触发条件,比如 @小白你好啊 识别到小白,才触发机器人的自动回复 - userEvent.init(room, text)//注意,每次有接收到群消息都会回复 - } - break; - } - - - // }//这里是给你过滤 触发回复信息的 房间名,为了方便大家测试,所以我这边先备注掉,记住, - } - } - } + let text = msg.text() //获取聊天内容 + let room = msg.room() //获取房间信息 + let userNice = msg.talker(); + let msgType = msg.type() //7 是文本 6是图片 8是视频 https://wechaty.js.org/zh/docs/api/message + if (text.length == 0 || !room) { + return; + } + if (isTest) { + var topic = await room.topic() //房间名 + text = text.replace(/\s*/g, '').replace(/@小白/g, ''); + userEvent.init(room, text); + return; + } + if (room && text.length > 0) { + var topic = await room.topic() //房间名 + // if (page.data.qunArr.indexOf(topic)!=-1 ) { + switch (role) { + case 1: + if (text.indexOf("@小白") != -1) {//这里可以定义你的触发条件,比如 @小白你好啊 识别到小白,才触发机器人的自动回复 + text = text.replace(/\s*/g, '').replace(/@小白/g, '');//这里可以定义你的触发条件,比如 @小白你好啊 识别到小白,才触发机器人的自动回复 + userEvent.init(room, text)//注意,每次有接收到群消息都会回复 + } + break; + } + + + // }//这里是给你过滤 触发回复信息的 房间名,为了方便大家测试,所以我这边先备注掉,记住, + } + } + } } page.mounted(); //用户事件处理 var wechatyplay = null const userEvent = { - setSize: 0, - async init(room, msg) { - let m = this; + setSize: 0, + async init(room, msg) { + let m = this; //更多api 可以在公众号教程里找到https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI1NjAxODkzMg== - let arr = ["抽签", "天气", "讲笑话", "讲情话", "梦到", "解第", "动漫图", "去水印-", "历史今天", "星座-", "答案", "转语音-", "黄历"] // - let arrIndex = -1 - let text = "" - arr.some((v, i) => { - let isTrue = msg.indexOf(v) != -1 - if (isTrue) { - arrIndex = i; - text = msg.replace(new RegExp(v, "g"), '') - } - return isTrue - }) + let arr = ["抽签", "天气", "讲笑话", "讲情话", "梦到", "解第", "动漫图", "去水印-", "历史今天", "星座-", "答案", "转语音-", "黄历"] // + let arrIndex = -1 + let text = "" + arr.some((v, i) => { + let isTrue = msg.indexOf(v) != -1 + if (isTrue) { + arrIndex = i; + text = msg.replace(new RegExp(v, "g"), '') + } + return isTrue + }) + + switch (arrIndex) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + m.weixinChatbot(room, msg); + break; + case 6: + m.animationPic(room, text); + break; + case 7: + m.qsy(room, text); + break; + case 8: + m.history(room); + break; + case 9: + m.constellation(room, text); + break; + case 10: + m.answer(room, text); + break; + case 11: + m.toVoice(room, text); + break; + case 12: + m.naming(room, text); + break; + case 13: + m.hli(room, text); + break; + } + }, + //黄历 + async hli(room, text) { + let m = this; + let msg = await m.ajax(`https://api.lolimi.cn/API/huang/api.php`, {}, "get") + await room.say(msg.data.text + m.sayEnd) + }, + //微信机器人人 + async weixinChatbot(room, text) { + let m = this; + let msg = await m.ajax("https://chatbot.weixin.qq.com/openapi/aibot/" + page.data.token, { + signature: page.data.signature, + query: text, + }, "post") + if (msg?.data?.errcode == 1005) { + await page.methods.wxjqrInit(); + msg = await m.ajax("https://chatbot.weixin.qq.com/openapi/aibot/" + page.data.token, { + signature: page.data.signature, + query: text, + }, "post") + } + let answer = msg.data.answer + if (msg.data.status == "FAQ_RECOMMEND") { + answer = "请问你是不是想问:" + msg.data.options[0].title + } + if (text.indexOf("解第") != -1) { + answer = JSON.parse(answer).multimsg[0] + } + await room.say(answer + m.sayEnd) + }, + //取名 + async naming(room, text) { + let m = this; + var thisArr = text.split("-"); + var sex = thisArr[1] + if (sex == "男") { + sex = 1 + } else if (sex == "女") { + sex = 2 + } else { + sex = 3 + } + let res = await m.ajax( + "https://api.qqsuu.cn/api/dm-cname?apiKey=f6f30d68538bb04dd816e4b4edef8f9f&sex=" + sex + + "&wordnum=2&num=10", null, "get") + var str = "" + res.data.data.list.forEach(v => { + str += v.naming + "," + }) + str = str.substr(0, str.length - 1) + await room.say(str + m.sayEnd) + }, + //转语言 + async toVoice(room, text) { + let m = this; + var text = text.split("-"); + + m.sayMP3(text[0], room, text[1]) + + }, + //答案 + async answer(room, text) { + let m = this; + let res = await m.ajax("https://api.wer.plus/api/bay", null, "get") + + m.sayMP3(res.data.data.comment.split("|")[0], room) + + }, + //星座 + async constellation(room, text) { + let m = this; + let res = await this.ajax("https://v.api.aa1.cn/api/xingzuo/?msg=" + text, null, "get") + await room.say('星座:' + res.data.xz + "\n贵人方位:" + res.data.grfw + "\n贵人星座:" + res.data.grxz + "\n幸运数字:" + + res.data.xyys + "\n爱情运势:" + res.data.aqys + "\n财富运势:" + res.data.cfys + "\n事业运势:" + res.data + .syys + "\n整体运势:" + res.data.ztys + " 提示:" + res.data.ts) + + }, + //历史今天 + async history(room) { + let res = await this.ajax("https://api.oick.cn/lishi/api.php", null, "get") + var radomArr = res.data.result + var randomIndex = Math.floor(Math.random() * radomArr.length) + var obj = radomArr[randomIndex]; + await room.say(obj.date + ":" + obj.title + m.sayEnd) + + }, + //去水印 1 + async qsy(room, text) { + if (text.indexOf("v.douyin.com") != -1) { + // let url=await douyin.init(text); + // await room.say(url) + let res = await this.ajax("http://api.xn--7gqa009h.top/api/dy_jx?a=" + text, {}, "get") + console.log(res.data.url) + await room.say(text + "解析后下载地址:" + res.data.url + m.sayEnd) - switch (arrIndex) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - m.weixinChatbot(room, msg); - break; - case 6: - m.animationPic(room, text); - break; - case 7: - m.qsy(room, text); - break; - case 8: - m.history(room); - break; - case 9: - m.constellation(room, text); - break; - case 10: - m.answer(room, text); - break; - case 11: - m.toVoice(room, text); - break; - case 12: - m.naming(room, text); - break; - case 13: - m.hli(room, text); - break; - } - }, - //黄历 - async hli(room, text) { - let m = this; - let msg = await m.ajax(`https://api.lolimi.cn/API/huang/api.php`, {}, "get") - await room.say(msg.data.text+m.sayEnd) - }, - //微信机器人人 - async weixinChatbot(room, text) { - let m = this; - let msg = await m.ajax("https://chatbot.weixin.qq.com/openapi/aibot/" + page.data.token, { - signature: page.data.signature, - query: text, - }, "post") - if (msg?.data?.errcode == 1005) { - await page.methods.wxjqrInit(); - msg = await m.ajax("https://chatbot.weixin.qq.com/openapi/aibot/" + page.data.token, { - signature: page.data.signature, - query: text, - }, "post") - } - let answer = msg.data.answer - if (msg.data.status == "FAQ_RECOMMEND") { - answer = "请问你是不是想问:" + msg.data.options[0].title - } - if (text.indexOf("解第") != -1) { - answer = JSON.parse(answer).multimsg[0] - } - await room.say(answer+m.sayEnd) - }, - //取名 - async naming(room, text) { - let m = this; - var thisArr = text.split("-"); - var sex = thisArr[1] - if (sex == "男") { - sex = 1 - } else if (sex == "女") { - sex = 2 - } else { - sex = 3 - } - let res = await m.ajax( - "https://api.qqsuu.cn/api/dm-cname?apiKey=f6f30d68538bb04dd816e4b4edef8f9f&sex=" + sex + - "&wordnum=2&num=10", null, "get") - var str = "" - res.data.data.list.forEach(v => { - str += v.naming + "," - }) - str = str.substr(0, str.length - 1) - await room.say(str+m.sayEnd) - }, - //转语言 - async toVoice(room, text) { - let m = this; - var text = text.split("-"); - - m.sayMP3(text[0], room, text[1]) - - }, - //答案 - async answer(room, text) { - let m = this; - let res = await m.ajax("https://api.wer.plus/api/bay", null, "get") - - m.sayMP3(res.data.data.comment.split("|")[0], room) - - }, - //星座 - async constellation(room, text) { - let m = this; - let res = await this.ajax("https://v.api.aa1.cn/api/xingzuo/?msg=" + text, null, "get") - await room.say('星座:' + res.data.xz + "\n贵人方位:" + res.data.grfw + "\n贵人星座:" + res.data.grxz + "\n幸运数字:" + - res.data.xyys + "\n爱情运势:" + res.data.aqys + "\n财富运势:" + res.data.cfys + "\n事业运势:" + res.data - .syys + "\n整体运势:" + res.data.ztys + " 提示:" + res.data.ts) - - }, - //历史今天 - async history(room) { - let res = await this.ajax("https://api.oick.cn/lishi/api.php", null, "get") - var radomArr = res.data.result - var randomIndex = Math.floor(Math.random() * radomArr.length) - var obj = radomArr[randomIndex]; - await room.say(obj.date + ":" + obj.title+m.sayEnd) - - }, - //去水印 1 - async qsy(room, text) { - if (text.indexOf("v.douyin.com") != -1) { - // let url=await douyin.init(text); - // await room.say(url) - let res = await this.ajax("http://api.xn--7gqa009h.top/api/dy_jx?a=" + text, {}, "get") - console.log(res.data.url) - await room.say(text + "解析后下载地址:" + res.data.url+m.sayEnd) - - } - }, - //动漫图 0 - async animationPic(room, text) { - let res = await this.ajax("https://api.oick.cn/random/api.php?type=pc", {}, "get") - this.sayImg(room, res.request.protocol + "//" + res.request.host + res.request.path) + } + }, + //动漫图 0 + async animationPic(room, text) { + let res = await this.ajax("https://api.oick.cn/random/api.php?type=pc", {}, "get") + this.sayImg(room, res.request.protocol + "//" + res.request.host + res.request.path) await room.say(m.sayEnd) - }, - ajax: ajax, - async sayImg(room, url) { - let m = this; - let fileBox = FileBox.fromUrl(url); - await room.say(fileBox) - }, - //文字转语音 - async sayMP3(text, room, roleName) { - let m = this; - roleName = roleName ? roleName : "雷电将军" - let fileBox = null; //语音、文件 - let res = await m.ajax("http://api.lolimi.cn/API/yyhc/y.php?&msg=" + text + "&speaker=" + roleName, - null, "get") - fileBox = FileBox.fromUrl(res.data.music); - await room.say(fileBox) + }, + ajax: ajax, + async sayImg(room, url) { + let m = this; + let fileBox = FileBox.fromUrl(url); + await room.say(fileBox) + }, + //文字转语音 + async sayMP3(text, room, roleName) { + let m = this; + roleName = roleName ? roleName : "雷电将军" + let fileBox = null; //语音、文件 + let res = await m.ajax("http://api.lolimi.cn/API/yyhc/y.php?&msg=" + text + "&speaker=" + roleName, + null, "get") + fileBox = FileBox.fromUrl(res.data.music); + await room.say(fileBox) await room.say(m.sayEnd) - }, - sayEnd:"\n----------------\n来至公众号:'程序员野区'的作者雪狼之夜的开源项目,\n公众号地址\nhttps://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI1NjAxODkzMg== \n开源项目地址:https://inscode.csdn.net/@xuelang532777032/NodeJS" + }, + sayEnd: "\n----------------\n来至公众号:'程序员野区'的作者雪狼之夜的开源项目,\n公众号地址\nhttps://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI1NjAxODkzMg== \n开源项目地址:https://inscode.csdn.net/@xuelang532777032/NodeJS" } \ No newline at end of file -- GitLab