起因最近听说按键精灵打包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))
|