IOTQQ安装部署备忘

参考

前言

现在WebQQ已经凉了,网上那些基于WebQQ协议的框架也随之而去。
现在想基于QQ做些自动化的可以考虑IOTQQ,这是一款基于MacQQ逆向的QQ机器人框架。

服务器部署

其实IOTQQ项目主页的步骤介绍已经很清晰,这里只说一些注意点吧:

  • 现在腾讯对这类基于逆向破解协议的野生机器人封杀的还是很厉害的,安全起见,建议注册新QQ号进行测试
  • 直接部署在服务器上反而要简单些,因为不需要进行frp内网穿透部署,不过建议不要浪,尽量用固定的一台服务器IP,否则说不定腾讯会因为异地登录封杀你的QQ号
  • 用下面的命令后台启动IOTQQ:

    nohup /path/to/IOTQQ >> /path/to/IOTQQ/log.txt 2>&1 &
  • 头一次启动IOTQQ会自动下载一些Lua脚本文件,如果没有,关了重新启动
  • 启动以后浏览器访问http://:/v1/InstallService执行初始化,如果没有看到提示Auth初始化完成,那么说明没成功,需要登录你的Github账号,删除Bot-Notify仓库,之后重复初始化过程
  • 初始化成功以后就可以访问/Login/GetQRcode获取二维码,然后用手机QQ扫码登录即可

WEB_API的调用

  • IOTQQ提供Web API供外部调用,只要知道接口地址,可以用任何http工具或者编程语言调用
  • IOTQQ项目中有个WebAPI.json,可以直接导入Chrome插件RestletClient,既可以直接调用测试,也可以作为文档参考,很方便
  • 这个插件在Chrome商店里也能搜索到,新版本叫Talend API Tester
  • 把WebAPI.json导入之前,可以找个文本编辑器修改一下,主要是把接口地址和QQ号批量替换一下,这样导入后可以直接用

WebSocket接口的使用

  • WebAPI是用来发消息、发指令的,对应的收消息、收事件则需要使用IOTQQ的websocket接口
  • IOTQQ的websocket是基于socket.io实现的,不能直接用ws://...方式访问,因此网上的一些websocket测试工具都无法使用,只能用兼容socket.io的客户端访问
  • nodejs开发需要引入socket.io-client
  • 简单代码如下:

    const io = require('socket.io-client')
    const socket = 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('WS已断开', e))
    socket.on('OnGroupMsgs', async data => {
      console.log('>>OnGroupMsgs', JSON.stringify(data, null, 2))
    })
    socket.on('OnFriendMsgs', async data => {
      console.log('>>OnFriendMsgs', JSON.stringify(data, null, 2))
    })
    socket.on('OnEvents', async data => {
      console.log('>>OnEvents', JSON.stringify(data, null, 2))
    })

    比较关键的有两点:

    1. 调用io函数创建连接时需要提供{ transports: ['websocket'] }参数
    2. 连接上之后,需要先向服务器发送GetWebConn事件,否则收不到事件
  • IOTQQ 2.0.1版已经简化了ws部分,现在很清晰,只有上面代码里的OnGroupMsgs, OnFriendMsgs, OnEvents三种事件,其它功能都需通过调用web api实现

服务安全性考虑

  • 大家应该注意到了,IOTQQ的Web API是赤裸裸的暴露在公网上的,这意味着,如果有人知道了你的API地址和当前登录的QQ号,他就可以用你的QQ来群发消息了,因此如果不只是玩玩的话,我们需要慎重考虑安全性问题
  • 可以修改IOTQQ/CoreConf.conf里的Port配置项为127.0.0.1:xxx来仅允许本地访问,然后用nginx反向代理来控制外网访问权限
  • IOTQQ要接受来自Github的WebHook推送,因此要把/Github/WebHook通过nginx代理直接放出去
  • websocket接口可以同样通过nginx代理直接放到公网,ws是安全的的,因为恶意者即使连上了你的ws也做不了什么坏事
  • 所有的Web api,加上Basic Auth验证,即需要客户端请求中包括Authorization请求头,可以自行设定用户名密码
  • 综上,在nginx.conf中加上下面配置即可:

    location /v1/Github/WebHook {
      proxy_pass http://localhost:8888;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    
    location /v1/ {
      proxy_http_version 1.1;
      if ($http_authorization != "Basic aW90cXE6MTIzNDU2Nzg=") {
        return 401;
      }
      proxy_pass http://localhost:8888;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    
    location / {
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_http_version 1.1;
      proxy_pass http://localhost:8888;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    说明:

    1. if ($http_authorization != "Basic aW90cXE6MTIzNDU2Nzg=") 这一段进行用户名密码的比对,其中Basic后面的字符串的算法为BASE64(<用户名> + ':' + <密码>)
    2. 对于node.js端的Web API请求,只要给request的参数中添加如下字段即可正常交互:auth: { user: <用户名>, pass: <密码> }

你可能感兴趣的:(qq机器人,node.js)