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

rockswang

参考

调试WEB_API添加验证

  • 前一文中已经介绍了可用Chrome插件Talend API Tester来查看和测试IOTQQ的Web API,不过因为后来通过nginx反向代理加上了Basic Auth来提升接口安全性,因此相应的也需要在插件界面添加验证,否则无法正常测试。
  • 具体方法:在API主页面的HEADERS面板下,点击Add authorization,在弹出的对话框中填入用户名密码即可。

basicauth1.png

在线测试WebSocket接口

  • 前一文中提到过,IOTQQ的websocket是基于socket.io实现的,不能直接用ws://...方式访问,因此网上的一些websocket测试工具都无法使用,只能自行编写socket.io客户端程序来连接、测试
  • 后来找了找,真找到一个socket.io的在线客户端,地址在此:socketio-client-tool
  • 使用这个客户端连接IOTQQ的接口需要三个步骤:

    1. 填写接口地址,点击Connect
    2. 在下面Event name输入框依次输入OnGroupMsgs, OnFriendMsgs, OnEvents,并点击Listen socket.io1.png
    3. 切换到Emitting面板,在Event name输入框中输入GetWebConn,并在下面的Data: plaintext文本框中输入登录QQ号,一定加上双引号,然后点击Emit socket.io2.png
  • 这时候切换回Listening面板,就能监听到服务器推送了
  • 可以和前一节的API Tester工具配合使用来测试接口,推来送去,不亦乐乎!

优化nginx验证配置

  • 经过抓包,我们已经知道,socket.io客户端的实际请求地址是http://host:port/socket.io/?EIO=3&....,因此,我们可以优化前一文中的nginx配置,把location设定的更加精准,避免直接匹配根路径。
  • 同时,因为websocket请求实际上是从一个普通的http请求升级来的,完全可以用同样的方法为websocket也打开基本验证,这样就根本上避免了因为接口地址外泄或被扫描导致别人连上你的ws接口窥探你的隐私信息。
  • 另外,还可以在nginx级别打开gzip压缩,以降低流量消耗。
  • 综上,可以如下优化nginx.conf:

    ...
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 5;
    gzip_types text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json application/xml image/jpeg image/gif image/png image/svg+xml;
    gzip_vary off;
    gzip_disable "MSIE [1-6]\.";
    ...
    location /socket.io/ {
      if ($http_authorization != "Basic aW90cXE6MTIzNDU2Nzg=") {
        return 401;
      }
      proxy_http_version 1.1;
      proxy_pass http://localhost:8888;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  • 经过以上配置,websocket也需要提供Authorization头才能正常连接,需要如下修改程序:

    const Authorization = 'Basic ' + Buffer.from(`${user}:${pass}`).toString('base64')
    const socket = io(WS_API, {
      transports: ['websocket'],
      extraHeaders: { Authorization }  
    })
  • 必须指出,前一节介绍的socket.io在线客户端并不支持extraHeaders选项,因此如果ws加上了验证,就不能用这个工具了,建议只在生产环境中启用验证。
阅读 3.5k

玩儿编程
编程也是可以玩儿的!微信公众号“玩儿编程”

To play is Human

1.4k 声望
151 粉丝
0 条评论

To play is Human

1.4k 声望
151 粉丝
文章目录
宣传栏