Home

Awesome

webqqircd

webqqircd类似于bitlbee,在WebQQ(SmartQQ)和IRC间建起桥梁,可以使用IRC客户端收发消息。大部分代码来自wechatircd,为适配QQ做了一些修改。

           IRC              WebSocket                 HTTPS
IRC client --- webqqircd.py --------- browser        ----- wx.qq.com
                                      modified mq.js

原理

修改WebQQ(http://w.qq.com用的JS,通过WebSocket把信息发送到服务端,服务端兼做IRC服务端,把IRC客户端的命令通过WebSocket传送到网页版JS执行。未实现IRC客户端,因此无法把QQ群/讨论组的消息转发到另一个IRC服务器(打通两个群的bot)。

WebQQ局限

安装

需要Python 3.5或以上,支持async/await语法 pip install -r requirements.txt安装依赖

Arch Linux

IRC服务器默认监听127.0.0.1:6668 (IRC)和127.0.0.1:9002 (HTTPS + WebSocket over TLS)。

如果你在非本机运行,建议配置IRC over TLS,设置IRC connection password:/usr/bin/webqqircd --http-cert /etc/webqqircd/cert.pem --http-key /etc/webqqircd/key.pem --http-root /usr/share/webqqircd --irc-cert /path/to/irc.key --irc-key /path/to/irc.cert --irc-password yourpassword

可以把HTTPS私钥证书用作IRC over TLS私钥证书。使用WeeChat的话,如果觉得让WeeChat信任证书比较麻烦(gnutls会检查hostname),可以用:

set irc.server.qq.ssl on`
set irc.server.qq.ssl_verify off
set irc.server.qq.password yourpassword`

其他发行版

浏览器设置

Chrome/Chromium

Firefox

使用

+qq发信并不会群发,只是为了方便查看有哪些朋友。

+qq channel可以执行一些命令:

服务器选项

IRC命令

server-time extension from IRC version 3.1, 3.2. webqqircd.py includes the timestamp (obtained from JavaScript) in messages to tell IRC clients that the message happened at the given time. See http://ircv3.net/irc/. Seehttp://ircv3.net/software/clients.html for Client support of IRCv3.

Configuration for WeeChat:

/set irc.server_default.capabilities "account-notify,away-notify,cap-notify,multi-prefix,server-time,znc.in/server-time-iso,znc.in/self-message"

Supported IRC commands:

Multi-line messages:

JS改动

原始文件mq.js在Chrome DevTools里格式化后得到orig/mq.pretty.js,可以用diff -u orig/mq.pretty.js mq.js查看改动。

修改的地方都有//@标注,结合diff,方便WebQQ更新后重新应用这些修改。增加的代码中大多数地方都用try catch保护,出错则consoleerr(ex.stack)

目前的改动如下:

mq.js开头

创建到服务端的WebSocket连接,若onerror则自动重连。监听onmessage,收到的消息为服务端发来的控制命令:send_text_message等。

定期把通讯录发送到服务端

获取所有联系人(朋友、订阅号、群/讨论组),deliveredContact记录投递到服务端的联系人,deliveredContact记录同处一群/讨论组的非直接联系人。

每隔一段时间把未投递过的联系人发送到服务端。

收到QQ服务器消息messageProcess

原有代码会更新未读标记数及声音提醒,现在改为若成功发送到服务端则不再提醒,以免浏览器的这个标签页造成干扰。

Python服务端代码

当前只有一个文件webqqircd.py,从miniircd抄了很多代码,后来自己又搬了好多RFC上的用不到的东西……

.
├── Web                      HTTP(s)/WebSocket server
├── Server                   IRC server
├── Channel
│   ├── StandardChannel      `#`开头的IRC channel
│   ├── StatusChannel        `+qq`,查看控制当前QQ会话
│   └── SpecialChannel       QQ群/讨论组对应的channel,仅该客户端可见
├── (User)
│   ├── Client               IRC客户端连接
│   ├── SpecialUser          QQ用户对应的user,仅该客户端可见
├── (IRCCommands)
│   ├── UnregisteredCommands 注册前可用命令:NICK USER QUIT
│   ├── RegisteredCommands   注册后可用命令