关于我们

项目介绍

微信大全是一个收录优质微信群的导航网站。我们致力于帮助用户发现和加入各类高质量的微信群, 涵盖技术、运营、设计、产品、创业等多个领域。

核心特色

双码防失效

每个群同时展示群二维码和个人二维码,群码过期也能通过个人码加入。

人工审核

所有群都经过人工审核,确保内容真实有效,拒绝垃圾广告。

分类清晰

按技术、运营、设计等领域分类,快速找到你感兴趣的微信群。

文章分享

提供社群运营干货文章,帮助你更好地运营和管理微信群。

技术栈

  • 前端框架:Astro (SSR 服务端渲染)
  • CSS 框架:Tailwind CSS
  • 后端 API:Hono
  • 数据库:SQLite + Drizzle ORM
  • 认证:JWT

版本更新历史

每次升级我们都记录在这里,方便你了解网站的演进过程。

v1.10 2026-10-24 修复

修复回复重复 + 新增我的留言

  • · ## 修复 AI 回复双渲染 + 用户中心「我的留言」
  • · ### Bug 修复:发一条消息出现两条相同回复
  • · - 根因:AI 模式(LLM 回复)接口未返回消息 id,前端渲染时无法与 SSE 实时推送去重,同一条回复被渲染两遍
  • · - 修复:接口补齐回复消息 id;同时优化乐观消息去重——SSE 比接口响应先到时,自动撤掉乐观渲染的那条,双通道时序竞态彻底堵死
  • · ### 新功能:用户中心「我的留言」
  • · - 个人中心新增「我的留言」板块:留言主题、内容、处理状态(待回复/已回复/已关闭)
  • · - 客服回复后绿色卡片展示官方回复与回复时间,不用翻邮箱
  • · - 登录用户提交留言自动关联账号,未登录用户的留言仅在邮件通知
  • · ### 说明
  • · - 人工留言回复功能此前已具备(后台留言管理 PATCH 回复 + 邮件通知),本次补齐用户侧触达;
  • · - 留言内容与回复均做 HTML 转义,防 XSS
v1.09 2026-10-24 优化

在线客服体验三件套

  • · ## 在线客服体验三件套
  • · ### 1. 实时状态 + 排队计时
  • · - 聊天窗头部实时显示接待状态:AI 助手接待中 / 排队中·已等待 mm:ss / 客服 XXX 正在为你服务 / 会话已结束
  • · - 排队计时从转入时间算起,SSE 重连自动校准,不丢计时
  • · ### 2. 消息已读回执
  • · - 用户消息下方显示「已读」小字:客服查看会话或回复时实时标记
  • · - 刷新/换设备后按客服未读数自动还原已读状态,不丢标记
  • · ### 3. 表情面板
  • · - 输入框左侧新增表情按钮,24 个常用表情即点即输入,不自动发送
  • · - 点击面板外自动收起,关闭聊天窗时同步收起
  • · ### 技术要点
  • · - 客服查看/回复会话时经 SSE 推送 read 回执(upToMessageId),前端按消息 id 标记
  • · - 历史接口补充 unreadForAgent / transferredAt 字段,供前端初始化
  • · - 修复 pushReadReceipt 遗漏导入 and 导致回执静默失败的问题(同类坑:or is not defined)
v1.08 2026-10-24 优化

转人工排队兜底机制

  • · ## 转人工排队兜底机制
  • · ### 问题背景
  • · 用户点「转人工」后若客服不在线,会话会一直卡在排队状态,AI 静默不回复,体验像坏了一样。
  • · ### 本次修复
  • · - 排队超时自动回退:转人工后 5 分钟内无客服接管,用户下次发言时自动切回 AI 托管并正常回复,聊天窗同步提示「客服暂时忙不过来,已自动为你切回 AI 助手」
  • · - 主动取消排队:排队状态下快捷栏新增「🤖 继续问 AI」按钮,用户可随时结束排队回到 AI 对话
  • · - 状态条提示优化:排队中明确告知「客服 5 分钟内未接入将自动切回 AI 助手」
  • · - 客服接管时清理排队计时;真人接待中不允许取消排队(避免把客服赶走)
  • · ### 技术要点
  • · - ai_chat_sessions 新增 transferred_at 字段记录转入排队时间
  • · - POST /api/chat/resume-bot 新接口(waiting → bot,幂等)
  • · - 全链路测试通过:转人工→排队静默→取消排队→AI 恢复→超时自动回退→系统提示落库→agent 禁止取消
