原文地址
http://118.25.172.253/2019/01/05/使用cdp4j进行淘宝自动化登陆/#more
先给出成品图
cdp4j简单描述
cdp4j is a web-automation library for Java. It can be used for automating the use of web pages and for testing web pages. It use Google Chrome DevTools Protocol to automate Chrome/Chromium based browsers.
简单来说cdp4j就是一款在java端通过代码直接驱动谷歌浏览器的工具,我们可以用它来实现一些自动化测试或爬虫。
这里我们用它来实现淘宝的自动化登陆。
先说明一下,cdp4j操控浏览器,浏览器是无法检测出是不是自动化工具的。 而selenium操控浏览器,是会被识别出来的。
所以我们如果用selenium操作浏览器进行淘宝登陆,是无法登陆的。除非使用代理软件修改淘宝js文件,当然这是后话。
不清楚cdp4j为啥不会被检测出来,但是cdp4j功能还是比较少的,远小于selenium。
所以cdp4j模拟登陆的失败率较高,往往程序需要执行多次才可登陆成功,如上图:
但即使这样,这也是可以接受的。
淘宝登陆过程分析
整个淘宝登陆过程差不多分为下面5个阶段。
- 操作浏览器打开淘宝登陆地址
- 获取用户名输入框,输入用户名
- 获取密码输入框,输入密码
- 滑动滑块
- 点击登陆按钮
接下来,我们对于这五个阶段来进行编码。
开发前提
使用cdp4j需要电脑安装了谷歌浏览器,然后在项目中添加cdp4j的依赖即可使用。
<dependency>
<groupId>io.webfolder</groupId>
<artifactId>cdp4j</artifactId>
<version>3.0.0</version>
</dependency>
复制代码
打开淘宝登陆地址
Launcher launcher = new Launcher();
SessionFactory factory = launcher.launch();
Session session = factory.create();
String url = "https://login.taobao.com/member/login.jhtml?style=mini_top";
session.navigate(url).waitDocumentReady();
复制代码
输入用户名
session.click("#TPL_username_1").sendKeys(username);
复制代码
输入密码
session.click("#TPL_password_1").sendKeys(password);
复制代码
滑动滑块
注意:cdp4j不支持操控鼠标进行滑动。所以我们这里使用java的robot类来操作鼠标进行滑动。
Robot robot = new Robot();
//设置操作延时 避免操作太快
robot.setAutoDelay(800);
//鼠标移动到某个点
robot.mouseMove(900, 266);
//使用左键按压住
robot.mousePress(InputEvent.BUTTON1_MASK);
//移动到某个点
robot.mouseMove(1060, 266);
//释放按压
robot.mouseRelease(InputEvent.BUTTON1_MASK);
复制代码
代码很通俗易懂,难点在于那两个点的坐标。这坐标是你电脑屏幕里某个点的x,y坐标。
怎么找到?
可以通过软件获取。但是软件获取的也不太精确,所以还需要自己判断。。
点击登陆按钮
session.click("#J_SubmitStatic");
复制代码
总结
基本上通过上述流程就可以实现淘宝的登陆。
这里简单描述一下这种方法实现登陆的优缺点:
优点:
- 淘宝无法识别是自动化脚本
缺点:
- 失败率较高,同样的代码换一台电脑可以就运行失败了。因为滑块验证那部分 屏幕坐标不同的电脑是不一样的。
- 无法获取页面cookie。淘宝的很多接口都需要登陆,然后用登陆生成的cookie去调用接口。