当前位置: 首页 > news >正文

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

以下是基于 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 CORSMiddlewareapp = 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 uvicornuvicorn.run(app, host="0.0.0.0", port=8000)
启动服务
python server.py

3. 控制端(客户端)

功能
  • 显示实时屏幕画面
  • 提供键盘和鼠标操作界面
依赖安装
pip install requests tkinter
代码实现
# client.py
import tkinter as tk
import requests
from PIL import Image, ImageTk
import base64
from io import BytesIOclass RemoteControlClient:def __init__(self, root, server_ip="127.0.0.1"):self.root = rootself.server_ip = server_ipself.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 = photoexcept 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")  # 替换为被控端IProot.mainloop()

4. 使用说明

部署步骤
  1. 被控端

    • 运行 server.py,确保与控制端处于同一局域网。
    • 记录被控端的局域网IP(如 192.168.1.100)。
  2. 控制端

    • 修改 client.py 中的 server_ip 为被控端IP。
    • 运行 client.py,打开Tkinter界面。
功能演示
  • 屏幕查看:Tkinter窗口实时显示被控端屏幕。
  • 键盘输入:在输入框中输入按键(如 aenter),按回车发送。
  • 鼠标操作:输入坐标并点击“点击”按钮,触发鼠标点击。

5. 扩展功能建议

  1. 多分辨率适配:动态调整屏幕缩放比例。
  2. 加密传输:使用HTTPS和API密钥增强安全性。
  3. 实时视频流:改用WebSocket替代HTTP轮询,降低延迟。
  4. 文件传输:添加文件上传/下载接口。
  5. 多平台支持:通过PyInstaller打包为exe或macOS应用。

6. 注意事项

  • 性能优化:降低截图分辨率和帧率以减少带宽占用。
  • 防火墙设置:确保被控端开放 8000 端口。
  • 异常处理:增加网络断开重连机制。
  • 权限问题:被控端需保持屏幕常亮且未锁定。

通过以上方案,你可以快速实现一个基础的远程控制工具。如果需要更高级的功能(如实时音视频传输、多点协作),可结合 WebRTCZeroMQ 进一步扩展。

http://www.xdnf.cn/news/450631.html

相关文章:

  • 可视化图解算法39: 输出二叉树的右视图
  • Linux基础 -- SSH 流式烧录与压缩传输笔记
  • Restfull API 风格规则以及特点
  • Linux运维高频词对照表
  • “小显存”也能启动大模型
  • [数据结构]5. 栈-Stack
  • 服务器数据恢复—XFS文件系统分区消失的数据恢复案例
  • 基于.Net开发的网络管理与监控工具
  • 【算法】版本号排序
  • C++笔记-AVL树(包括单旋和双旋等)
  • 微信小程序学习之轮播图swiper
  • DeepSeek:AI助力高效工作与智能管理
  • Qwen3如何强化推理能力?
  • AISBench benchmark评测工具实操-精度评测场景-采用命令行指定模型和数据集的方式
  • ESP系列单片机选择指南:结合实际场景的最优选择方案
  • Jmeter 安装包与界面汉化
  • 【大模型】LLM概念相关问题(中)
  • day014-服务管理
  • Python机器学习笔记(二十二、模型评估-交叉验证)
  • 润金店发布“爱有千斤重“30周年限定爱意礼盒:以东方美学诠释爱的重量
  • elementplus el-tree 二次封装支持配置删除后展示展开或折叠编辑复选框懒加载功能
  • js对象原型,原型链
  • 制作一款打飞机游戏48:敌人转向
  • 嵌入式学习笔记 D20 :单向链表的基本操作
  • 3DMAX脚本病毒Spy CA查杀方法
  • 计算机网络笔记(二十八)——4.10软件定义网络SDN简介
  • 【0415】Postgres内核 释放指定 memory context 中所有内存 ④
  • 5.14 BGP作业
  • Linux操作系统实战:进程创建的底层原理(转)
  • 朱老师, 3518e系列,第三季