v1.07 2026-10-24 优化

在线客服升级为居中大弹窗

  • · ## 在线客服弹窗体验升级
  • · ### 弹窗化
  • · - 点击右下角吉祥物,聊天窗从悬挂小面板改为居中模态大弹窗
  • · - 桌面端约 720×680(原 380×540),移动端全屏,聊天不再拥挤
  • · - 半透明遮罩聚焦对话,打开时锁定背景滚动
  • · - 开合缩放动画,关闭方式:右上角 X / 点击遮罩 / ESC 键
  • · ### 聊天区放大
  • · - 字号 13→14px,行距、气泡圆角、内边距同步加大
  • · - 头部、输入框、快捷标签、发送按钮整体放大,触控更舒服
  • · ### 功能不变
  • · - AI 助手 / 人工留言 / 快捷直达三个 Tab 全部保留
  • · - 实时对话、转人工、未读红点、SSE 推送逻辑不变
  • · ### 清理
  • · - 移除 data/ 目录废弃数据库文件 site.db(0 字节)与 weixinqun.db(空表),已备份
v1.06 2026-10-24 新功能

真人/AI 混合在线客服上线

  • · ## 真人/AI 混合在线客服
  • · ### 实时对话
  • · - 用户侧 SSE 长连接:发消息走 POST,回复实时推送,断线自动重连
  • · - 客服侧 SSE 全局频道:所有会话的新消息实时到达工作台
  • · - 消息来源区分:用户 / AI 小助手 / 客服真人(带头像名),气泡样式不同
  • · ### AI 托管状态机
  • · - bot:AI 24h 托管自动回复(默认)
  • · - waiting:用户点转人工后排队,AI 静默
  • · - agent:客服接管后真人接待,AI 静默
  • · - closed:客服结束会话,用户再发言自动重开为 AI 托管
  • · ### 用户侧新功能
  • · - 对话面板新增转人工按钮与状态条(排队中/客服接待中)
  • · - 未读红点:面板关闭时来消息亮红点数字
  • · - 历史消息走后端存档,换设备不丢(email 合并)
  • · ### 后台在线客服工作台
  • · - 左侧会话列表:状态筛选(排队/接待/AI/结束)、搜索、未读红点、最后消息预览
  • · - 右侧对话窗:气泡对话、Enter 发送、快捷回复语
  • · - 会话操作:接管 / 转回 AI / 结束会话
  • · - 新消息声音提醒(Web Audio 合成音,无外部文件)
  • · - SSE 断线 15 秒轮询兜底
  • · ### 技术要点
  • · - 新增 src/lib/sse-hub.ts 统一管理双侧长连接与广播
  • · - 新增 src/api/routes/livechat.ts 客服工作台 API
  • · - Schema 扩展:sessions 加 status/bot_enabled/handled_by/unread 计数等 7 字段,messages 加 sender_type/agent_name
  • · - 客服侧 SSE 走 /api/livechat/stream(避开 adminRoutes 全局鉴权),token 鉴权 + DB 角色校验
  • · - SSE 连接限流:用户侧每会话 5 个、客服侧 10 个,防耗尽
v1.05 2026-10-24 新功能

