最近写了一个轻量级的内网匿名聊天室系统,全部代码只在一个 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 真实 IP(X-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.sid

    text = data.get('text', '').strip()

    # 存数据库 + 广播给房间所有人

    socketio.emit('new_message', {

        'sid': sid,

        'nickname': nickname,

        'text': text,

        'time': int(time.time() * 1000)

    }, room=room_id)

 

3. 防撞库设计

 

同一 IP + 同一房间,错误 6 次后封禁 10 分钟。

def check_ip_ban(ip, room_id=None):

    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 True

    return False

4. 路径处理(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 Image

 

def 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 --name=ChatRoom --console --hidden-import=engineio.async_drivers.threading --clean main.py

 

3. 删除房间卡死

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反馈请联系:chatroom@scencloud.com

 

九、后续计划

· ✅ v1.0 已开源

· 🔜 v2.x 闭源(功能持续更新中)

 

十、项目地址

 

GitHub:https://github.com/scencloud/ChatRoom

 

出品方:风景云创科技 (ScenCloud)

官网:https://www.scencloud.com

反馈邮箱:chatroom@scencloud.com

 

最后

如果你觉得有用,给个 Star  支持一下。

 

有 bug 欢迎提 Issue,但 v1.0 开源版只修严重 bug,新功能只在闭源版更新。

 

 

本软件仅供内部交流,使用者言行及上传内容自行承担法律责任。严禁色情、暴力、赌博、诈骗、诽谤、侵犯他人隐私等违法行为。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