参考
- 实现一个“人工智能”QQ机器人! - 上一篇文章
- QQ群 - 萌萌老妹机器人后援群 - 基于IOTQQ的多功能工具型机器人
- QQ群 - Javascript高级爬虫 - Javascript开发者讨论群,欢迎加入!
- nodejs中使用socket.io-client并用Fiddler抓包 - 抓包了解了底层才有了本文的深入
- awesome-java-crawler - 作者收集的爬虫相关工具和资料
- 反垃圾QQ群机器人 - 基于IOTQQ和百度文本审核API编写的完整项目,对于头疼于垃圾太多的QQ群管理员有很强实用性
调试WEB_API添加验证
- 前一文中已经介绍了可用Chrome插件Talend API Tester来查看和测试IOTQQ的Web API,不过因为后来通过nginx反向代理加上了Basic Auth来提升接口安全性,因此相应的也需要在插件界面添加验证,否则无法正常测试。
- 具体方法:在API主页面的HEADERS面板下,点击
Add authorization
,在弹出的对话框中填入用户名密码即可。
在线测试WebSocket接口
- 前一文中提到过,IOTQQ的websocket是基于socket.io实现的,不能直接用
ws://...
方式访问,因此网上的一些websocket测试工具都无法使用,只能自行编写socket.io客户端程序来连接、测试 - 后来找了找,真找到一个socket.io的在线客户端,地址在此:socketio-client-tool
使用这个客户端连接IOTQQ的接口需要三个步骤:
- 填写接口地址,点击
Connect
- 在下面
Event name
输入框依次输入OnGroupMsgs
,OnFriendMsgs
,OnEvents
,并点击Listen
- 切换到
Emitting
面板,在Event name
输入框中输入GetWebConn
,并在下面的Data: plaintext
文本框中输入登录QQ号,一定加上双引号,然后点击Emit
- 填写接口地址,点击
- 这时候切换回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加上了验证,就不能用这个工具了,建议只在生产环境中启用验证。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。