1. 序言

每年淘宝双十一的时候,总是要刷各种各样的浏览页面,收集能量或者喵币或者什么。

那既然如此,我就总想着,能否通过Python自动调用的方式来刷网页。

2. 前置工作

本文是基于使用Python控制手机(一),默认已经安装了ADB并配置了环境变量,安装了Python环境,且在Python中安装了uiautomator2和weditor等包。

3. 打开APP

当我们使用uiautomator2包来打开某个APP时,可以通过点击屏幕特殊位置的方式来实现。但是其中存在的问题便是,可能由于我们APP图标的移动,而使得程序无法运行。健壮性和通用性不高。

其实在uiautomator2这个包中,提供了一种可以通过APP包名就可以打开特定APP的方式,例如打开和关闭淘宝。

import uiautomator2 as u2
import timed = u2.connect()  # 连接设备
d.app_start("com.taobao.taobao")  # 打开淘宝
time.sleep(10)  # 等待10秒钟
d.app_stop("com.taobao.taobao")  # 关闭淘宝

再比如打开和关闭微信:

import uiautomator2 as u2
import timed = u2.connect()  # 连接设备
d.app_start("com.tencent.mm")  # 打开微信
time.sleep(10)  # 等待10秒钟
d.app_stop("com.tencent.mm")  # 关闭微信

4. 获取APP的包名

有的时候,我们是不太清楚一个APP的包名的,这时我们可以通过打印设备当前信息的方式来获取APP的包名。首先我们需要将要获取的APP打开,并且保持在手机最前台,执行代码:

import uiautomator2 as u2
import timed = u2.connect()  # 连接设备
print(d.info)  # 打印设备信息

输出结果如下:

{'currentPackageName': 'com.taobao.taobao', 'displayHeight': 2111, 'displayRotation': 0, 'displaySizeDpX': 393, 'displaySizeDpY': 851, 'displayWidth': 1080, 'productName': 'cannon', 'screenOn': True, 'sdkInt': 29, 'naturalOrientation': True}Process finished with exit code 0

在所打印的Json键值对中,键currentPackageName对应的值,即为此时正在最前台的APP的包名,上述结果操作时,正在最前的APP为淘宝。

5. 打开特定页面

一般来说,如果页面切换按钮含有特定文字,我们直接通过文字进行定位是最方便的,也是最准确的,比如打开微信朋友圈:

import uiautomator2 as u2
import timed = u2.connect()  # 连接设备d.app_start("com.tencent.mm")  # 打开微信
time.sleep(2)  # 等待2秒钟
d(text='发现').click()  # 点击文字为“发现”的控件
time.sleep(2)  # 等待2秒钟
d(text='朋友圈').click()  # 点击文字为“朋友圈”的控件

因为可能存在的,APP的加载时间和对点击操作的响应时间,尽量在每次点击操作之后,为APP和手机留有足够的反应时间。值得注意的是,如果打开微信之后,恰好有个常用联系人的昵称叫做“发现”,那就可能会被误点,这种情况下我们需要使用别的定位方式来定位特定控件。

需要点击的文字如果是固定的,就可以使用d(text="XXX")来选择控件元素,其中XXX为特定的文字。如果部分文字是固定的,比如第一次元素显示文字为“我是第11932位访客”,第二次显示文字为“我是第12111位访客”,那我们可以通过d(textContains="我是第").click()来点击这个控件,或者通过d(textContains="位访客").click()来点击这个控件,这种方式就可以通过子字符串来定位特定的元素控件。

还是使用进入朋友圈举例:

import uiautomator2 as u2
import timed = u2.connect()  # 连接设备d.app_start("com.tencent.mm")  # 打开微信
time.sleep(2)  # 等待2秒钟# 点击“发现”,三选一
d(text='发现').click()  # 点击文字为“发现”控件
d(textContains='发').click()  # 点击带“发”的控件
# 通过WEditor获得的xpath定位
d.xpath('//*[@resource-id="com.tencent.mm:id/e8y"]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[3]/android.widget.LinearLayout[1]').click()  time.sleep(2)  # 等待2秒钟# 点击“朋友圈”,三选一
d(text='朋友圈').click()  # 点击文字为“朋友圈”控件
d(textContains='朋').click()  # 点击带“朋”的控件
# 通过WEditor获得的xpath定位
d.xpath('//*[@resource-id="android:id/list"]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]').click()

