20
Mar
March 20, 2017, 6:00 pm

用Python实现电脑远程遥控

一、实验介绍

1.1 实验内容

Flask是一个流行的Python Web框架,很适合制作各类简单任务的web应用。Pyautogui是一个键盘鼠标控制库,适合处理GUI相关自动化任务。本实验通过俩者的结合,实现一个简单的基于网络的电脑远程遥控器。 【对整个实验内容的概括介绍】

1.2 实验知识点 【实验中的核心知识点,完成该课程的收获】

  • Flask框架
  • PyAutoGUI库的基本使用

1.3 实验环境【实验使用的实验环境及核心开发及部署软件简单介绍】

  • python3
  • Xfce终端

1.4 适合人群

本课程难度为一般,属于初级级别课程,适合具有Python基础的用户,学习运用python及Flask基础知识解决实际问题。

1.5 代码获取

你可以通过下面命令将代码下载到实验楼环境中,作为参照对比进行学习。

二、实验原理【有则写无则不写】

PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,支持多平台(Windows,OS X,Linux);PyAutoGUI可根据指令进行鼠标移动,键盘输入,屏幕录制等操作。Flask是web应用框架,我们建设一个简单的flask应用,远程通过浏览器访问,通过在浏览器上点击相关功能按钮,触发相应指令传入Flask应用所在的电脑,并触发PyAutoGUI执行对应的鼠标操作,键盘操作。

三、开发准备【有则写无则不写】

打开Xfce终端,安装PyAutoGUI库

$ sudo apt-get install python3-dev python3-tk python3-pil # 先安装依赖包,否则pip3安装puautogui会报错
$ sudo pip3 install python3-xlib #Linux下 PyAutoGUI依赖python3-Xlib(Python 3), python-xlib(Python 2)
$ sudo pip3 install pyautogui # 安装pyautogui库

安装Flask Web框架

$ sudo pip3 install flask

四、项目文件结构

【针对具有多个文件的项目或者文件之间彼此有依赖关系,若项目仅一个代码文件的可忽略此项】
【整个项目所有文件(依赖文件、代码文件等)的目录结构】
【本实验涉及到的文件(需修改、重新编写等)单独标出】

项目文件结构图片

五、实验步骤

5.1 PyAutoGUI常用函数

  • pyautogui.position()获得当前鼠标的坐标
  • pyautogui.size()获得当前屏幕的分辨率(宽度和高度)
  • pyautogui.onScreen(x, y)位置(x,y)是否在屏幕上
  • pyautogui.moveTo(x, y, duration=num_seconds)用num_seconds秒的时间把光标移动到(x, y)位置;
  • 如需了解PyAutoGUI的其他函数功能,请查看本课程参考资料的内容
    当前鼠标的坐标

5.2 初始化Flask项目

进入 Code 目录,创建 iremote 文件夹, 将其作为课程的工作目录。

$ mkdir iremote
$ mkdir iremote/static
$ mkdir iremote/templates
$ mkdir tmp

iremote目录下创建__init__.py文件:

# -*-  coding: utf-8 -*-
from flask import Flask

iremote = Flask(__name__)
from iremote import views

iremote目录下创建views.py文件:

# -*-  coding: utf-8 -*-
from iremote import iremote

@iremote.route('/')
@iremote.route('/index')
def index():
    return "Hello, World!"

work目录下,创建run.py文件:

#!/user/bin/env python3
from iremote import iremote
iremote.run(debug=True, host='0.0.0.0')

至此,Flask项目初始化完毕,直接命令行运行:

$ python3 run.py

我们打开浏览器网址 http://127.0.0.1:5000,看到Hello, World!,即说明初始化完毕。

5.3 建立鼠标操作相关route

编辑iremote目录下__init__.py文件第二行,导入pyautogui库

# -*-  coding: utf-8 -*-
import pyautogui

编辑iremote目录下views.py文件,在index()函数后面,添加鼠标的向上向下向左向右,以及点击事件的route:

# -*-  coding: utf-8 -*-

@iremote.route('/command/mouse_up', methods=['POST'])
def mouse_move_up():
    print('mouse move up')
    pyautogui.moveRel(None, -30, duration=0.5)
    return ''

@iremote.route('/command/mouse_down', methods=['POST'])
def mouse_move_down():
    print('mouse move down')
    pyautogui.moveRel(None, 30, duration=0.5)
    return ''

@iremote.route('/command/mouse_left', methods=['POST'])
def mouse_move_left():
    print('mouse move left')
    pyautogui.moveRel(-30, None, duration=0.5)
    return ''

@iremote.route('/command/mouse_right', methods=['POST'])
def mouse_move_right():
    print('mouse move right')
    pyautogui.moveRel(30, None, duration=0.5)
    return ''

@iremote.route('/command/mouse_click', methods=['POST'])
def mouse_click():
    print('mouse clicked')
    pyautogui.click()
    return ''

这里主要涉及如下几个知识点:

  • 装饰器,@iremote.route是一个装饰器,用于绑定/command/mouse_upurl被通过[POST]方式访问时,需要调用的函数。
  • pyautogui.moveRel(x, y, duration=num_seconds)函数,表示用num_seconds秒的时间把光标的X轴(水平)坐标移动x像素,Y轴(竖直)坐标向下移动y像素;代码中我们设置的是一次移动30个像素,用时0.5秒,可根据自身调试需求灵活调整参数值;
  • pyautogui.click(x=moveToX, y=moveToY, clicks=num_of_clicks, interval=secs_between_clicks, button='left')函数就是让鼠标点击,默认是单击左键; 每个按键按下和松开两个事件又可以分开处理: pyautogui.mouseDown(x=moveToX, y=moveToY, button='left') pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')

5.4 编写遥控页面模板

编辑iremote目录下__init__.py文件第一行,导入render_template, url_for

# -*-  coding: utf-8 -*-
from flask import Flask, render_template, url_for

在上一节的views.py文件中,我们的index函数并无实质内容, 在这里我们把它完善;我们需要使用Flask的模板功能生成管理页,所以在文件头部导入render_template,

from flask import render_template

通过render_template方法指定模板文件index.html

@iremote.route('/')
@iremote.route('/index')
def index():
    return render_template('index.html')

在templates目录下,建立并编辑编写模板文件index.html

<html lang="en">
    <head>
        <title>iRemote Demo</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="{{ url_for('static', filename='style.css') }}" rel="stylesheet">
        <script type="text/javascript" src="{{ url_for('static', filename='jquery-3.2.1.min.js') }}"></script>
    </head>
    <script>
        $(document).ready(function(){
            $('.button').click(function() {
                commandAttr = $(this).attr("data")
                $.post("/command/" + commandAttr)
            });
        });

    </script>

    <body>
    <div class='row'>
        <div class='button up' data='mouse_up'>Up</div>
    </div>
    <div class='row'>
        <div class='button left' data='mouse_left'>Left</div>
        <div class='button click' data='mouse_click'>Click</div>
        <div class='button right' data='mouse_right'>Right</div>
    </div>
    <div class='row'>
        <div class='button down' data='mouse_down'>Down</div>
    </div>

    </body>
</html>

这段代码主要使用了以下几个知识点:

  • Flask的url_for()方法动态生成静态内容js文件和css文件的链接
  • jQuery的ready 事件,当页面已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件;由于该事件在文档就绪后发生,因此把所有其他的 jQuery 事件和函数置于该事件中是非常好的做法,正如上面的例子中那样。
  • jQuery的post()方法通过 HTTP POST 请求从服务器载入数据。

5.4 遥控器服务器端运行

通过如下命令,启动应用,

$ python3 run.py

运行图 通过浏览器访问http://127.0.0.1:5000访问,就看到如下界面,我们通过点击相应按钮,鼠标会进行移动等操作。
浏览器运行图

将相关代码移到自己电脑上,以同样方式运行,然后通过同wifi(局域网)的手机,访问管理页面http://电脑的ip:5000,即可在手机上操作鼠标,达到遥控电脑的目的。

六、实验总结

本实验的代码非常简单,涉及的知识点也不多,都是各个课程的基础知识,我们就是通过灵活使用各门课程的基础知识,解决我们遇到的实际问题。

本实验只实现了简单的鼠标移动,点击等操作,我们还可通过扩展使其完善,比如参照参考链接里的Flask教程,给该遥控器加入用户管理功能;通过form等方式,实现客户端和受控电脑之家的文件传输;通过PyAutoGUi的截屏功能实现客户端和受控电脑的相对实时监控,使其真正成为一个完善的遥控器。

七、课后习题

【针对实验内容留下课程习题提供用户检测】

打赏

Next Post Previous Post