Android WebView填表登陆QQ空间

安卓WebView可以通过JS对网页文档对象进行操作,实现自动填写账号和密码,这样下次就可以免手动输入了,比较方便。这儿使用QQ空间网页版进行模拟登陆


准备工作

基于Android Studio3.0版本

首先需要为软件声明联网权限

因为WebView需要连接网络,所以这个是必须的。

代码开始

创建界面,这儿为了演示,所以把软件分成两个部分,一个是填表输入文本,然后再模拟点击按钮。

首先创建界面,下面贴出代码

在Java代码中绑定他们

绑定好以后,我们来分析一下这个软件。

首先是WebView浏览器,加载一个网页需要加载JS,而默认是不会加载的,所以我们要给他手动开启。

这句代码就是开启浏览器对JS的支持了,再来需要跳转到我们登陆的地址

mWeb . loadUrl ( "https://ui.ptlogin2.qq.com/cgi-bin/login?pt_hide_ad=1&style=9&pt_ttype=
1&appid=549000929&pt_no_auth=1&pt_wxtest=1&daid=5&s_url=https%3A%2F%2Fh5.qzone.qq.com%2Fmqzone%2Findex" ) ;

这个地址就是QQ空间手机页面登陆的地址了。

分析JS

要模拟操作网页的对象,首先要了解JS代码。

一个网页他就是一个docment对象,我们可以根据网页上元素的ID确定唯一的一个对象,因为ID是不重复的嘛,那么使用的代码就是

其中,getElementById意为去网页对象中查找ID为p的那一个元素。那么现在就很明了了,打开谷歌浏览器,审查一下元素。


可以看到,元素代码的ID为,u,如果你对网页元素对象不太理解的话,请稍微看看JS部分即可。同理,找到下面密码框的ID为p,登陆按钮是一个DIV,ID为go。

那么现在我们就可以给安卓的WebView注入JS代码了。

WebView最简单的加载JS方法是loadUrl方法,他不仅仅可以跳转网址,只要内容开头为javascript即可注入JS代码

原生的JS代码进行填表是这样写的

在Android 8.0上面直接执行这个JS代码会直接网页白屏,不知道是怎么回事,所以需要先注入,后加载的方式调用,方法如下

首先我声明了一个StructureJs函数,传入账号和密码,里面声明了一个StringBuffer ,你可以直接使用String拼接,JS代码是一个名为inputninandpw的函数,名字你可以自己起。接着,如果点击了填表按钮,就执行loadjs函数,这个函数中,把拼接好的JS代码先注入网页,再调用他,这样就可以成功的调用这个函数进行填表了,传入的账号和密码就是账号和密码文本框里面的内容了。

填表成功后,就可以模拟点击登陆按钮了

登陆按钮点击代码事件如下

非常简单对吧,点击后就会进行登陆了。

完善代码

如果隐藏了WebView,或者是让软件判断是否登陆成功怎么搞呢?总不能用户登陆成功以后,然后点击一个按钮告诉程序我已经登陆成功了吧,显然是不行的。那么,我们需要为浏览器写一个事件

本登陆页面如果登陆成功了,会跳到https://h5.qzone.qq.com/mqzone/index页面,如果没有登陆成功,是不会跳到这个页面的,所以我们可以在浏览器跳转完毕后进行判断。

为浏览器添加setWebChromeClient事件,本事件是浏览器的一个进度接口,那么只要进度到了100,那就说明网页已经加载完成了,接着我们获取网页的地址判断一下就可以知道用户是否登陆成功了。

很多网页用户登陆了以后,把cookies拿下来就可以做很多事了,那么在这个登陆成功判断后面再添加如下代码,就可以获取到cookies了

getCookie传入需要获取cookie的url,这儿传入用户登陆成功的地址即可。