仿 Telegram 极简风格的 QQ 网页客户端 —— 聊天,本该如此优雅。
最近在 B 站发布视频后,收到很多私信和评论,有不少人提醒"腾讯会告你侵权""小心收到律师函"之类。这里统一回应一下:
经过思考,我最终决定:
1. 本项目不会公开全部源代码,也不会提供成品发布。
原因很简单:为了规避不必要的版权与合规风险,本仓库不直接公开完整源码,不提供任何成品下载。
2. 本仓库仅用于技术交流。
不提供成品、不引导侵权、不鼓励对腾讯 QQ 的逆向滥用。做这个项目纯粹是为了学习和探索前端技术。
3. 后续会发布技术性内容(教学向)。
包括但不限于:
- 如何实现"秒切 QQ 号 · 双重身份"这类效果(技术思路讲解)
- 如何将 TGS 动态表情(含直接 gzip 压缩嵌入方案)流畅运行在 Web 网页端
- 第三方客户端的分层架构与性能优化思路
技术无罪,边界在心。感谢每一位理性交流的朋友,也接受合理的批评与建议。
| 🎨 仿 Telegram 极简设计 | 毛玻璃质感、圆角气泡、纯净配色,中心面板通透无遮挡,壁纸之美自然透出 |
| ⚡ 丝滑流畅 | 动态表情、贴纸、消息动画轻量优化,滚动跟手、切换零等待 |
| 😀 超 1000 款动态 Emoji | 收录 1600+ Telegram 同款 TGS 动态表情,全矢量动画 |
| 🎭 四大系列动态贴纸 | 经典角色、小鸭子、死神笔记、小火人,发送即动态 |
| 🎨 个性定制 | 8 套主题配色、多张精选壁纸、浅色/深色/夜间三模式 |
| 🔥 进阶功能 | 阅后即撤、消息模糊、AI 润色、定时发送、表格投票 |
| 🪪 双重身份 | 双账号同时在线,一键秒切发送身份(详见下方技术文档) |
完整文档:docs/双重身份技术文档.html
注:本文档由 AI 整理生成,可能存在不准确之处,仅供学习参考。
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ NapCat A │◄──────►│ │◄──────►│ NapCat B │
│ (8084 WS) │ wsA │ EMT·QQ │ wsB │ (3001 WS) │
│ 老号 QQ1 │ │ 客户端 │ │ 新号 QQ2 │
└─────────────┘ └──────────────┘ └─────────────┘
│
│ http 8899
▼
┌────────────────┐
│ server-proxy │
│ 本地代理(可选) │
└────────────────┘
| 环节 | 机制 |
|---|---|
| 双 WS 连接 | 同时挂载两个 NapCat 的 WebSocket(8084 + 3001),各自独立收发 |
| 身份标记 acc | 每条消息 / 每次 API 调用都携带 acc(0=老号,1=新号) |
| 发送路由 | sa2() 按 acc 选择对应 WS 发出,切换身份 = 换发送出口 |
| 身份存储 | siA/snA、siB/snB 双份变量 + curAcc 记录当前身份 |
| 界面联动 | 头像、昵称、标题随 curAcc 实时切换,毫秒级 |
// 账号 A(老号):WS 8084
ws = new WebSocket('ws://127.0.0.1:8084?access_token=...');
ws.onmessage = function(ev){ hm(JSON.parse(ev.data), 0); }; // acc = 0
// 账号 B(新号):WS 3001
w2 = new WebSocket('ws://127.0.0.1:3001?access_token=...');
w2.onmessage = function(ev){ hm(JSON.parse(ev.data), 1); }; // acc = 1function sa2(a, p, e, acc){
var sock = acc === 1 ? (w2 || ws2 || null) : (ws || ws1 || null);
if (!sock || sock.readyState !== 1) return;
sock.send(JSON.stringify({ action: a, params: p || {}, echo: e || (a + '_' + Date.now()) }));
}function accSwitch(){
var na = curAcc === 0 ? 1 : 0; // 取反 = 切换
if (na === 1 && cc && cc.type === 'g' && !isSharedGroup(cc.id)) {
to('该群只有账号1在,无法切换'); // 共同群限制
return;
}
curAcc = na; // 换身份
si = na === 1 ? siB : siA; // 换自己的QQ号
accSyncUi(); // 换头像/昵称/标题
}- 消息去重:群消息会被两个 NapCat 各推一次,用"内容签名 + 时间戳"去重;自己消息的回显用
_selfMerge合并,不重复显示 - 共同群限制:
isSharedGroup()取两个账号群列表交集,只有共同群才能切换身份发送 - 账号标识:每条自己发出的消息打上
acc标签,渲染时显示对应账号昵称(主题色),一眼分清谁发的
项目仍在开发中,当前仓库仅作宣传展示。如果觉得有意思,欢迎点个 ⭐ Star 支持一下!
本项目仅供学习交流使用,所有动态表情、贴纸、壁纸等素材版权归原作者所有。如涉及侵权,请联系删除。
请遵守腾讯 QQ 用户协议。本项目与腾讯公司无任何关联,非官方出品。




