当前位置: 首页 > 后端技术 > Node.js

实现一个“人工智能”QQ机器人!

时间:2023-04-03 11:10:51 Node.js

参考QQ群-萌萌老妹机器人后援群-基于IOTQQ的多功能工具机器人QQ群-Javascript进阶爬虫-Javascript开发者讨论群,欢迎加入!awesome-java-crawler-作者收集的爬虫相关工具和资料IOTQQ项目主页IOTQQ-Docker-作者为iotbot制作的Dockerfile,可实现单机多账号防垃圾QQ群机器人-基于IOTQQ和百度文字评论API编写的一个完整项目,对于头疼垃圾太多的QQ群管理员来说非常实用。一个帮你自动创建阿里云抢占式实例并开启网络加速的脚本-自动创建阿里云抢占式节点前言WebQQ现在凉了,网上那些基于WebQQ协议的框架也将消失。现在如果想基于QQ做一些自动化,可以考虑IOTQQ,这是一个基于MacQQ逆向的QQ机器人框架。服务器部署其实IOTQQ项目主页上的步骤已经很清楚了。这里有一些注意点:可以使用docker在单台服务器上启动多个IOTQQ实例,见文章开头的参考。目前,腾讯基于逆向破解协议对此类打野机器人的封杀还是很厉害的。为保险起见,建议重新注册一个QQ号进行测试。3.0.1以上的IOTQQ新版本不再需要通过公网与Github交互,本地运行时不再需要穿透内网,部署方式大大简化。建议尽量使用固定的服务器IP部署在服务器上,否则腾讯可能会因为远程登录而封禁你的QQ账号。iotbot3.0.x的GitterToken是和QQ账号绑定的,不能随意更改登录QQ。如需解绑,请联系IOTQQ作者。经过自己一段时间的验证,IOTQQ在CentOS上运行有很多坑,所以推荐使用Ubuntu。64位系统需要下载iotbot_3.x.x_linux_arm64.tar.gz包。使用以下命令在后台启动IOTQQ:nohup/path/to/iotbot>>/path/to/iotbot/log.txt2>&1&第一次启动iotbot会拉取一些脚本并有详细的输出,当Everything没关系!这意味着服务已准备就绪,您可以开始登录过程。初始化成功后,请求http://IP:PORT/v1/Login/GetQRcode获取登录二维码,手机扫描二维码即可登录。WEB_API调用IOTQQ提供WebAPI对外调用。只要知道接口地址,用任何http工具或编程语言都可以调用。文档参考,在Chrome商店中很方便的找到这个插件。新版本称为TalendAPITester。在导入WebAPI.json之前,可以找一个文本编辑器修改一下,主要是批量替换接口地址和QQ号。导入后,您可以直接使用它。下面是使用request调用WebAPI的例子:constrp=require('request-promise').defaults({json:true,gzip:true})asyncfunctioncallApi(name,params){consturl=`${WEB_API}/LuaApiCaller?qq=${LOGIN_QQ}&funcname=${name}&timeout=10`if(params)returnrp.post(url,{body:params})returnrp.get(url)}的使用WebSocket接口的使用WebAPI用于发送消息和命令,并相应地接收消息和事件,需要使用IOTQQ的websocket接口。IOTQQ的websocket是基于socket.io实现的,不能直接使用ws://..。access,所以不能使用网上的一些websocket测试工具,只能使用兼容socket.io的客户端访问nodejs开发。需要引入socket.io-client库。简单代码如下:constio=require('socket.io-client')constsocket=io(WS_API,{transports:['websocket']})socket.on('connect',e=>{console.log('WS已连接')socket.emit('GetWebConn',''+LOGIN_QQ,(data)=>console.log(data))})socket.on('disconnect',e=>console.log('WSisdisconnected',e))socket.on('OnGroupMsgs',asyncdata=>{console.log('>>OnGroupMsgs',JSON.stringify(data,null,2))})socket.on('OnFriendMsgs',asyncdata=>{console.log('>>OnFriendMsgs',JSON.stringify(data,null,2))const{FromUin,MsgType,Content}=data。CurrentPacket.Dataif(MsgType!=='TextMsg')returnconstreply=Content.replace(/you/g,'me').replace(/(?:What?|什么\?|?|Do\?|?|\?)?$/,'!')constparams={toUser:FromUin,sendToType:1,sendMsgType:'TextMsg',content:reply,groupid:0,atUser:0,replayInfo:null}constresp=awaitcallApi('SendMsg',params)console.log('callApi.result',resp)})socket.on('OnEvents',asyncdata=>{console.log('>>OnEvents',JSON.stringify(data,null,2))})有两个关键点:调用io函数创建连接时需要提供{transports:['websocket']}参数连接后需要发送GetWebConn事件先发到服务器,否则receive上面的代码会打印出所有收到的群消息、好友消息和事件,对于好友消息,会自动回复。从IOTQQv2版本开始,简化了ws部分。现在结构很清晰了,上面代码中只有OnGroupMsgs,OnFriendMsgs、OnEvents等功能需要调用webapi实现服务安全。你应该注意到IOTQQ的WebAPI是裸露在公网的,也就是说如果有人知道你的API地址和当前登录的QQ号,他就可以用你的QQ群发消息,所以如果不是为了好玩,我们需要认真考虑安全问题。可以修改IOTQQ/CoreConf.conf中的Port配置项为127.0.0.1:xxx只允许本地访问,然后使用nginx反向代理来控制访问外网的所有WebAPI,加上BasicAuth验证,即客户端请求需要包含授权请求头,您可以设置自己的用户名和密码。上面,在nginx.conf中添加如下配置:location/v1/Github/WebHook{proxy_passhttp://localhost:8888;proxy_set_header主机$host;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}location/v1/{proxy_http_version1.1;如果($http_authorization!="基本aW90cXE6MTIzNDU2Nzg="){返回401;}proxy_passhttp://localhost:8888;proxy_set_header主机$host;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}location_{proxy$http_upgrade;proxy_set_header连接“升级”;proxy_http_version1.1;proxy_passhttp://localhost:8888;proxy_set_header主机$host;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}说明:if($http_authorization!="BasicaW90cXE6MTIzNDU2Nzg=")这段比较用户名和密码,Basic之后的字符串的算法是BASE64(+':'+)之后以上配置,对于node.js端的WebAPI请求,只需在请求的options参数中添加如下字段即可正常交互:auth:{user:,pass:}websocket接口即可同样通过nginx反向代理进行授权验证,见本文续