吉祥物在线客服 + AI 找群

  • · 吉祥物在线客服 + AI 找群:全站右下角浮动吉祥物,点开即对话,无需跳页。三个 Tab 合一:AI 助手、人工留言、快捷入口。
  • · 1. 【新功能】AI 客服挂件:全站右下角浮动吉祥物,点开即对话。三个 Tab 合一:AI 助手(智能找群)、人工留言(复用留言系统)、快捷入口(常用页面直达)。会话历史存 localStorage,用户填过邮箱后跨设备合并。不自动展开、不弹窗欢迎,安静待命。
  • · 2. 【新功能】AI 找群混合策略:先跑 SQLite 关键词匹配(群名/描述/标签/分类),命中 ≥3 个群直接返回卡片(秒回、零 LLM 成本);命中不够或意图模糊时走 LLM,system prompt 里注入真实群数据列表,严格限定「只根据工具返回的群回答,找不到就说没有」,杜绝幻觉。搜索关键词自动提取:移除「找/有没有/能找」等动词,按 2-3 字切分做多词匹配。
  • · 3. 【新功能】会话后端存档:新增 ai_chat_sessions + ai_chat_messages 两张表,每次对话入库(含 localId、邮箱、IP、UA、首条消息、消息数、LLM tokens)。后台新增「AI 会话记录」tab:列表支持搜索(localId/邮箱/IP/首条消息),详情查看完整对话流(用户/AI 气泡区分,quick 模式群卡片内嵌)。
  • · 4. 【安全】双层限流:每 IP 每小时 10 次 + 全站每日 500 次。超限时返回友好提示而非 429 裸错误。LLM 超时 30 秒自动降级为 quick 模式。
  • · 5. 【补全】notify_email 已配置(17541327@qq.com):SMTP 已就绪但之前收件地址为空,人工客服通知链一直是哑巴。现在用户留言 → 邮件到管理员 → 后台回复 → 邮件到用户,全链路闭环。
  • · 6. 【前端】隐私与体验:面板底部常驻「AI 回答仅供参考,请勿输入个人隐私」提示。AI 回复走极简 Markdown 渲染(加粗/列表/链接),不引入外部库。移动端面板变全屏抽屉。群卡片带分类、地区、标签,点击直达群详情页。快捷标签「找前端群/找运营群/找设计群」一键发送。
v1.04 2026-10-24 修复

