匿名聊天室 v1.0 开源发布 | 单文件 Python 实现,内网秒部署

📅 2026/7/2 2:18:16
匿名聊天室 v1.0 开源发布 | 单文件 Python 实现,内网秒部署
最近写了一个轻量级的内网匿名聊天室系统全部代码只在一个 Python 文件里打包成 exe 后双击即运行适合企业内部交流、校园社团、临时技术群聊等场景。断断续续折腾了两周改了不少 bug现在稳定可用开源出来给大家玩玩。一、项目介绍一款开箱即用的内网匿名聊天室系统。· 技术栈Python Flask Flask-SocketIO SQLite· 架构单文件、零配置· 运行方式源码运行 或 双击 exe· 端口3986用户只需要浏览器访问 http://IP:3986输入房间号 邀请码 昵称就能加入聊天。二、为什么写这个市面上聊天工具很多但都太重了。· 企业微信/钉钉要注册、要审批、要拉群· QQ/微信要加好友、要邀请· 自建 Rocket.Chat/Mattermost要 Docker、要数据库、要域名我想要的是一台 Windows 电脑双击一个 exe 文件同一层楼的人就能匿名聊天。于是就自己写了。三、核心功能用户端功能 说明多房间隔离 每个房间数据完全独立房间号 邀请码 双重验证准入自定义昵称 2-30 字支持中文、符号、表情实时聊天 WebSocket 秒收秒发图片上传 JPG/PNG/GIF/WebP≤3MB 自动显示视频上传 MP4/WebM/MOV点击播放历史消息 进入房间自动加载最近 200 条在线列表 实时显示在线人数管理后台后台地址http://IP:3986/yesadmin功能 说明创建房间 自定义房间号 邀请码 最大人数最高500房间管理 查看所有房间的在线人数、消息总数、创建时间删除房间 一键删除自动清空所有消息和上传文件全局设置 默认最大人数、历史消息加载条数修改密码 需验证旧密码安全机制· SQL注入防护参数化查询· XSS防护前端 textContent 渲染· 文件类型验证PIL 验证图片真实格式· 文件大小限制图片 10MB/视频 50MB· 防撞库同一 IP 错误 6 次封禁 10 分钟· 消息频率限制每秒 3 条· Session 24 小时自动过期· 上传文件 UUID 重命名· 支持 Cloudflare 真实 IPX-Forwarded-For四、技术实现要点1. 单文件结构全部代码后端 前端模板都写在一个 main.py 里方便分发和打包。前端页面通过 render_template_string() 渲染省去了模板文件。2. WebSocket 实时通信使用 Flask-SocketIO 实现 WebSocket消息广播用 socketio.emit() 指定房间。socketio.on(send_message)def handle_send_message(data):sid request.sidtext data.get(text, ).strip()# 存数据库 广播给房间所有人socketio.emit(new_message, {sid: sid,nickname: nickname,text: text,time: int(time.time() * 1000)}, roomroom_id)3. 防撞库设计同一 IP 同一房间错误 6 次后封禁 10 分钟。def check_ip_ban(ip, room_idNone):key f{ip}:{room_id}data ip_error_count.get(key)if data and data.get(ban_until) and time.time() data[ban_until]:return Truereturn False4. 路径处理exe兼容用 get_base_path() 获取 exe 所在目录解决 PyInstaller 打包后的路径问题。def get_base_path():if getattr(sys, frozen, False):return os.path.dirname(sys.executable)return os.path.dirname(os.path.abspath(__file__))五、部署方式方式一源码运行开发/调试安装依赖pip install flask flask-socketio eventlet werkzeug pillow运行python main.py方式二exe双击运行适用于Windows免折腾双击ChatRoom.exe六、目录结构chatroom/main.py # 全部代码单文件data/chatroom.db # 主数据库房间/消息/设置access_logs.db # 访问日志数据库uploads/ # 上传文件七、遇到的坑1. imghdr 在 Python 3.13 被移除了解决方案用 Pillow 替代。from PIL import Imagedef validate_file_type(file_data, filename):img Image.open(io.BytesIO(file_data))# 验证图片格式2. PyInstaller 打包 eventlet 失败eventlet 打包后容易报 Invalid async_mode解决方案改用 threading 模式并加上 --hidden-import。pyinstaller --onefile --nameChatRoom --console --hidden-importengineio.async_drivers.threading --clean main.py3. 删除房间卡死disconnect 事件触发 handle_disconnect后者会获取 online_lock而删除房间时已经持有了锁 → 死锁。解决方案先复制用户列表释放锁后再踢人。sid_list list(online_users[room_id].keys())del online_users[room_id]for sid in sid_list:socketio.server.disconnect(sid)八、开源协议版权所有 © 2026 风景云创科技 (ScenCloud)本软件开源版本仅供个人学习、研究、非商业用途使用。你可以· ✅ 个人免费使用· ✅ 内网部署· ✅ 公网穿透个人使用· ✅ 修改源码个人使用· ✅ 学习研究你不可以· ❌ 用于任何商业用途· ❌ 盈利或收费· ❌ 篡改版权信息后商用· ❌ 抄袭代码后改作者名商用商业授权或bug反馈请联系chatroomscencloud.com九、后续计划· ✅ v1.0 已开源· v2.x 闭源功能持续更新中十、项目地址GitHubhttps://github.com/scencloud/ChatRoom出品方风景云创科技 (ScenCloud)官网https://www.scencloud.com反馈邮箱chatroomscencloud.com最后如果你觉得有用给个 Star 支持一下。有 bug 欢迎提 Issue但 v1.0 开源版只修严重 bug新功能只在闭源版更新。本软件仅供内部交流使用者言行及上传内容自行承担法律责任。严禁色情、暴力、赌博、诈骗、诽谤、侵犯他人隐私等违法行为。