OpenCV + PyAutoGUI + Tkinter + FastAPI + Requests 实现的长途控制软件设计方案

[复制链接]
发表于 2025-8-21 05:35:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
以下是基于 OpenCV + PyAutoGUI + Tkinter + FastAPI + Requests 实现的长途控制软件设计方案。该方案分为 被控端(服务端) 和 控制端(客户端),支持屏幕实时查看、键盘映射和鼠标操作。

1. 系统架构
  1. +-------------------+       +-------------------+       +-------------------+
  2. | 控制端(Tkinter) |<----->| 网络通信(HTTP)  |<----->| 被控端(FastAPI) |
  3. | UI界面            |       | FastAPI + Requests |       | OpenCV + PyAutoGUI |
  4. +-------------------+       +-------------------+       +-------------------+
复制代码

2. 被控端(服务端)

功能:


  • 提供屏幕截图接口
  • 接收键盘和鼠标操作指令
依赖安装
  1. pip install fastapi pyautogui opencv-python uvicorn
复制代码
代码实现
  1. # server.py
  2. from fastapi import FastAPI, HTTPException
  3. import pyautogui
  4. import cv2
  5. import numpy as np
  6. import base64
  7. from fastapi.responses import JSONResponse
  8. from fastapi.middleware.cors import CORSMiddleware
  9. app = FastAPI()
  10. # 允许跨域
  11. app.add_middleware(
  12.     CORSMiddleware,
  13.     allow_origins=["*"],
  14.     allow_methods=["*"],
  15.     allow_headers=["*"],
  16. )
  17. # 屏幕截图接口
  18. @app.get("/screenshot")
  19. def get_screenshot():
  20.     try:
  21.         # 使用pyautogui截图
  22.         screenshot = pyautogui.screenshot()
  23.         # 转换为OpenCV格式(BGR)
  24.         frame = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
  25.         # 压缩图像
  26.         _, buffer = cv2.imencode(".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70])
  27.         # 转换为Base64编码
  28.         jpg_as_text = base64.b64encode(buffer).decode()
  29.         return JSONResponse(content={"image": jpg_as_text})
  30.     except Exception as e:
  31.         raise HTTPException(status_code=500, detail=str(e))
  32. # 键盘操作接口
  33. @app.post("/keyboard")
  34. def keyboard_action(key: str):
  35.     try:
  36.         pyautogui.press(key)
  37.         return {"status": "success", "key": key}
  38.     except Exception as e:
  39.         raise HTTPException(status_code=500, detail=str(e))
  40. # 鼠标操作接口
  41. @app.post("/mouse")
  42. def mouse_action(x: int = None, y: int = None, button: str = "left", clicks: int = 1):
  43.     try:
  44.         if x is not None and y is not None:
  45.             pyautogui.moveTo(x, y)
  46.         pyautogui.click(button=button, clicks=clicks)
  47.         return {"status": "success", "action": f"Mouse {button} clicked at ({x}, {y})"}
  48.     except Exception as e:
  49.         raise HTTPException(status_code=500, detail=str(e))
  50. if __name__ == "__main__":
  51.     import uvicorn
  52.     uvicorn.run(app, host="0.0.0.0", port=8000)
复制代码
启动服务
  1. python server.py
复制代码

3. 控制端(客户端)

功能:


  • 表现实时屏幕画面
  • 提供键盘和鼠标操作界面
依赖安装
  1. pip install requests tkinter
复制代码
代码实现
  1. # client.py
  2. import tkinter as tk
  3. import requests
  4. from PIL import Image, ImageTk
  5. import base64
  6. from io import BytesIO
  7. class RemoteControlClient:
  8.     def __init__(self, root, server_ip="127.0.0.1"):
  9.         self.root = root
  10.         self.server_ip = server_ip
  11.         self.root.title("远程控制客户端")
  12.         self.root.geometry("800x600")
  13.         # 图像显示区域
  14.         self.panel = tk.Label(root)
  15.         self.panel.pack()
  16.         # 键盘输入框
  17.         self.key_entry = tk.Entry(root, width=20)
  18.         self.key_entry.pack(pady=10)
  19.         self.key_entry.bind("<Return>", self.send_keyboard)
  20.         # 鼠标坐标输入
  21.         self.x_entry = tk.Entry(root, width=5)
  22.         self.y_entry = tk.Entry(root, width=5)
  23.         self.x_entry.pack(side=tk.LEFT, padx=10)
  24.         self.y_entry.pack(side=tk.LEFT, padx=10)
  25.         # 鼠标点击按钮
  26.         self.mouse_btn = tk.Button(root, text="点击", command=self.send_mouse)
  27.         self.mouse_btn.pack(side=tk.LEFT, padx=10)
  28.         # 定时刷新屏幕
  29.         self.update_screen()
  30.     def update_screen(self):
  31.         try:
  32.             # 获取截图
  33.             response = requests.get(f"http://{self.server_ip}:8000/screenshot")
  34.             data = response.json()
  35.             # 解码Base64图像
  36.             image_data = base64.b64decode(data["image"])
  37.             image = Image.open(BytesIO(image_data))
  38.             # 调整图像尺寸
  39.             image = image.resize((800, 600), Image.ANTIALIAS)
  40.             photo = ImageTk.PhotoImage(image)
  41.             self.panel.configure(image=photo)
  42.             self.panel.image = photo
  43.         except Exception as e:
  44.             print("屏幕更新失败:", e)
  45.         # 每100毫秒刷新一次
  46.         self.root.after(100, self.update_screen)
  47.     def send_keyboard(self, event=None):
  48.         key = self.key_entry.get()
  49.         requests.post(f"http://{self.server_ip}:8000/keyboard", params={"key": key})
  50.         self.key_entry.delete(0, tk.END)
  51.     def send_mouse(self):
  52.         x = int(self.x_entry.get())
  53.         y = int(self.y_entry.get())
  54.         requests.post(f"http://{self.server_ip}:8000/mouse", params={"x": x, "y": y})
  55. if __name__ == "__main__":
  56.     root = tk.Tk()
  57.     app = RemoteControlClient(root, server_ip="192.168.1.100")  # 替换为被控端IP
  58.     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 进一步扩展。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表