Skip to content

Latest commit

 

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 

Repository files navigation

EMT·QQ Logo

EMT·QQ

仿 Telegram 极简风格的 QQ 网页客户端 —— 聊天,本该如此优雅。


📢 重要声明(必读)

最近在 B 站发布视频后,收到很多私信和评论,有不少人提醒"腾讯会告你侵权""小心收到律师函"之类。这里统一回应一下:

经过思考,我最终决定:

1. 本项目不会公开全部源代码,也不会提供成品发布。

原因很简单:为了规避不必要的版权与合规风险,本仓库不直接公开完整源码,不提供任何成品下载

2. 本仓库仅用于技术交流。

不提供成品、不引导侵权、不鼓励对腾讯 QQ 的逆向滥用。做这个项目纯粹是为了学习和探索前端技术。

3. 后续会发布技术性内容(教学向)。

包括但不限于:

  • 如何实现"秒切 QQ 号 · 双重身份"这类效果(技术思路讲解)
  • 如何将 TGS 动态表情(含直接 gzip 压缩嵌入方案)流畅运行在 Web 网页端
  • 第三方客户端的分层架构与性能优化思路

技术无罪,边界在心。感谢每一位理性交流的朋友,也接受合理的批评与建议。


✨ 特性一览

🎨 仿 Telegram 极简设计 毛玻璃质感、圆角气泡、纯净配色,中心面板通透无遮挡,壁纸之美自然透出
丝滑流畅 动态表情、贴纸、消息动画轻量优化,滚动跟手、切换零等待
😀 超 1000 款动态 Emoji 收录 1600+ Telegram 同款 TGS 动态表情,全矢量动画
🎭 四大系列动态贴纸 经典角色、小鸭子、死神笔记、小火人,发送即动态
🎨 个性定制 8 套主题配色、多张精选壁纸、浅色/深色/夜间三模式
🔥 进阶功能 阅后即撤、消息模糊、AI 润色、定时发送、表格投票
🪪 双重身份 双账号同时在线,一键秒切发送身份(详见下方技术文档)

📸 界面展示

demo

demo

demo

demo


📚 技术文档(可视化)

🔄 双重身份 · 秒切 QQ 号实现原理

完整文档: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/snAsiB/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 = 1

发送路由核心代码

function 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();                             // 换头像/昵称/标题
}

三个关键技术点

  1. 消息去重:群消息会被两个 NapCat 各推一次,用"内容签名 + 时间戳"去重;自己消息的回显用 _selfMerge 合并,不重复显示
  2. 共同群限制isSharedGroup() 取两个账号群列表交集,只有共同群才能切换身份发送
  3. 账号标识:每条自己发出的消息打上 acc 标签,渲染时显示对应账号昵称(主题色),一眼分清谁发的

⭐ 支持项目

项目仍在开发中,当前仓库仅作宣传展示。如果觉得有意思,欢迎点个 ⭐ Star 支持一下!


📄 免责声明

本项目仅供学习交流使用,所有动态表情、贴纸、壁纸等素材版权归原作者所有。如涉及侵权,请联系删除。

请遵守腾讯 QQ 用户协议。本项目与腾讯公司无任何关联,非官方出品。

About

EMT·QQ · 仿 Telegram 极简 QQ 客户端 界面简洁美观

Resources

Stars

127 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors