《實現一個「人工智能」QQ機器人!》續

參考

調試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的接口須要三個步驟:javascript

    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:css

    ...
    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頭才能正常鏈接,須要以下修改程序:java

    const Authorization = 'Basic ' + Buffer.from(`${user}:${pass}`).toString('base64')
    const socket = io(WS_API, {
      transports: ['websocket'],
      extraHeaders: { Authorization }  
    })
  • 必須指出,前一節介紹的socket.io在線客戶端並不支持extraHeaders選項,所以若是ws加上了驗證,就不能用這個工具了,建議只在生產環境中啓用驗證。
相關文章
相關標籤/搜索