提交 202366db 编写于 作者: Q qq_21051503

Thu Feb 15 16:53:00 CST 2024 inscode

上级 34484e4b
......@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册