起因
最近据说按键精灵打包apk要免费了。。。
原本偶然能用一次的,当初看来是能够放弃了,当前改用autojs吧。
不过因而想起了一个需要:Python自定义相干参数(输出文本)管制手机。
想起这个需要次要是想利用在挪动端爬虫上,对那些反爬虫机制特地严格的利用,能够从这个角度来实现爬取数据。
比方须要采集某个公众号的文章,就能够通过Python的mitmproxy库来监听,应用UIautomator2库来管制手机去搜寻指标公众号(Python里输出名字传给手机)并获取所有的文章,在mitmproxy里就能够进行相干数据的提取。
Python管制手机的几种计划
- adb(须要USB连贯手机且关上USB调试)
- UIautomator2(速度绝对较快,应用快捷不便,可用USB/WiFi)
- appium(风行、跨平台,封装UIautomator2)
抉择计划
据不肯定可靠消息,adb稳定性很差,appium速度不够快,所以从上手难度、运行速度和稳定性的角度看,我这里选了UIautomator2。
UIautomator2的装置
-
装置库
# 装置 uiautomator2(PC端) pip3 install -U uiautomator2 # 连贯USB,装置蕴含httprpc服务的apk到手机(手机端) python -m uiautomator2 init
留神:装置失败的先看看是不是网络问题,我用清华的源装置失常。第二步装置可能呈现各种问题,能够参考github:https://github.com/openatx/uiautomator2
- 运行示例
间接新建Python文件,内容为:
import uiautomator2 as u2 d = u2.connect() # 连贯设施 print(d.info)
-
装置辅助编辑器weditor
# 装置 pip install --upgrade weditor # 装置挪动端(下面装置过了这里就能够跳过) python -m uiautomator2 init # 启动 python -m weditor
脚本实例
-
管制微信读书刷浏览时长
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))
-
管制抖音/快手极速版等短视频软件自动播放下一个(继续下滑)刷金币
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))