如今WebQQ已经凉了,网上那些基于WebQQ协议的框架也随之而去。
如今想基于QQ作些自动化的能够考虑IOTQQ,这是一款基于MacQQ逆向的QQ机器人框架。java
其实IOTQQ项目主页的步骤介绍已经很清晰,这里只说一些注意点吧:node
用下面的命令后台启动IOTQQ:nginx
nohup /path/to/IOTQQ >> /path/to/IOTQQ/log.txt 2>&1 &
http://<host>:<port>/v1/InstallService
执行初始化,若是没有看到提示Auth初始化完成,那么说明没成功,须要登陆你的Github帐号,删除Bot-Notify仓库,以后重复初始化过程/Login/GetQRcode
获取二维码,而后用手机QQ扫码登陆便可下面是使用request调用Web API的例子:git
const rp = require('request-promise').defaults({ json: true, gzip: true }) async function callApi (name, params) { const url = `${WEB_API}/LuaApiCaller?qq=${LOGIN_QQ}&funcname=${name}&timeout=10` if (params) return rp.post(url, { body: params }) return rp.get(url) }
ws://...
方式访问,所以网上的一些websocket测试工具都没法使用,只能用兼容socket.io的客户端访问socket.io-client
库简单代码以下:github
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)) const { FromUin, MsgType, Content } = data.CurrentPacket.Data if (MsgType !== 'TextMsg') return const reply = Content.replace(/你/g, '我').replace(/(?:么?|么\?|吗?|吗\?|?|\?)?$/, '!') const params = { toUser: FromUin, sendToType: 1, sendMsgType: 'TextMsg', content: reply, groupid: 0, atUser: 0, replayInfo: null } const resp = await callApi('SendMsg', params) console.log('callApi.result', resp) }) socket.on('OnEvents', async data => { console.log('>>OnEvents', JSON.stringify(data, null, 2)) })
比较关键的有两点:web
{ transports: ['websocket'] }
参数127.0.0.1:xxx
来仅容许本地访问,而后用nginx反向代理来控制外网访问权限综上,在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; }
说明: if ($http_authorization != "Basic aW90cXE6MTIzNDU2Nzg=")
这一段进行用户名密码的比对,其中Basic后面的字符串的算法为BASE64(<用户名> + ':' + <密码>)
shell
auth: { user: <用户名>, pass: <密码> }