P2 健壮性与反滥用修复批次

  • · 对 v1.03 遗留的 12 项 P2 问题做一轮集中修复,重点是健壮性、防滥用与可运维性。全部改动已通过黑盒复测。
  • · 1. 【健壮性】PATCH /api/admin/messages/:id 收到坏 JSON 时原来会 500 崩溃。加 .catch(() => null) 兜底,返回 400 "请求格式错误"。同类兜底也补到 GET/DELETE /:id(原 parseInt(c.req.param('id')) 对 abc 会得到 NaN,eq(col, NaN) 匹配不到任何行、静默空返回;改成显式 id < 1 校验,返回 400 "无效留言 ID")。
  • · 2. 【数据泄露】后台消息列表 ?page=abc 会得到 NaN 分页参数,NaN 绑到 SQLite LIMIT/offset 等于"不限行数",一次把全表吐给攻击者。修复思路是共享层做,而不是每个路由各自补:在 src/lib/response.ts 新增 safeInt() 工具(parseInt 失败/越界都回退到默认),parsePagination 改用 safeInt。同时把前台 6 个 Astro 页面(tags/[slug]、c/[slug]、groups/index、city/[name]、articles/c/[slug]、articles/index)里同样写法的 Math.max(1, parseInt(...)) 一并修掉(NaN || 1 = 1)。tags.ts 里 3 处 Math.max(1, parseInt(...)) 也统一改用 safeInt。
  • · 3. 【搜索绕过】后台关键词搜索原用 drizzle 的 like(),% 和 _ 是 LIKE 通配符:管理员搜 % 会命中全表、搜 _ 会命中任意单字符。drizzle 的 like() 又不支持 ESCAPE 子句,转义写起来又脆。改用 SQLite 的 instr()——纯子字串匹配,没有通配符语义,天然不需要转义。实测搜 % 只返回含字面 % 的那 1 行,搜 _ 只返回含 _ 的那 1 行。
  • · 4. 【内存炸弹】security-alert.ts 的窗口查询原没有 .limit(),暴力破解高峰会把上千行 logs 拉进内存再 filter。改成两段:先 SELECT COUNT(*) 聚合拿到计数(不物化行),再 SELECT * LIMIT 10 只取最新 10 条用于邮件内容。同时把 count 用的 WHERE 条件抽成 failWhere 复用,避免两次手写 SQL 走样。
  • · 5. 【竞态】security-alert.ts 的 alreadySent + markSent 是两个独立查询,并发场景下两个请求可能同时判定"未发过"、各自 markSent 一次,导致同一 IP 同一窗口重复发告警邮件。合并成单条 INSERT ... SELECT ... WHERE NOT EXISTS(...),SQLite 的语句级原子性保证只有一个请求能抢到那行。同时把 claimAlert 抽成独立函数便于复用。
  • · 6. 【死告警】security-alert.ts 原逻辑是无论 notify_email 是否为空、无论 notify_security 开关是否开启,都会 markSent 落一条"已发"标记,把这条攻击标记成 24 小时不再告警。管理员填好邮箱之前,攻击者实际上被"静默放行"。把开关与收件人检查前移到 markSent 之前,不满足条件直接 return 不落标记——攻击者不会被误标记,管理员配好之后立刻能收到。
  • · 7. 【可追溯】messages 表原本没有 ip 列,垃圾留言只能看到留名人自填的邮箱和电话,无法反查来源。新增 ip TEXT 列(旧留言为空,向后兼容),提交留言时写入 getClientIP() 结果(nginx 注入的 X-Real-IP,或 XFF 链最右侧兜底)。后台消息详情与列表都展示 IP,格式如"留言时间:xx | IP 1.2.3.4"。老留言无 ip 字段时不显示这一行。
  • · 8. 【骚扰】PATCH 回复留言时,管理员反复保存同一回复内容会反复给留言人发邮件。加 reply !== existing.reply 判断,同一回复内容不重复发信(状态变更和实际改动内容才触发)。
  • · 9. 【反垃圾】contact.astro 表单原本只有限流、无蜜罐,"再提交一条"按钮还鼓励灌水。加蜜罐字段:一个 aria-hidden 的隐藏 input name="website" tabindex="-1",人类看不见也不会填,垃圾机器人通常会自动填。服务端收到非空 website 就静默当成功返回(不写库、不占限流配额、不给机器人任何失败反馈)。同时把限流提示"同一网络 10 分钟内最多提交 3 条"写在表单下方,让正常用户心里有数。
  • · 10. 【CORS 误配】src/api/index.ts 里 CORS 回退值原来是 http://localhost:4321,那是 gamevault 项目的端口,一旦 env 没设 CORS_ORIGIN 就会把本站的 API 放行给完全无关的来源。改为 https://wx.chudun.net,注释里也标明"回退值必须是本站域名"。
  • · 11. 【错误处理丢失】src/api/index.ts 注册了两个 app.onError:第一个带 system_errors 埋点(把错误写入 DB 供后台排查),第二个只是 console.error。Hono 后注册的会覆盖先注册的,导致埋点版被覆盖、生产错误静默丢失。删掉第二个,只保留带埋点的版本。
  • · 12. 【可配置性 + 可运维】security-alert.ts 里 FAIL_THRESHOLD=5、FAIL_WINDOW_MIN=60、DEDUP_HOURS=24 三个常量硬编码,改一次要重新构建部署。抽出 DEFAULT_ALERT_CONFIG + getAlertConfig(),从 settings 表读取,clamp 到合理范围(2-100 / 5-1440 / 1-168),越界值回退默认。settings.ts 加 3 个默认键 + 描述。admin.js 后台「邮件通知」区块把原来那段硬编码的琥珀色提示框换成 3 个可编辑 number 输入框(min/max/step 都设上,防误配)。同时新增 scripts/cron-jobs.mjs clean-alerts 子命令:security_alerts 是告警去重标记表,claimAlert 只在 sent_at >= now - dedup_hours 的窗口内查重,超出窗口的行对判重毫无作用、纯粹占空间。保留 7 天(=dedup_hours 最大可配值)保证安全。已加入 all 子命令,可挂 crontab。
  • · 13. 【代码卫生】清理源码目录里累积的 14 个 .bak 残留文件(src/pages/、src/lib/、src/db/、src/api/routes/、scripts/、public/admin/ 各若干),全部移到 .bak/20261023e/ 归档,源码目录重新干净。此前 fix_astro_nan.py 备份目录刻意放在 .bak/20261023e/ 而不是 src/ 下,就是为了不制造新的 .bak 残留。
v1.03 2026-10-23 修复

