总算把模拟登陆看的有点眉目了,大概写一下总结吧!
之前那个博客写的有点错误,想想,还是不删了,以后看到就当是个弯路的教训
先说说模拟登陆的原理吧
- 模拟登陆就是用网络框架模拟浏览器访问网站的步骤
- 进一步得到想要的数据
- 首先说一下服务器与客户端
- 服务器端有一个类似于键值对的东西
- 一块存储空间,一个cookie值,两者一一对应
- 当我们首次访问的时候,服务器就给我们创建键值对,并把cookie给客户端
- 客户端拿着这个cookie去访问服务器的东西,访问记录就会留在与cookie对应的那个地方
- 当客户端下次拿着这个cookie去访问服务器的时候,服务器就会查询到我们以往的访问记录
- 所以就会有选择的去给我们推送符合我们喜好的内容
- 咱们平时见到的在本浏览器保存密码,下次还可以再登陆这个机制,就是服务器将账号和密码保存在了那个位置,可以通过cookie一一对应的那个记录区就可以去查询到账号和密码,直接登录
- 再来说一下网络访问,一般的网络访问都是客户端带着数据去请求服务器,上图解释一下吧
- 我用的是火狐浏览器,打开“查看元素”或者按f12,点击网络,点击html,在右边分别查看消息头和cookie以及参数
- 看的出来,当我们去访问一个网站时,就会有一个网络请求,这个网络请求包括了请求头,cookie和参数表
- cookie是在请求头中包含的,下面我用代码把这个过程写一下(我用的是Okhttp)
OkHttpClient client = new OkHttpClient()
FormBody requestBody = new FormBody.Builder()
.add("__VIEWSTATE",__VIEWSTATE)
.add("RadioButtonList1","%D1%A7%C9%FA")
.build();
Request request = new Request.Builder()
.url("此处的url写刚才消息头上面有一个请求网址")
.header("Accept", Accept)
.header("Host",Host)
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()) {
Headers headers = response.headers();
Document document = Jsoup.parse(response.body().string());
}
}
});
- 基本的模拟登陆流程就是上面代码所示
- 我要做的是模拟登陆我们学校的教务系统,获取成绩等信息
- 因为这个登陆是需要账号和密码,以及验证码的,现在来说说我的流程
- 在刚开始访问的时候我们并没有cookies这个东西
- 所以第一次访问可以先不带cookie这个时候在访问成功的时候在响应头里面就会有一个“Set—Cookie”的东西,这个就是服务器针对我们第一次访问给我们分配的cookie
- 注意:在获取cookie的同时你要观察那个请求头或者参数表里面某些东西也是需要从网页源代码获取的,这个需要从html解析的文件里面获取
- 拿到cookie等数据之后,我们就可以用cookie和账号,密码呀去访问网站了,以便于得到我们想要的东西
总结一下吧
- 先用我上面写的代码不加cookie访问一次,从响应头中获取cookie以及从html解析之后的文件中获取想要的东西参数
- 拿着这些个参数和你的账号密码等数据去获取数据就可以啦
- 如果涉及到有验证码的网站
- 那么可以第一次直接去不带cookie去访问获取验证码的网站,他也会返回一个cookie的
- 将此验证码返回出来的换成字符数组,然后用bitMapFactor的工厂把字符数组转换成图片显示,人为输入验证码,用验证码和账号密码以及刚才的cookie去访问登陆网站也可以