马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
以下是基于 OpenCV + PyAutoGUI + Tkinter + FastAPI + Requests 实现的长途控制软件设计方案。该方案分为 被控端(服务端) 和 控制端(客户端),支持屏幕实时查看、键盘映射和鼠标操作。
1. 系统架构
- +-------------------+ +-------------------+ +-------------------+
- | 控制端(Tkinter) |<----->| 网络通信(HTTP) |<----->| 被控端(FastAPI) |
- | UI界面 | | FastAPI + Requests | | OpenCV + PyAutoGUI |
- +-------------------+ +-------------------+ +-------------------+
复制代码 2. 被控端(服务端)
功能:
依赖安装
- pip install fastapi pyautogui opencv-python uvicorn
复制代码 代码实现
- # server.py
- from fastapi import FastAPI, HTTPException
- import pyautogui
- import cv2
- import numpy as np
- import base64
- from fastapi.responses import JSONResponse
- from fastapi.middleware.cors import CORSMiddleware
- app = FastAPI()
- # 允许跨域
- app.add_middleware(
- CORSMiddleware,
- allow_origins=["*"],
- allow_methods=["*"],
- allow_headers=["*"],
- )
- # 屏幕截图接口
- @app.get("/screenshot")
- def get_screenshot():
- try:
- # 使用pyautogui截图
- screenshot = pyautogui.screenshot()
- # 转换为OpenCV格式(BGR)
- frame = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
- # 压缩图像
- _, buffer = cv2.imencode(".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70])
- # 转换为Base64编码
- jpg_as_text = base64.b64encode(buffer).decode()
- return JSONResponse(content={"image": jpg_as_text})
- except Exception as e:
- raise HTTPException(status_code=500, detail=str(e))
- # 键盘操作接口
- @app.post("/keyboard")
- def keyboard_action(key: str):
- try:
- pyautogui.press(key)
- return {"status": "success", "key": key}
- except Exception as e:
- raise HTTPException(status_code=500, detail=str(e))
- # 鼠标操作接口
- @app.post("/mouse")
- def mouse_action(x: int = None, y: int = None, button: str = "left", clicks: int = 1):
- try:
- if x is not None and y is not None:
- pyautogui.moveTo(x, y)
- pyautogui.click(button=button, clicks=clicks)
- return {"status": "success", "action": f"Mouse {button} clicked at ({x}, {y})"}
- except Exception as e:
- raise HTTPException(status_code=500, detail=str(e))
- if __name__ == "__main__":
- import uvicorn
- uvicorn.run(app, host="0.0.0.0", port=8000)
复制代码 启动服务
3. 控制端(客户端)
功能:
依赖安装
- pip install requests tkinter
复制代码 代码实现
- # client.py
- import tkinter as tk
- import requests
- from PIL import Image, ImageTk
- import base64
- from io import BytesIO
- class RemoteControlClient:
- def __init__(self, root, server_ip="127.0.0.1"):
- self.root = root
- self.server_ip = server_ip
- self.root.title("远程控制客户端")
- self.root.geometry("800x600")
- # 图像显示区域
- self.panel = tk.Label(root)
- self.panel.pack()
- # 键盘输入框
- self.key_entry = tk.Entry(root, width=20)
- self.key_entry.pack(pady=10)
- self.key_entry.bind("<Return>", self.send_keyboard)
- # 鼠标坐标输入
- self.x_entry = tk.Entry(root, width=5)
- self.y_entry = tk.Entry(root, width=5)
- self.x_entry.pack(side=tk.LEFT, padx=10)
- self.y_entry.pack(side=tk.LEFT, padx=10)
- # 鼠标点击按钮
- self.mouse_btn = tk.Button(root, text="点击", command=self.send_mouse)
- self.mouse_btn.pack(side=tk.LEFT, padx=10)
- # 定时刷新屏幕
- self.update_screen()
- def update_screen(self):
- try:
- # 获取截图
- response = requests.get(f"http://{self.server_ip}:8000/screenshot")
- data = response.json()
- # 解码Base64图像
- image_data = base64.b64decode(data["image"])
- image = Image.open(BytesIO(image_data))
- # 调整图像尺寸
- image = image.resize((800, 600), Image.ANTIALIAS)
- photo = ImageTk.PhotoImage(image)
- self.panel.configure(image=photo)
- self.panel.image = photo
- except Exception as e:
- print("屏幕更新失败:", e)
- # 每100毫秒刷新一次
- self.root.after(100, self.update_screen)
- def send_keyboard(self, event=None):
- key = self.key_entry.get()
- requests.post(f"http://{self.server_ip}:8000/keyboard", params={"key": key})
- self.key_entry.delete(0, tk.END)
- def send_mouse(self):
- x = int(self.x_entry.get())
- y = int(self.y_entry.get())
- requests.post(f"http://{self.server_ip}:8000/mouse", params={"x": x, "y": y})
- if __name__ == "__main__":
- root = tk.Tk()
- app = RemoteControlClient(root, server_ip="192.168.1.100") # 替换为被控端IP
- root.mainloop()
复制代码 4. 使用说明
摆设步骤
- 被控端:
- 运行 server.py,确保与控制端处于同一局域网。
- 记载被控端的局域网IP(如 192.168.1.100)。
- 控制端:
- 修改 client.py 中的 server_ip 为被控端IP。
- 运行 client.py,打开Tkinter界面。
功能演示
- 屏幕查看:Tkinter窗口实时表现被控端屏幕。
- 键盘输入:在输入框中输入按键(如 a、enter),按回车发送。
- 鼠标操作:输入坐标并点击“点击”按钮,触发鼠标点击。
5. 扩展功能建议
- 多分辨率适配:动态调解屏幕缩放比例。
- 加密传输:使用HTTPS和API密钥加强安全性。
- 实时视频流:改用WebSocket替代HTTP轮询,降低耽误。
- 文件传输:添加文件上传/下载接口。
- 多平台支持:通过PyInstaller打包为exe或macOS应用。
6. 注意事项
- 性能优化:降低截图分辨率和帧率以减少带宽占用。
- 防火墙设置:确保被控端开放 8000 端口。
- 异常处置处罚:增加网络断开重连机制。
- 权限问题:被控端需保持屏幕常亮且未锁定。
通过以上方案,你可以快速实现一个基础的长途控制工具。假如必要更高级的功能(如实时音视频传输、多点协作),可团结 WebRTC 或 ZeroMQ 进一步扩展。
|