Python+UIautomator2控制手机实现自定义脚本

Posted 二毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python+UIautomator2控制手机实现自定义脚本相关的知识,希望对你有一定的参考价值。

起因

最近听说按键精灵打包apk要收费了。。。
本来偶尔能用一次的,现在看来是可以放弃了,以后改用autojs吧。

不过因此想起了一个需求:Python自定义相关参数(输入文本)控制手机。

想起这个需求主要是想应用在移动端爬虫上,对那些反爬虫机制特别严格的应用,可以从这个角度来实现爬取数据。

比如需要采集某个公众号的文章,就可以通过Python的mitmproxy库来监听,使用UIautomator2库来控制手机去搜索目标公众号(Python里输入名字传给手机)并获取所有的文章,在mitmproxy里就可以进行相关数据的提取。

Python控制手机的几种方案

  1. adb(需要USB连接手机且打开USB调试)
  2. UIautomator2(速度相对较快,使用快捷方便,可用USB/WiFi)
  3. appium(流行、跨平台,封装UIautomator2)

选择方案

据不一定可靠消息,adb稳定性很差,appium速度不够快,所以从上手难度、运行速度和稳定性的角度看,我这里选了UIautomator2。

UIautomator2的安装

  1. 安装库

    # 安装 uiautomator2(PC端)
    pip3 install -U uiautomator2
    # 连接USB,安装包含httprpc服务的apk到手机(手机端)
    python -m uiautomator2 init

    注意:安装失败的先看看是不是网络问题,我用清华的源安装正常。第二步安装可能出现各种问题,可以参考github:https://github.com/openatx/uiautomator2

  2. 运行示例

直接新建Python文件,内容为:

import uiautomator2 as u2

d = u2.connect() # 连接设备
print(d.info)
  1. 安装辅助编辑器weditor

    # 安装
    pip install --upgrade weditor
    # 安装移动端(上面安装过了这里就可以跳过)
    python -m uiautomator2 init
    # 启动
    python -m weditor

    脚本实例

  2. 控制微信读书刷阅读时长

    import uiautomator2 as u2
    import time
    
    d = u2.connect(\'emulator-5554\')  # connect to device
    # d = u2.connect(\'192.168.1.7\')
    
    # height = d.info[\'displayHeight\']
    # width = d.info[\'displayWidth\']
    
    print(d.info)
    d.app_start(\'com.tencent.weread\')
    d.toast.show(\'启动微信读书\')
    print(\'启动微信读书\')
    
    d(resourceId="com.tencent.weread:id/rx").click()
    d.toast.show(\'点击书架\')
    print(\'点击书架\')
    
    # 手机
    # xpath = \'//*[@resource-id="com.tencent.weread:id/b51"]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]\'
    # 模拟器
    xpath = \'//*[@resource-id="com.tencent.weread:id/ni"]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]\'
    d.xpath(xpath).click()
    
    d.toast.show(\'点击第1本书\')
    print(\'点击第1本书\')
    
    print(\'正在阅读...\')
    start = time.perf_counter()
    page = 0
    
    while True:
     page += 1
     d.click(0.985, 0.537)
     d.toast.show(\'已看 {} 页\'.format(page))
     time.sleep(10)  # 一页10秒
     readtime = time.perf_counter() - start
     if readtime > 5 * 3600:
         break
    
    print(\'共看了 {} 页,用时 {}\'.format(page, readtime / 3600))
  3. 控制抖音/快手极速版等短视频软件自动播放下一个(持续下滑)刷金币

    import uiautomator2 as u2
    import time
    import random
    
    d = u2.connect(\'emulator-5554\')  # connect to device
    # d = u2.connect(\'192.168.1.7\')
    
    # height = d.info[\'displayHeight\']
    # width = d.info[\'displayWidth\']
    
    print(d.info)
    d.app_start(\'com.kuaishou.nebula\', "com.yxcorp.gifshow.HomeActivity")
    d.toast.show(\'启动快手极速版\')
    print(\'启动快手极速版\')
    
    # 模拟器
    d.xpath(
     \'//*[@resource-id="com.kuaishou.nebula:id/recycler_view"]/android.widget.RelativeLayout[2]/android.widget.ImageView[1]\'
    ).click()
    d.toast.show(\'点击第2视频\')
    print(\'点击第2视频\')
    
    print(\'正在看视频...\')
    start = time.perf_counter()
    page = 0
    
    while True:
     page += 1
     d.swipe(0.5, 0.8, 0.6, 0.3, 0.2)
     d.toast.show(\'已看 {} 个\'.format(page))
     time.sleep(10 + random.randint(5, 12))  # 一个10+n秒
     readtime = time.perf_counter() - start
     if readtime > 5 * 3600:
         break
    
    print(\'共看了 {} 个,用时 {}\'.format(page, readtime / 3600))
    

以上是关于Python+UIautomator2控制手机实现自定义脚本的主要内容,如果未能解决你的问题,请参考以下文章

python3 uiautomator2 (二) 、操作app

手机APP自动化之uiautomator2 +python3 UI自动化

安卓游戏自动化控制实验!超详细!小白也能一学就会!(Python + uiautomator2 + Open CV)

安卓游戏自动化控制实验!超详细!小白也能一学就会!(Python + uiautomator2 + Open CV)

安卓游戏自动化控制实验!超详细!小白也能一学就会!(Python + uiautomator2 + Open CV)

安卓游戏自动化控制实验!超详细!小白也能一学就会!(Python + uiautomator2 + Open CV)