webqqircd (webqq -> irc server, 类似的还有 wechatircd)

2016-04-11 23:20:56 +08:00
 MaskRay

https://maskray.me/blog/2016-04-11-webqqircd

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

原理

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

安装

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

Arch Linux 可以安装https://aur.archlinux.org/packages/webqqircd-git,会自动在/etc/webqqircd/下生成自签名证书(见下文),导入浏览器即可。

运行

HTTPS 、 WebSocket over TLS

推荐使用 TLS 。

HTTP 、 WebSocket

如果嫌 X.509 太麻烦的话可以不用 TLS ,但 Chrome 会在 console 里给出警告。

IRC 客户端

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

若服务端或客户端重启,刷新 WebQQ 。

IRC 命令

webqqircd 是个简单的 IRC 服务器,可以执行通常的 IRC 命令,可以对其他客户端私聊。

以下命令会有特殊作用:

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        `+status`,查看控制当前 QQ 会话
│   └── WeChatRoom           QQ 群对应的 channel ,仅该客户端可见
├── (User)
│   ├── Client               IRC 客户端连接
│   ├── WeChatUser           QQ 用户对应的 user ,仅该客户端可见
├── (IRCCommands)
│   ├── UnregisteredCommands 注册前可用命令: NICK USER QUIT
│   ├── RegisteredCommands   注册后可用命令

我的配置

https://wiki.archlinux.org/index.php/Systemd/User

~/.config/systemd/user/webqqircd.service:

[Unit]
Description=webqqircd
Documentation=https://github.com/MaskRay/webqqircd
After=network.target

[Service]
WorkingDirectory=%h/projects/webqqircd
ExecStart=/home/ray/projects/webqqircd/webqqircd.py --tls-key a.key --tls-cert a.crt --password a --ignore 不想自动加入的群名 0 不想自动加入的群名 1

[Install]
WantedBy=multi-user.target

WeeChat:

/server add qq 127.1/6668 -autoconnect
2947 次点击
所在节点    编程
2 条回复
oott123
2016-04-12 07:47:25 +08:00
听起来是依赖 Chrome 插件的?_(:з」∠)_不知道有没有想过做 headless 呢…
MaskRay
2016-04-12 10:04:58 +08:00
@oott123 因为要扫码登录……登录时留个 head 方便,既然有了就常驻好了……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/270318

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX