精华内容
下载资源
问答
  • python远程控制手机
    2021-08-12 21:59:30

    使用Python控制手机

    1.0 一切从一个薅羊毛项目开始说起

    假期我有一个andorid设备自动化需求,于是乎就想到了Python。但是Python并没有可以直接操作android的库(或者我没去研究)。于是乎就想到了万能的andorid调试工具adb

    1.1 android和adb的关系

    android操作系统是老生常谈的内容了,今天在这里不做过多赘述,接下来开始介绍adb
    adb全称(Android debug bridge),主要用于android程序开发中的debug操作。

    1.2 adb安装配置

    SYSTEMURL
    WINDOWShttps://dl.google.com/android/repository/platform-tools-latest-windows.zip
    Linuxhttps://dl.google.com/android/repository/platform-tools-latest-windows.zip
    MAChttps://dl.google.com/android/repository/platform-tools-latest-linux.zip

    直接下载解压即可,再添加到系统变量即可。
    打开bash或者cmd,在里面输入:adb --version
    有回显即代表配置完成。

    • 如果你是在Linux系统,安装方法则更为简单——只需要使用apt软件管理包来安装就可以。sudo apt install adb

    1.3 了解os.system方法和os.popen方法

    在Python中,我们可以使用os.system方法和os.popen方法来执行系统命令。当然我可不是说在Python中只有这两种执行命令的方法啊。只是对于我们这个需求来说,这两个命令便已足够。

    import os
    os.system("ping baidu.com") # 使用os.system()方法来ping百度
    
    • popen方法作为一个扩展阅读,有兴趣的话请自行了解

    1.4 adb基础命令熟悉

    网上此类教程甚多,我再去写也没什么意义。包括我自己也是边用边查,详细请查阅adb官方文档。

    1.5 做Python自动化工作

    我们使用面向对象的编程思想,新建一个属于我们自己的对象。

    import os
    class Adb():
        devide = ""
        
        def __init__(self,devide):
            self.devide = devide
            super().__init__()
        
        def text(self,text):
            '''
            该方法用于输入特定文本内容
            '''
            # print ("[+++]adb -s %s shell input text %s" % (self.devide,text))
            os.system("adb -s %s shell input text %s" % (self.devide,text))
    
        def tap(self,x,y):
            '''
            该方法用于点击特定内容
            '''
            os.system("adb -s %s shell input tap %s %s" % (self.devide,x,y))
        
        def swipe(self,x,y,x1,y1):
            '''
            该方法用于滑动屏幕
            '''
            os.system ("adb -s %s shell input swipe %s %s %s %s" % (self.devide,x,y,x1,y1))
    
        def killApp(self,App):
            '''
            该方法用于关闭App
            '''
            os.system("adb -s %s shell am force-stop %s" % (self.devide,App))
        
        def startApp(self,App):
            '''
            该方法用于启动App
            '''
            os.system("adb -s %s shell am start %s" % (self.devide,App))
            
        def screencap(self,imgName=""):
            '''
            该方法用于对目前操作的手机截图,欢迎使用。
            imgName - 想要输出的图片名字,填写空则输出到当前目录下
            '''
            os.system("adb -s %s shell /system/bin/screencap -p /sdcard/screenshot.png" % (self.devide))
            # sleep(3)
            os.system("adb -s %s pull /sdcard/screenshot.png %s" % (self.devide,imgName))
    
        def keyevent(self,keycode):
            os.system("adb -s %s shell input keyevent %s" % (self.devide,keycode))
    
    

    该对象里包含了很多操作设备的方法,比如说我如果想操作127.0.0.1:62001。我只需要把127.0.0.1:62001这个参数传入Adb类中让他实例化成一个对象,就像这样。

    if __name__=="__main__":
        a = Adb("127.0.0.1:62001")
    

    是不是有点熟悉的味道了?如果我们想要启动app就直接找到相应的方法startApp,然后实例化的对象a里传入app的包名。

    a.startApp("com.*.*")

    就调用完成了。

    至此,我们就完成了自动化的准备工作。在哪之后,如果我们编写一个程序需要干一些事情。便可以直接调用方法。

    更多相关内容
  • 主要介绍了python如何实现远程控制电脑,利用python设计了一个程序来实现自由管控,感兴趣的小伙伴们可以参考一下
  • python控制手机

    千次阅读 2021-11-28 13:21:55
    需要设备安装ATX编写Python代码进行控制手机4.ui的一些操作命令如下:1.链接设备2.打开调试开关3.获取设备信息4.获取应用信息:5.启动应用:6.停止应用:7.推拉文件:8.关键事件:9.解锁屏幕10.手势与设备的交互:11....

    1.首先安装依赖环境,uiautomator2和其他依赖包

    
    # GitHub地址:
    # https://github.com/openatx/uiautomator2
     
    pip install uiautomator2  # 这个包是用于控制手机
    pip install pillow  # 这个包用于截图
    pip install -U weditor  # 这个包是可以调试,在浏览器页面上直观的获取某个控件名称
    

    2.需要安装Adb环境

    adb devices
    

    3.需要设备安装ATX

    python -m uiautomator2 init
    

    在这里插入图片描述
    在这里插入图片描述

    编写Python代码进行控制手机

    
    # 引用uiautomator2包
    import uiautomator2 as u2
     
    # 使用设备唯一标志码链接设备,其中9phqaetw是通过adb获取的设备标志码
    d = u2.connect('9phqaetw')  
    # d = u2.connect()  # 当前只有一个设备时可以用这个
     
    d.unlock()  # 解锁屏幕
     
    x,y = 100,100
    d.click(x,y)  # 点击屏幕坐标为 x,y 的点
     
    # 双击屏幕
    d.double_click(x,y)
     
    # 长按
    d.long_click(x,y)
     
    # 单机屏幕上字符为9的控件
    d(text="9").click()
    

    weditor调试工具

    python -m weditor
    # 第二种方式是在桌面创建快捷方式,在桌面会自动创建一个名为WEditor的图标,双击即可。
    weditor --shortcut
    

    在这里插入图片描述

    4.ui的一些操作命令如下:

    1.链接设备
    import uiautomator2 as u2
    d = u2.connect('123456789F') # USB链接设备。或者u2.connect_usb('123456f')
    #d = u2.connect_usb() 或者 d = u2.connect() ,当前只有一个设备时可以用这个
    
    2.打开调试开关
    d.debug = True
    d.info
    
    3.获取设备信息
    # 获取基本信息
    print(d.info)
    
    # 获取窗口大小
    print(d.window_size())
    # 设备垂直输出示例: (1080, 1920)
    # 设备水平输出示例: (1920, 1080)
    
    # 获取当前应用程序信息。对于某些android设备,输出可以为空
    print(d.current_app())
    
    #获取设备序列号
    print(d.serial)
    
    #获取WIFI IP
    print(d.wlan_ip)
    
    #获取详细的设备信息
    print(d.device_info)
    
    4.获取应用信息:
    d.app_info("com.eg.android.AlipayGphone")
    # 会输出
    ----
    {
     "packageName": "com.eg.android.AlipayGphone", 
     "mainActivity": "com.eg.android.AlipayGphone.AlipayLogin", 
     "label": "支付寶", 
     "versionName": "10.2.13.9020", 
     "versionCode": 360, 
     "size": 108306104
    }
    ---
    # 保存应用程序图标
    img = d.app_icon("com.eg.android.AlipayGphone")
    img.save("icon.png")
    
    5.启动应用:
    d.app_start('com.eg.android.AlipayGphone') #引号内为包名称,这里为支付宝
    
    6.停止应用:
    #相当于'am force-stop'强制停止应用
    d.app_stop('com.eg.android.AlipayGphone') 
    
    #相当于'pm clear' 清空App数据
    d.app_clear('com.eg.android.AlipayGphone')
    # 停止所有
    d.app_stop_all()
    
    # 停止所有应用程序,除了com.examples.demo
    d.app_stop_all(excludes=['com.examples.demo'])
    
    7.推拉文件:
    # push文件夹
    d.push("foo.txt", "/sdcard/")
    # push和重命名
    d.push("foo.txt", "/sdcard/bar.txt")
    # push fileobj
    with open("foo.txt", 'rb') as f:
     d.push(f, "/sdcard/")
    # 推动和更改文件访问模式
    d.push("foo.sh", "/data/local/tmp/", mode=0o755)
    # 从 设备中拉出一个文件
    d.pull("/sdcard/tmp.txt", "tmp.txt")
    
    # 如果在设备上找不到文件,FileNotFoundError将引发
    d.pull("/sdcard/some-file-not-exists.txt", "tmp.txt")
    
    8.关键事件:
    d.screen_on()#打开屏幕 
    d.screen_off() #关闭屏幕
    2)获取当前屏幕状态
    d.info.get('screenOn') # 需要 Android> = 4.4
    3)硬键盘和软键盘操作
    d.press("home") # 点击home键
    d.press("back") # 点击back键
    d.press("left") # 点击左键
    d.press("right") # 点击右键
    d.press("up") # 点击上键
    d.press("down") # 点击下键
    d.press("center") # 点击选中
    d.press("menu") # 点击menu按键
    d.press("search") # 点击搜索按键
    d.press("enter") # 点击enter键
    d.press("delete") # 点击删除按键
    d.press("recent") # 点击近期活动按键
    d.press("volume_up") # 音量+
    d.press("volume_down") # 音量-
    d.press("volume_mute") # 静音
    d.press("camera") # 相机
    d.press("power") #电源键
    
    9.解锁屏幕
    d.unlock()
    # 相当于
    # 1. 发射活动:com.github.uiautomator.ACTION_IDENTIFY
    # 2. 按home键
    
    10.手势与设备的交互:
    # 单击屏幕
    d.click(x,y) # x,y为点击坐标
    
    # 双击屏幕
    d.double_click(x,y)
    d.double_click(x,y,0.1) # 默认两个单击之间间隔时间为0.1秒
    
    # 长按
    d.long_click(x,y)
    d.long_click(x,y,0.5) # 长按0.5秒(默认)
    
    # 滑动
    d.swipe(sx, sy, ex, ey)
    d.swipe(sx, sy, ex, ey, 0.5) #滑动0.5s(default)
    
    #拖动
    d.drag(sx, sy, ex, ey)
    d.drag(sx, sy, ex, ey, 0.5)#拖动0.5s(default)
    # 滑动点 多用于九宫格解锁,提前获取到每个点的相对坐标(这里支持百分比)
    
    # 从点(x0, y0)滑到点(x1, y1)再滑到点(x2, y2)
    # 两点之间的滑动速度是0.2秒
    d.swipe((x0, y0), (x1, y1), (x2, y2), 0.2)
    # 注意:单击,滑动,拖动操作支持百分比位置值。例:
    d.long_click(0.5, 0.5) 表示长按屏幕中心
    
    11.XPath
    # 检索方向
    d.orientation
    # 检索方向。输出可以是 "natural" or "left" or "right" or "upsidedown"
    
    # 设置方向
    d.set_orientation("l") # or "left"
    d.set_orientation("r") # or "right"
    d.set_orientation("n") # or "natural"
    
    #冻结/ 开启旋转
    d.freeze_rotation() # 冻结旋转
    d.freeze_rotation(False) # 开启旋转
    
    ########## 截图 ############
    # 截图并保存到电脑上的一个文件中,需要Android>=4.2。
    d.screenshot("home.jpg")
     
    # 得到PIL.Image格式的图像. 但你必须先安装pillow
    image = d.screenshot() # default format="pillow"
    image.save("home.jpg") # 或'home.png',目前只支持png 和 jpg格式的图像
     
    # 得到OpenCV的格式图像。当然,你需要numpy和cv2安装第一个
    import cv2
    image = d.screenshot(format='opencv')
    cv2.imwrite('home.jpg', image)
     
    # 获取原始JPEG数据
    imagebin = d.screenshot(format='raw')
    open("some.jpg", "wb").write(imagebin)
    
    #############################
    
    # 转储UI层次结构
    # get the UI hierarchy dump content (unicoded).(获取UI层次结构转储内容)
    d.dump_hierarchy()
    
    
    # 打开通知或快速设置
    d.open_notification() #下拉打开通知栏
    d.open_quick_settings() #下拉打开快速设置栏
    
    # 检查特定的UI对象是否存在
    d(text="Settings").exists # 返回布尔值,如果存在则为True,否则为False
    d.exists(text="Settings") # 另一种写法
    # 高级用法
    d(text="Settings").exists(timeout=3) # 等待'Settings'3秒钟出现
    
    # 获取特定UI对象的信息
    d(text="Settings").info
    
    # 获取/设置/清除可编辑字段的文本(例如EditText小部件)
    d(text="Settings").get_text() #得到文本小部件
    d(text="Settings").set_text("My text...") #设置文本
    d(text="Settings").clear_text() #清除文本
    
    # 获取Widget中心点
    d(text="Settings").center()
    #d(text="Settings").center(offset=(0, 0)) # 基准位置左前
    
    12.UI对象有五种定位方式:
    # text、resourceId、description、className、xpath、坐标
    
    # 执行单击UI对象
    #text定位单击
    d(text="Settings").click()
    d(text="Settings", className="android.widget.TextView").click()
    
    #resourceId定位单击
    d(resourceId="com.ruguoapp.jike:id/tv_title", className="android.widget.TextView").click() 
    
    #description定位单击
    d(description="设置").click()
    d(description="设置", className="android.widget.TextView").click()
    
    #className定位单击
    d(className="android.widget.TextView").click()
    
    #xpath定位单击
    d.xpath("//android.widget.FrameLayout[@index='0']/android.widget.LinearLayout[@index='0']").click()
    
    #坐标单击
    d.click(182, 1264)
    
    # 等待元素出现(最多10秒),出现后单击 
    d(text="Settings").click(timeout=10)
    # 在10秒时点击,默认的超时0
    d(text='Skip').click_exists(timeout=10.0)
    # 单击直到元素消失,返回布尔
    d(text="Skip").click_gone(maxretry=10, interval=1.0) # maxretry默认值10,interval默认值1.0
    # 点击基准位置偏移
    d(text="Settings").click(offset=(0.5, 0.5)) # 点击中心位置,同d(text="Settings").click()
    d(text="Settings").click(offset=(0, 0)) # 点击左前位置
    d(text="Settings").click(offset=(1, 1)) # 点击右下
    
    # 执行双击UI对象
    d(text="设置").double_click() # 双击特定ui对象的中心
    d.double_click(x, y, 0.1) # 两次单击之间的默认持续时间为0.1秒
    
    #执行长按UI对象
    # 长按特定UI对象的中心
    d(text="Settings").long_click()
    d.long_click(x, y, 0.5) # 长按坐标位置0.5s默认
    
    # 将UI对象拖向另一个点或另一个UI对象
    # Android<4.3不能使用drag.
    # 在0.5秒内将UI对象拖到屏幕点(x, y)
    d(text="Settings").drag_to(x, y, duration=0.5)
    
    # 将UI对象拖到另一个UI对象的中心位置,时间为0.25d(text="Settings").drag_to(text="Clock", duration=0.25)
    
    13.常见用法:
    # 等待10s
    d.xpath("//android.widget.TextView").wait(10.0)
    
    # 找到并单击
    d.xpath("//*[@content-desc='分享']").click()
    
    # 检查是否存在
    if d.xpath("//android.widget.TextView[contains(@text, 'Se')]").exists:
     print("exists")
     
    # 获取所有文本视图文本、属性和中心点
    for elem in d.xpath("//android.widget.TextView").all():
     print("Text:", elem.text)
     
    #获取视图文本
    for elem in d.xpath("//android.widget.TextView").all():
     print("Attrib:", elem.attrib)
     
    #获取属性和中心点
    #返回: (100, 200)
    for elem in d.xpath("//android.widget.TextView").all():
     print("Position:", elem.center())
    
    # xpath常见用法:
    # 所有元素
    //*
    # resource-id包含login字符
    //*[contains(@resource-id, 'login')]
    
    # 按钮包含账号或帐号
    //android.widget.Button[contains(@text, '账号') or contains(@text, '帐号')]
    
    # 所有ImageView中的第二个
    (//android.widget.ImageView)[2]
    
    # 所有ImageView中的最后一个
    (//android.widget.ImageView)[last()]
    
    # className包含ImageView
    //*[contains(name(), "ImageView")]
    
    14.元素定位
    element = d(resourceId=value) #控件 id
    element = d(text=value) #控件上显示的文本
    element = d(description=value) #控件描述
    element = d(className=value) #控件所属的类
    #判断是否存在
    element.exists  # 属性值唯一
    element[index].exists  # 属性值不唯一
    
    15.元素控制
    15.1单击控件
    element[index].click()  # 定位的控件有多个,通过 index 指定某一个
    element.click()  # 定位的控件只有一个,等价于 element[0].click()
    d.click(x, y)  # 点击具体坐标
    
    15.2双击控件
    element[index].double_click()  # 定位的控件有多个,通过 index 指定某一个
    element.double_click()  # 定位的控件只有一个,等价于 element[0].double_click()
    d.double_click(x, y)  # 双击具体坐标
    
    15.3长按控件
    
    element[index].long_click()  # 定位的控件有多个,通过 index 指定某一个
    element.long_click()  # 定位的控件只有一个,等价于 element[0].long_click()
    d.long_click(x, y, duration=0.5)  # 长按具体坐标
    
    16.文本操作
    
    element[index].set_text(text)  # 定位的控件有多个,通过 index 指定某一个
    element.set_text(text)  # 定位的控件只有一个,等价于 element[0].set_text(text)
    #当页面中有且仅有一个编辑框时,可以使用以下代码
    d.set_fastinput_ime(True)  # 打开输入法
    d.send_keys(text)  # 输入文本
    d.set_fastinput_ime(False)  # 关闭输入法
    ##   清除文本:
    
    element[index].clear_text()  # 定位的控件有多个,通过 index 指定某一个
    element.clear_text()  # 定位的控件只有一个,等价于 element[0].clear_text()
    ##   获取文本:
    
    element[index].get_text()  # 定位的控件有多个,通过 index 指定某一个
    element.get_text()  # 定位的控件只有一个,等价于 element[0].get_text()
    
    17.手势控制
    # 滑动
    d.swipe(sx, sy, ex, ey, duration=0.5)
    # 拖拽
    d.drag(sx, sy, ex, ey, duration=0.5)
    
    18.常见adb的一些命令
    import os 
     
    # 返回桌面
    os.system("adb shell input keyevent 3")
    
    19常用如下:
    3    HOME 键
    4    返回键
    5    打开拨号应用
    6    挂断电话
    24   增加音量
    25   降低音量
    26   电源键
    27   拍照(需要在相机应用里)
    64   打开浏览器
    82   菜单键
    85   播放/暂停
    86   停止播放
    87   播放下一首
    88   播放上一首
    122  移动光标到行首或列表顶部
    123  移动光标到行末或列表底部
    126  恢复播放
    127  暂停播放
    164  静音
    176  打开系统设置
    187  切换应用
    207  打开联系人
    208  打开日历
    209  打开音乐
    210  打开计算器
    220  降低屏幕亮度
    221  提高屏幕亮度
    223  系统休眠
    224  点亮屏幕
    231  打开语音助手
    276  如果没有 wakelock 则让系统休眠
    

    未完待续…

    展开全文
  • Python控制远程摄像头

    2022-04-01 16:20:17
    有什么办法可以控制摄像头呈现的画面啊, 在摄像头还能被原有者操作的情况下让摄像头传回的画面永远是一段循环的视屏或者静态图片
  • 但是我想用程序自己去实现远程控制桌面的功能。原以为网上到处都是,结果找了好几天,要么文章杂乱无序,要么都要结合微信等等。 于是我只能在众多代码中百里挑一选取自己需要的那一小部分,然后不断地拼凑,不断地...

    目录

    前言

    一、实现思路

    二、功能实现

    1.下载所用到的第三方库

    2.代码实现

    三、实现跨网段控制

    四、结语


    前言

    写程序的时候或遇到电脑中一些问题,有时候会去下载专门的软件去远程协助。但是我想用程序自己去实现远程控制桌面的功能。原以为网上到处都是,结果找了好几天,要么文章杂乱无序,要么都要结合微信等等。

    于是我只能在众多代码中百里挑一选取自己需要的那一小部分,然后不断地拼凑,不断地理解大神的代码,最终做出这么一个远程控制桌面功能。我热泪盈眶地望着写好的代码,中间好几次拼不对或遇到bug导致程序无数次崩溃,差点就想放弃了......

    以下是参考网站的名单:

    1.全网最全免费内网穿透映射工具教程:https://www.bilibili.com/video/BV1Ja4y1J7Fj?

    2.配套博客地址:https://www.it235.com/实用工具/内网穿透/pierce.html


    一、实现思路

    1. 你和对方建立一个Socket链接(协议是tcp/ip这种有状态协议)

    2. 对方系统会在这个socket链接上实时给你发送目前他截屏到的图像和系统状态数据 

    3. 你收到数据,程序解析出相对的命令和发送来的图像

    4. 通过这个命令来达到本机还原操作和控制效果(包括图象,鼠标和键盘等等)

    5. 然后重复流程2,循环反复






    二、功能实现





    1.下载所用到的第三方库

    如何下载慢或报错超时后面加上镜像地址 -i https://pypi.douban.com/simple/

    例如:pip install numpy==1.21.2 -i https://pypi.douban.com/simple/​

    pip install numpy==1.21.2
    pip install pywin32==302
    pip install Pillow==8.4.0
    pip install mouse==0.7.1
    pip install keyboard==0.13.5
    pip install opencv-python==4.5.3.56




    2.代码实现

    全代码在本文末尾相关资源中

    控制端control.py主运行函数

    def main():
    
        lenb = soc.recv(5)
        imtype, le = struct.unpack(">BI", lenb)
        imb = b''
    
        while le > BUF_SIZE:
            t = soc.recv(BUF_SIZE)
            imb += t
            le -= len(t)
        while le > 0:
            t = soc.recv(le)
            imb += t
            le -= len(t)
    
        data = np.frombuffer(imb, dtype=np.uint8)
        img = cv2.imdecode(data, cv2.IMREAD_COLOR)
        h, w, _ = img.shape
        fix_height, fix_width = h, w
        imsh = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)
        imi = Image.fromarray(imsh)
        imgTK = ImageTk.PhotoImage(image=imi)
        cv = tkinter.Canvas(show_canvas, width=w, height=h, bg="white")
        cv.focus_set()
        bind_events(cv, soc)
        cv.pack()
        cv.create_image(0, 0, anchor=tkinter.NW, image=imgTK)
        h = int(h * scale)
        w = int(w * scale)
        while True:
            if is_scale:
                h = int(fix_height * scale)
                w = int(fix_width * scale)
                cv.config(width=w, height=h)
                is_scale = False
            try:
                lenb = soc.recv(5)
                imtype, le = struct.unpack(">BI", lenb)
                imb = b''
                while le > 0:
                    t = soc.recv(le)
                    imb += t
                    le -= len(t)
                data = np.frombuffer(imb, dtype=np.uint8)
                ims = cv2.imdecode(data, cv2.IMREAD_COLOR)
                if imtype == 1:
                    img = ims
                else:
                    img = img + ims
                imt = cv2.resize(img, (w, h))
                imsh = cv2.cvtColor(imt, cv2.COLOR_RGB2RGBA)
                imi = Image.fromarray(imsh)
                imgTK.paste(imi)
            except:
                show_canvas = None
                show_screen()
                return
    

    被控制端controlled.py主运行函数

    def main(conn):
    
        def Op(key, op, ox, oy):
            # print(key, op, ox, oy)
            if key == 1:
                if op == 100:
                    # 左键按下
                    mouse.move(ox, oy)
                    mouse.press(button=mouse.LEFT)
                elif op == 117:
                    # 左键弹起
                    x, y = mouse.get_position()
                    if ox != x or oy != y:
                        if not mouse.is_pressed():
                            mouse.press(button=mouse.LEFT)
                        mouse.move(ox, oy)
                    mouse.release(button=mouse.LEFT)
            elif key == 2:
                # 滚轮事件
                if op == 0:
                    # 向上
                    mouse.move(ox, oy)
                    mouse.wheel(delta=-1)
                else:
                    # 向下
                    mouse.move(ox, oy)
                    mouse.wheel(delta=1)
            elif key == 3:
                # 鼠标右键
                if op == 100:
                    # 右键按下
                    mouse.move(ox, oy)
                    mouse.press(button=mouse.RIGHT)
                elif op == 117:
                    # 右键弹起
                    mouse.move(ox, oy)
                    mouse.release(button=mouse.RIGHT)
            else:
                k = OFFICIAL_VIRTUAL_KEYS.get(key)
                if k is not None:
                    if op == 100:
                        keyboard.press(k)
                    elif op == 117:
                        keyboard.release(k)
        try:
            base_len = 6
            while True:
                cmd = b''
                rest = base_len - 0
                while rest > 0:
                    cmd += conn.recv(rest)
                    rest -= len(cmd)
                key = cmd[0]
                op = cmd[1]
                x = struct.unpack('>H', cmd[2:4])[0]
                y = struct.unpack('>H', cmd[4:6])[0]
                Op(key, op, x, y)
        except:
            return

    config.py

    # 网络配置
    PORT = 80  # 固定端口号
    
    # 其他配置
    IMQUALITY = 50
    OFFICIAL_VIRTUAL_KEYS = {
        0x08: 'backspace',
        0x09: 'tab',
        0x0c: 'clear',
        0x0d: 'enter',
        0x10: 'shift',
        0x11: 'ctrl',
        0x12: 'alt',
        0x1b: 'esc',
        0x21: 'page up',
        0x22: 'page down',
        0x23: 'end',
        0x24: 'home',
        0x25: 'left',
        0x30: '0',
        0x31: '1',
        0x32: '2',
        0x33: '3',
        0x34: '4',
        0x35: '5',
        0x36: '6',
        0x37: '7',
        0x38: '8',
        0x39: '9',
        0x41: 'a',
        0x42: 'b',
        0x43: 'c',
        0x44: 'd',
        0x45: 'e',
        0x46: 'f',
        0x47: 'g',
        0x48: 'h',
        0x49: 'i',
        0x4a: 'j',
        0x4b: 'k',
        0x4c: 'l',
        0x4d: 'm',
        0x4e: 'n',
        0x4f: 'o',
        0x50: 'p',
        0x51: 'q',
        0x52: 'r',
        0x53: 's',
        0x54: 't',
        0x55: 'u',
        0x56: 'v',
        0x57: 'w',
        0x58: 'x',
        0x59: 'y',
        0x5a: 'z',
        0x60: '0',
        0x61: '1',
        0x62: '2',
        0x63: '3',
        0x64: '4',
        0x65: '5',
        0x66: '6',
        0x67: '7',
        0x68: '8',
        0x69: '9',
        0x6a: '*',
        0x6b: '=',
        0x6d: '-',
        0x6f: '/',
        0x70: 'f1',
        0x71: 'f2',
        0x72: 'f3',
        0x73: 'f4',
        0x74: 'f5',
        0x75: 'f6',
        0x76: 'f7',
        0x77: 'f8',
        0x78: 'f9',
        0x79: 'f10',
        0x7a: 'f11',
        0x7b: 'f12',
        0x7c: 'f13',
        0xbb: '+',
        0xbc: ',',
        0xbd: '-',
        0xbe: '.',
        0xba: ';',
        0xde: '\'',
        0xdb: '[',
        0xdd: ']',
        0xbf: '/',
        0xc0: '`',
        0xdc: '\\',
    }
    





    三、实现跨网段控制

    1. 有公网服务器的可以自己搭建服务器,这里就不细讲了

    2. 内网穿透教程在文章开头参考网站的名单下

    3. 图片教程如下,我示范用的是Ngrok内网穿透(有些内网穿透可能用起来会比较卡):

    被控制端运行效果如下:

    注:第一幅图上的内网服务器地址是指内网穿透的服务器地址(截图时打错了)

    控制端运行效果如下:


    四、结语

    这次的Python实现远程控制桌面功能其实很早就想写了,国庆之后的几天就已经开始打稿了,但迫于前段时间事务繁多,一直没能写完,只能在周六周天茶余饭饱之际写文章。之后会不定期更新一些博客,分享自己的程序和经验。

    至此,终于完成了远程控制桌面功能!
    另外,如果在使用这个代码的过程中有遇到什么问题,也欢迎向我反馈。

    感谢大家的支持和观看,看到这儿的朋友要是喜欢的话就点个关注呗^_^,你们的支持是我更新的最大动力!

    感谢粉丝shtsyfb提出的宝贵意见 !

    相关资源:https://download.csdn.net/download/python_sy/33898757

    展开全文
  • 很多时候,我们都有远程控制电脑的需求。比如正在下载某样东西,需要让电脑在下载完后关机。或者你需要监控一个程序的运行状况等。 今天我们就来用Python实现一个远程监控并控制电脑的小程序。 二、实现原理 听...

    大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者。

    每个人都想要改变世界,却没人想过要改变自己

    一、前言

    很多时候,我们都有远程控制电脑的需求。比如正在下载某样东西,需要让电脑在下载完后关机。或者你需要监控一个程序的运行状况等。

    今天我们就来用Python实现一个远程监控并控制电脑的小程序。

    二、实现原理

    听起来远程控制电脑好像很高级的样子,但是实现起来其实非常简单。实现原理如下:

    1. 运行程序,让程序不停地读取邮件

    2. 用手机给电脑发送邮件

    3. 判断是否读取到指定主题的邮件,如果有,则获取邮件内容

    4. 根据邮件内容,执行预设的函数

    与其说是学习如何远程控制电脑,还不如说是学习如何读取邮件。当然,上面的的流程只实现了远程控制电脑,而没实现对电脑的监控。而监控的操作可以以截图的方式来进行。

    我们可以预设一个指令,当读取到邮件内容为grab时,我们就发送电脑截图。如何将电脑截图发送给手机邮箱,这样就达到了监控的效果。

    关于如何发送邮件可以参考博客:如何用Python发送邮件?。这里就不再详细说了。下面我们看看如何读取邮件。

    三、读取邮件

    读取邮件需要使用到imbox模块,安装语句如下:

    pip install imbox
    

    读取邮件的代码如下:

    from imbox import Imbox
    
    def read_mail(username, password):
        with Imbox('imap.163.com', username, password, ssl=True) as box:
            all_msg = box.messages(unread=True)
            for uid, message in all_msg:
                # 如果是手机端发来的远程控制邮件
                if message.subject == 'Remote Control':
                    # 标记为已读
                    box.mark_seen(uid)
                    return message.body['plain'][0]
    
    

    首先我们用with语句,打开邮箱。然后通过下面语句获取所有的未读邮件:

    all_msg = box.messages(unread=True)
    

    获取未读邮件后,对邮件进行遍历。将主题为“Reomte Control”的邮件标记为已读,并返回文本内容。

    这里需要注意,因为我们筛选出了主题为“Remote Control”的邮件,因此我们在用手机发邮件的时候需要将主题设置为“Remote Control”,这样可以避免其它邮件的干扰。

    四、截图

    截图需要使用到PIL模块,安装如下:

    pip install pillow
    

    截图的代码很简单:

    from PIL import ImageGrab
    
    def grab(sender, to):
        # 截取电脑全屏
        surface = ImageGrab.grab()
        # 将截屏保存为surface.jpg
        surface.save('surface.jpg')
        # 将截屏发送给手机
        send_mail(sender, to, ['surface.jpg'])
    

    其中send_mail的代码如下:

    import yagmail
    
    def send_mail(sender, to, contents):
        smtp = yagmail.SMTP(user=sender, host='smtp.163.com')
        smtp.send(to, subject='Remote Control', contents=contents)
    

    关于发送邮件的介绍可以参考上面提到的博客。

    五、关机

    关机的操作非常简单,我们可以用python来执行命令行语句即可。代码如下:

    import os
    
    def shutdown():
     # 关机
        os.system('shutdown -s -t 0')
    

    除了关机,我们还可以执行很多操作。对于一些复杂的操作,我们可以预编写一些bat文件,这里就不演示了。

    六、完整代码

    上面我们编写了各个部分的代码,然后再来看看主体部分的代码:

    def main():
     # 电脑用来发送邮件已经电脑读取的邮箱
        username = 'sockwz@163.com'
        password = '********'
     
     # 手机端的邮箱
        receiver = '2930777518@qq.com'
     
     # 读取邮件的时间间隔
        time_space = 5
     
     # 注册账户
        yagmail.register(username, password)
        
        # 循环读取
        while True:
            # 读取未读邮件
            msg = read_mail(username, password)
            if msg:
             # 根据不同的内容执行不同操作
                if msg == 'shutdown':
                    shutdown()
                elif msg == 'grab':
                    grab(username, receiver)
            time.sleep(time_space)
    

    其中:

    yagmail.register(username, password)
    

    会使用到keyring模块,安装如下:

    pip install keyring
    

    后面我们可以根据自己的需求编写一些其它功能。下面是完整的代码:

    import os
    import time
    import yagmail
    from imbox import Imbox
    from PIL import ImageGrab
    
    
    def send_mail(sender, to, contents):
        smtp = yagmail.SMTP(user=sender, host='smtp.163.com')
        smtp.send(to, subject='Remote Control', contents=contents)
    
    
    def read_mail(username, password):
        with Imbox('imap.163.com', username, password, ssl=True) as box:
            all_msg = box.messages(unread=True)
            for uid, message in all_msg:
                # 如果是手机端发来的远程控制邮件
                if message.subject == 'Remote Control':
                    # 标记为已读
                    box.mark_seen(uid)
                    return message.body['plain'][0]
    
    
    def shutdown():
        os.system('shutdown -s -t 0')
    
    
    def grab(sender, to):
        surface = ImageGrab.grab()
        surface.save('surface.jpg')
        send_mail(sender, to, ['surface.jpg'])
    
    
    def main():
        username = 'sockwz@163.com'
        password = '你的授权码'
        receiver = '2930777518@qq.com'
        time_space = 5
        yagmail.register(username, password)
        while True:
            # 读取未读邮件
            msg = read_mail(username, password)
            if msg:
                if msg == 'shutdown':
                    shutdown()
                elif msg == 'grab':
                    grab(username, receiver)
            time.sleep(time_space)
    
    
    if __name__ == '__main__':
        main()
    
    

     

     

    感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    ① 2000多本Python电子书(主流和经典的书籍应该都有了)

    ② Python标准库资料(最全中文版)

    ③ 项目源码(四五十个有趣且经典的练手项目及源码)

    ④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)


     ⑤ Python学习路线图(告别不入流的学习)

    在我的QQ技术交流群里(技术交流和资源共享,广告进来腿给你打断)

    可以自助拿走,群号913569736(备注“csdn000”)群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。
     
     

    展开全文
  • 使用Python控制手机(一)

    万次阅读 多人点赞 2021-11-10 10:07:12
    1. 配置Python环境变量 Python环境变量安装较为简单,比较常用的方式是直接百度Anaconda并且下载安装,安装过程中可直接选择自动配置环境变量,在此不再赘述。...安装完后,想要控制手机,还需要安装...
  • 如何用 Python 实现手机远程控制电脑

    千次阅读 2021-05-08 00:38:35
    来源:https://zacksock.blog.csdn.net一、前言很多时候,我们都有远程控制电脑的需求。比如正在下载某样东西,需要让电脑在下载完后关机。或者你需要监控一个程序的运行...
  • python设置socket代理 首先,你得下载SocksiPy这个.解压出来之后里面会有一个socks.py文件.然后你可以把这个文件复制到python安装目录里面的Lib\site-packages中.或者把这个文件复制到程序所在的目录中. 然后就可以...
  • 目前的数据工作中,数据科学家使用最多的工具语言就是Python,排在第二的工具语言是R语言。但这里有一个有趣的现象,那就是同时使用Python或者R语言的人,推荐别人使用Python的却远高于R语言。Why? 答案是: 1. ...
  • 主要介绍了python编写微信远程控制电脑的程序,使用python编写的基于邮件收发的远程控制电脑的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 本文涉及到的所有源代码、插件以及其他资源,请关注微信公众号「极客起源」,并输入310231下载。这个案例是将Python、PyQT5与Arduino结合。通过Arduino开发板控制3个L...
  • # -*- coding: utf-8 -*-import osimport timedef doshell(cmd,str):print(" ",str,cmd)output = os.popen(cmd)a=output.read()print(a)output.close()def sendmsg():n = 9index = 0text='adb shell input text 'te....
  • show_camera.clear() 9 self.button_open_camera.setText( u'远程桌面') (8)显示桌面函数和退出程序函数 1 def show_camera(self): 2 im = ImageGrab.grab() 3 imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2...
  • 主要步骤:1、USB连接手机手机打开USB调试模式,小米手机可能还要打开允许通过USB调试修改权限或者模拟点击2、下载ADB,在adb文件目录下运行cmd,调用相应的adb指令即可对手机模拟操作3、在python或其他语言java中...
  • 用十几行代码搞一个超级简单的远程控制程序, 好吧~其实顶了天只能算一个脚本。 既然是远程控制,那么它就需要确定两个功能: 1、远程 即通过网络访问外部主机(包括内网) 我们可以利用Python中封装好的 socket库 ...
  • 第一个步骤,申请一个邮箱,使这个邮箱与你的手机号码绑定,然后你在这个邮箱中设定如果有新的邮件就发短信通知.这样开机时往这个邮箱发个mail,我手机就会收到短信通知了.第二个步骤就是通过python 脚本,定时去检查163....
  • 当然,我相信,用Python发短信应用场景不止此一处,下面我们开始Python发短信的实现。首先,看下成果展示:然后,看下代码实现:是不是非常简单!现在开始具体讲解,如何实现Python发短信功能。操作步骤1、安装模...
  • 最近经常需要简单地远程控制一下电脑,比如远程查看一下电脑上模型训练的情况,模型训练完之后远程关闭电脑等等,于是就想着利用python来简单地实现一下这些功能,直接利用邮件远程控制自己电脑。 让我们愉快地开始...
  • 电脑使用python操控安卓手机

    千次阅读 2021-05-20 10:26:21
    一、电脑下载并安装SDK ...手机连接电脑USB后执行adb devices 查看手机连接状态 查询已连接设备/模拟器:adb devices 此处连接手机,需要手机在开发者模式开启USB调试功能。顺便也开启模拟按键功能,后面会用到。
  • 1、android手机上安装一款APP:IP摄像头,app的图片如上图2、conda安装或者pip安装opencv33、python脚本,实现远程监视4、可以在脚本基础上根据需要增加识别算法注:我在用的时候,需要将你的手机开热点给电脑#...
  • 使用 Python 远程控制自己的电脑

    千次阅读 2019-09-06 10:35:53
    朋友们,我是床长!... 今天在外面 Coding,后面惊现美女,...作为程序员,想到的是使用 Python 远程控制自己的电脑 配图与本文无关 1. 技术原理,主要是使用 itchat。代码如下,不多很简洁 #coding=utf...
  • 最新公司上线的app,开发童鞋从后台看到android版本会有...于是就在网上找到了控制wifi开关的shell语句,利用python编写了一个简单的控制wifi开关的脚本(因为是菜鸟,所以只能保证脚本能正常运行),下面就是代码啦,...
  • Python实用工具,email模块,Python实现邮件远程控制自己电脑
  • 很多时候,我们都有远程控制电脑的需求。比如正在下载某样东西,需要让电脑在下载完后关机。或者你需要监控一个程序的运行状况等。 今天我们就来用Python实现一个远程监控并控制电脑的小程序。 二、实现原理 听...
  • 上次写了一个Android自动化脚本,使用了appium和python-appium,刚开始使用时感觉很厉害,手机连上数据线之后,编写一系列代码就可以使Android自动操作,但是需要安装appium客户端(当时400多M),还需要手机用数据线...
  • 这样就可以获取各个组件的位置了 注:如果PC要想同时控制多台Android手机,必须在adb 后面添加-s 例如:adb -s 13b6e4c4 shell input tap 400 400 表示对13b6e4c4这台Android手机进行在屏幕上(400,400)坐标位置...
  • 简单地来说,scrcpy就是通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备。它可以通过USB连接,也可以通过Wifi连接(类似于隔空投屏),而且不需要任何root权限,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,018
精华内容 4,007
关键字:

python远程控制手机