留言与通知模块上线后审查修复

  • · 对 v1.02 新增的留言、邮件通知、安全提醒做一轮黑盒+静态审查,修复 5 处 P0/P1 问题:
  • · 1. 【严重】后台留言列表在无筛选参数时恒为空。messages.ts 原写法 and(status && eq(...), keyword ? or(...) : undefined):status 为空时短路结果是空字符串 '',而 drizzle 的 and() 用 !== undefined 过滤条件,'' 会存活进 WHERE 子句,等价于 WHERE '' 恒假。实测 stats 报 total=12 但列表返回 0 行,管理员看到"暂无留言"而徽标却显示 12 条。改为显式三段组合(项目内 admin.ts:243 已有的正确写法)。
  • · 2. 【严重】notify_new_register / notify_password_reset 是两个死开关。后台「邮件通知」里可以勾选它们,但 notifyNewRegister() / notifyPasswordReset() 硬编码用 notify_security,关掉完全不生效,管理员会持续收到这两类邮件。改为各自专属开关 key。
  • · 3. 【严重】所有限流器共享同一个 Map。rateLimit.ts 的 const store 声明在 rateLimit() 工厂外面,编译后全项目只有一个 Map,5 个实例共用。而 generalLimiter / authLimiter / uploadLimiter / messageSubmitLimiter 都用客户端 IP 作 key:留言限流声明 3 条/10 分钟,实测每 IP 只能发 1 条(每个请求先被 generalLimiter 计一次再被 messageSubmitLimiter 计一次);反向看,generalLimiter 的 60 秒窗口会不断重置共享 entry,导致 authLimiter(30/10 分钟)与 uploadLimiter(30/小时)窗口被反复重置、实际近乎失效。store 移入工厂内部实现实例隔离。
  • · 4. 【严重】getClientIP 可被任意伪造。原实现取 X-Forwarded-For 的最左侧,而 nginx 用 $proxy_add_x_forwarded_for 会把客户端自带的 XFF 追加在真实 IP 前面,取 [0] 等于让攻击者自己决定自己的 IP。实测连发 3 条伪造不同 XFF 全部通过限流;安全告警里的"攻击者 IP"同样可被伪造,能掩盖真实来源或污染防重表。改为优先信任 nginx 写入的 X-Real-IP(对应 $remote_addr),兜底取 XFF 链上最靠近本网关的一跳。站点只绑定 127.0.0.1:4650,外部流量必经 nginx,兜底路径对外不可达。
  • · 5. 【严重】fmtTime / msgFmtTime 显示时间偏移 8 小时。DB 的 datetime('now') 存的是 UTC 且格式为 YYYY-MM-DD HH:MM:SS 无时区标记,V8 对无时区字符串按本地时区解析,而服务器 TZ 与用户浏览器均为 Asia/Shanghai(+08),再手动 +8 小时后整体偏移。后台留言列表里的所有时间、安全告警邮件里的"最新尝试时间"全部偏 8 小时。实测 fmtTime('2026-10-23 14:44:43') 修复前返回 14:44、修复后返回 22:44。统一补 T 和 Z 强制按 UTC 解析。同一文件内 nowBjTime() 因传入带 Z 的 ISO 串本来就是对的,导致错误被掩盖;utcCutoff / bjDayStartUtc 使用绝对 epoch,统计口径正确,所以只有显示层出错。
v1.02 2026-10-23 新功能

在线客服留言 + 邮件通知与网站安全提醒

  • · 新增「联系我们/留言」页面(/contact),游客可直接留言,24小时内邮件回复
  • · 新增后台「留言管理」:状态筛选、关键词搜索、分页、在线回复与删除,侧边栏显示待处理数量
  • · 新增邮件通知系统,收件人支持逗号分隔多邮箱,统一由系统设置「邮件通知」区块控制
  • · 支付成功通知:用户付款成功后立即提醒管理员
  • · 安全告警通知:管理员登录成功、账号密码被重置均会提醒,便于及时发现异地盗号
  • · 新增登录失败告警:同一 IP 一小时内失败 5 次触发,同一来源 24 小时内只提醒一次
  • · 采集失败告警接入统一开关与多收件人配置
  • · 补记登录失败日志(原只限流不落库),安全告警可追溯
  • · 系统设置新增「邮件通知」配置区块,六项开关独立控制
  • · 页脚新增「联系我们」入口
v1.01 2026-10-20 新功能

支付体验升级与运维告警上线

  • · 支付二维码直接内嵌在弹窗内,扫码付款无需再跳转一次
  • · 修复虎皮椒 url_qrcode 返回网页而非图片导致的二维码破图问题
  • · 邮箱验证码全链路打通,注册与找回密码可正常接收验证码
  • · 微信群采集任务增加时间戳日志和 15 分钟超时保护
  • · 采集失败自动发送告警邮件,避免任务静默失败

联系我们

如有问题或建议,欢迎通过以下方式联系我们:

  • 邮箱:contact@example.com
  • 微信:wechat-group-nav