其实还有很多各不相同的定位方式,只要能定位到唯一的特定的控件进行点击即可。例如在双十一时,我在淘宝中切换到收集喵币页面的点击事件:

import uiautomator2 as u2
import timed = u2.connect()  # 连接设备
d.app_start("com.taobao.taobao")  # 打开淘宝
time.sleep(5)  # 等待5秒钟
d.xpath('//*[@content-desc="双11超级喵糖"]').click()  # 打开喵糖页面

6. 其它细节

在双十一淘宝活动中,打开喵糖页面,会先弹出提示是否将此页面加入收藏的弹框,点击文字为“我再想想”的按钮。注意要判断此控件是否存在,点击不存在的控件将会报错。如果不确定一个控件是否存在,又不想判断的情况下,则需要使用 try......catch...... 来将其包裹。

if len(d(textContains='我再想想')) > 0:  # 如果存在此控件d(textContains='我再想想').click()  # 点击“我再想想”

点击“赚糖”控件,因为这个控件经常会被屏幕上出现的手指动画所挡住,因此需要等待:

while len(d(textContains='赚糖')) <= 0:time.sleep(1)
d(textContains='赚糖').click()

然后点击完后等会儿,再点击“去浏览”按钮:

while len(d(textContains='去浏览')) > 0:print("检测到浏览按钮...")d(textContains='去浏览').click()

等待15秒(算上反应时间,需要多等一会儿)返回即可:

d.press("back")  # 相当于手机返回键

7. 结语

其实具体的部分实现起来比较简单,在此总结一下uiautomator2 的其它一些功能。

关于按键:

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")        # 电源键

关于锁屏与解锁:

# 一个设备信息字典中的布尔值,为true时代表当前屏幕亮起,为false代表当前屏幕熄灭
d.info.get('screenOn')# 仅点亮屏幕
d.screen_on()# 点亮屏幕并解锁,注意如果有密码,则只能进入密码输入页面,需要输入密码才能解锁
d.unlock()  # 关闭屏幕
d.screen_off()

关于点击等操作(支持百分比):

# 单击屏幕
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.5秒(默认)#拖动
d.drag(sx, sy, ex, ey)
d.drag(sx, sy, ex, ey, 0.5)  # 拖动0.5秒(默认)# 滑动点 多用于九宫格解锁,提前获取到每个点的相对坐标(这里支持百分比)
# 从点(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) 表示长按屏幕中心

当然还有其它的一些功能,例如向上滑动屏幕,直到指定文字出现为止:

d(scrollable=True).scroll.to(text="3年级2班")

等等。基本上都可以比较容易的百度到,在此仅简单列举一二。

