如今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: <密碼> }