使用Python控制手机(二)关于淘宝的那些事相关推荐

  1. python爬取并分析淘宝商品信息

    python爬取并分析淘宝商品信息 背景介绍 一.模拟登陆 二.爬取商品信息 1. 定义相关参数 2. 分析并定义正则 3. 数据爬取 三.简单数据分析 1.导入库 2.中文显示 3.读取数据 4.分 ...

  2. python大数据可视化分析淘宝商品,开专卖店不行啊

    python大数据可视化分析淘宝商品,开专卖店不行啊 现如今大数据分析异常火爆,如何正确分析数据,并且抓住数据特点,获得不为人知的秘密?今天沉默带你用python爬虫,爬取淘宝网站进行淘宝商品大数据分 ...

  3. python+scrapy简单爬取淘宝商品信息

    python结合scrapy爬取淘宝商品信息 一.功能说明: 已实现功能: 通过scrapy接入selenium获取淘宝关键字搜索内容下的商品信息. 待扩展功能: 爬取商品中的全部其他商品信息. 二. ...

  4. Python爬虫之定时抢购淘宝商品

    Python爬虫之定时抢购淘宝商品 import time from selenium import webdriver import datetimeclass Spider:def __init_ ...

  5. python + selenium多进程爬取淘宝搜索页数据

    python + selenium多进程爬取淘宝搜索页数据 1. 功能描述 按照给定的关键词,在淘宝搜索对应的产品,然后爬取搜索结果中产品的信息,包括:标题,价格,销量,产地等信息,存入mongodb ...

  6. python不登陆爬取淘宝数据_python登录并爬取淘宝信息代码示例

    本文主要分享关于python登录并爬取淘宝信息的相关代码,还是挺不错的,大家可以了解下. #!/usr/bin/env python # -*- coding:utf-8 -*- from selen ...

  7. 用python控制手机电脑拍照并自动发送邮箱

    文章目录 本文思路 视频讲解 代码部分 兄弟们,这个是正经的教程,不要拿来乱用,可以自己用自己的电脑或者手机试,但是别搞别人,懂的都懂! 本文思路 通过opencv调用摄像头拍照保存图像本地 用ema ...

  8. Python控制手机,五排上分

    当你想抢王者聊天频道的皮肤碎片红包,或者想和小姐姐(小哥哥)开游戏的时候.可以使用python自动化工具,进行自动化加入开黑房间(一般小姐姐开黑会开语音,然后就会有大佬带,然后就容易上分,哈哈哈).然 ...

  9. python控制手机模拟器_Appium+python自动化之连接模拟器并启动淘宝APP(超详解)...

    简介 上一篇讲解完模拟器的安装.配置好以后,就好比我们手机已经买好,并且系统已经做好了,就差我们用数据线和电脑连接开始实战了,这篇宏哥就带着小伙伴们和童鞋们趁热打铁,讲解和分享一下如何连接模拟器(电脑 ...

最新文章

  1. DataLoader 与 Dataset
  2. 蓝牙驱动卸载后自动安装_智能产品 | 安装水循环系统后,全自动洗车机洗车会更节水吗?...
  3. OpenCV2学习笔记(十四):基于OpenCV卡通图片处理
  4. 舞伴配对问题java_舞伴配对问题
  5. css 查看更多_在Scrapy中如何利用CSS选择器从网页中采集目标数据——详细教程(上篇)...
  6. LNMP环境--搭建Discuz论坛
  7. 太好了 | 这篇写的太好了!Spring Boot + Redis 实现接口幂等性
  8. Linux服务器的四种入侵级别
  9. Java中super()的用法。主类和子类的继承关系。(2)
  10. Visio自定义连接线,连接点位置
  11. 【LaTeX】Research Proposal的模板、一些技巧(包含:横线的制作,标题和摘要的排版)
  12. Intel Barefoot Academy - P4实战特训营
  13. 基于android的有声听书系统
  14. 【ZYNQ】 cache解决问题
  15. 基于自适应算法和增量式PID算法的模拟直升飞机控制系统
  16. mapbox初步使用
  17. 【记vue项目中的踩坑日记】一杯茶一包烟,一个bug搞一天
  18. 如何兼容IE4:Web浏览器兼容性浅谈
  19. msn注册结尾为msn的邮箱
  20. 应用MATLAB求解线性代数题目(一)——行列式

热门文章

  1. RealView MDK开发工具
  2. 从C端市场延伸至B端业务拓展,流利说深耕行业英语价值几何?
  3. PDF转Word怎么转?教你三招快速实现PDF转Word
  4. 在Ext JS本地化
  5. Rabbitmq Ambiguous payload parameter for public xxx
  6. 关于我装黑苹果的那些事儿
  7. 安装宝塔远程工具流程
  8. com.alibaba.fastjson.JSONException: create instanc
  9. 混沌工程落地的六个阶段
  10. SSM 博客系统开发实战