刷推送时看到一篇讲retrofit的,想试试其中的post,post什么呢,首先想到的是正方,于是,,就试试吧。(本人小白,之前没有怎么使用过这些框架,若有错误,请大神们指教(/▽╲))

一、抓包
我使用的抓包工具是fiddler 下载地址
然后登录正方并抓取数据

验证码

这个Cookie 很重要,Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。刚开始一直漏掉了这个结果一直登录失败orz,加载验证码时需要获取这个值,之后的访问中都要加入Header。

验证码刷新

在之前的路径上加了一个“?”,可以注意到Cookie中的值也发生了改变。

登录

分析下表单数据

  • __VIEWSTATE 隐藏的,,还不知道是什么用,需要传入那一大串值
  • txtUserName : 学号
  • TextBox2 : 密码
  • txtSecretCode : 验证码
  • RadioButtonList1:用户类型
  • Button1
  • lbLanguage
  • hidPdrs
  • hidsc

    后四个都不知道是做什么的(原谅我渣orz),传入空字符串就可以了。

好了,分析完,开始写代码

Android Studio添加依赖

compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okio:okio:1.5.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.google.code.gson:gson:2.6.2'

加上权限

<uses-permission android:name="android.permission.INTERNET" />

定义url

    private String codeUrl = "http://202.116.160.170/CheckCode.aspx";private String loginUrl = "http://202.116.160.170/default2.aspx";

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditText
        android:text="name"android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/user_name" /><EditText
        android:text="password"android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/user_password" /><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><EditText
            android:text="code"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:id="@+id/code"/><ImageView
            android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="3"android:id="@+id/code_image"/></LinearLayout><Button
        android:text="commit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/commit"/><ScrollView
        android:layout_width="match_parent"android:layout_height="match_parent"><TextView
            android:id="@+id/result"android:layout_width="match_parent"android:layout_height="wrap_content" /></ScrollView></LinearLayout>

刷新图片

public void reloadcode() {codeUrl += '?';initCode();}

使用Retrofit
Retrofit的使用参考:Android网络请求库 - Say hello to retrofit
retrofit官网

定义接口

public interface GnakApi {@Headers({"Referer: http://202.116.160.170/default2.aspx","Host: 202.116.160.170","Content-Type: application/x-www-form-urlencoded","charset: UTF-8"})@FormUrlEncoded@POST("default2.aspx")Call<ResponseBody> login(@Header("Cookie") String cookie,@Field("__VIEWSTATE") String viewstate,@Field("txtUserName") String user,@Field("TextBox2") String password,@Field("txtSecretCode") String code,@Field("RadioButtonList1") String studORTheacher,@Field("Button1") String button1,@Field("lbLanguage") String lbLanguage);@GET("CheckCode.aspx")Call<ResponseBody> getCodeImage();
}
        Retrofit retrofit = new Retrofit.Builder().baseUrl("http://202.116.160.170/").addConverterFactory(GsonConverterFactory.create()).build();GnakApi api = retrofit.create(GnakApi.class);

加载验证码图片,并设置sessionId

api.getCodeImage().enqueue(new Callback<ResponseBody>() {@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {Headers headers = response.headers();String sessionID = headers.get("Set-Cookie");Message msg = new Message();msg.obj = sessionID;handler.handleMessage(msg);byte[] bytes = new byte[0];try {bytes = response.body().bytes();} catch (IOException e) {e.printStackTrace();}//把byte字节组装成图片final Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);runOnUiThread(new Runnable() {@Overridepublic void run() {//网络图片请求成功,更新到主线程的ImageViewresultText.setText(sessionId);codeImage.setImageBitmap(bmp);}});}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {}});

登录

public void postData(){UserInfo userInfo = new UserInfo();userInfo.setCode(codeText.getText().toString());userInfo.setName(nameText.getText().toString());userInfo.setPassword(passwordText.getText().toString());api.login(sessionId,"dDwyODE2NTM0OTg7Oz6XQwtkC4IPj2mY5bsI42qRkaJNzw==",userInfo.getName(),userInfo.getPassword(),userInfo.getCode(),"学生","","").enqueue(new Callback<ResponseBody>() {@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {try {resultText.setText(response.body().string());} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {}});}

来试一下登录

哈哈,登录成功了

自娱自乐orz,还要再继续慢慢学习

参考文章:php后台“爬虫”模拟登录第三方系统(三)—模拟登录学校正方系统
知乎 毕业设计想把学校教务系统的功能模块做成手机APP?
打造正方管理系统Android客户端(一)

Android 模拟登陆正方教务系统(一)相关推荐

  1. Android 模拟登陆正方教务系统

    茂名职业技术学院官网新闻APP 这是一个使用jsoup爬取茂职院官网和正方教务系统信息的app. 采用viewpager+fragment+tablayout结构,支持下拉刷新和上拉加载. 主要功能有 ...

  2. php模拟登陆,php实现模拟登陆正方教务系统

    本文主要介绍通过php的curl库实现正方教务系统的登陆,由于正方教务系统每年可能会有一些更新,因此本文是针对2018年而言,所介绍一些模拟登陆正方的方法,希望能帮助到大家. 1.保存登陆界面的验证码 ...

  3. php模拟登陆正方教务系统(2018年)

    php模拟登陆正方教务系统(2018年) 本文主要介绍通过php的curl库实现正方教务系统的登陆,由于正方教务系统每年可能会有一些更新,因此本文是针对2018年而言,所介绍一些模拟登陆正方的方法. ...

  4. Java--使用httpClient模拟登陆正方教务系统获取课表

    最近形如课程格子与超表课程表应用如雨后春笋般涌现,他们自动获取课程表是怎么实现的呢.于是我用Java实现了一下模拟登陆正方教务系统获取课表的过程. 首先,我们先了解一下网站登录的原理:当我们输入学号, ...

  5. java模拟登录新版正方_java 模拟登陆正方教务系统

    比较懒,主要说一下思路.. 1.首先正方教务系统的验证码当你不去向服务器申请的时候,可以直接无视它不需要去输入验证码.可以通过浏览器屏蔽学校教务系统的图片就可以直接输入账号密码回车进去.. 2.通过抓 ...

  6. php模拟登陆青果教务系统,模拟登录 - php CURL模拟登陆正方教务系统

    代码如下 $cookie_file = tempnam('./temp','cookie'); $login_url = 'http://211.64.47.129/default_ysdx.aspx ...

  7. 正方教务系统连接服务器失败,模拟登陆正方教务系统,重定向一直解决不了〉...

    回复讨论(解决方案) 在线等,拜托各位 返回 这个网站没有使用 cookie 传递 sessionid 而是通过 url 传递的 所以你把这个写死是不行的: http://jwxt.nbut.cn / ...

  8. java实现模拟登陆正方教务系统

    java实现模拟登陆学校教务管理系统 全部代码总览 此版本无注释,请赏脸移步本人GitHub:https://github.com/1243418950/Jwgl import java.io.Buf ...

  9. python输入学号返回成绩_Python模拟登陆正方教务系统并抓取成绩单

    学校的教务系统是正方的,在大学期间无论是选课.报名还是查成绩,几乎都要和它打交道,上学期在积累了一定的爬虫和web知识后,我就想着用Python模拟登陆教务系统,实现在命令行里方便地进行成绩或课表的查 ...

最新文章

  1. 难道他们说的都是真的?
  2. Prototype [window_js_1.3.zip]
  3. Java为什么需要保留基本数据类型
  4. SystemParametersInfo (SPI_GETNONCLIENTMETRICS... 在VC 2008 里不能正常工作
  5. zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
  6. (网页)JS编程中,有时需要在一个方法返回两个个或两个以上的数据
  7. poj2778DNA Sequence (AC自动机+矩阵快速幂)
  8. java线程交替执行_Java synchronized线程交替运行实现过程详解
  9. 图灵奖公布!计算机图形学先驱 Hanrahan 和 Catmull 获奖,祝贺两位好莱坞 3D 动画大片技术元老...
  10. Pylon5 SDK搭配OpenCV使用入门
  11. Pycharm专业版注册教程
  12. java 无驱动socket连接热敏小票打印机示例,编写自定义模板 芯烨/xprinter,附工具类即开即用
  13. 不小心将 pip 卸载了,重新安装pip
  14. 「周末观赛指南」国足生死战 NBA将演“大结局”?
  15. MDK KEIL 下载算法程序 外部存储QSPI FLASH
  16. 关于python中的三个点【...】
  17. 查看linux当前ip,linux查看当前服务器ip地址 命令行
  18. 大师如何炼成 罗杰斯“不从众”的成功之道
  19. MapReduce中文版论文
  20. 上传IPA包到App Store

热门文章

  1. 数模(02)---多属性决策模型
  2. html中如何把一个div放到页面底部,html – 如何将DIV锚定到页面的底部?
  3. Pycurl的简单使用与对比
  4. hda vs sda
  5. Android 自定义View 一行显示不下换行显示
  6. 物联网是什么?物联网前景如何?
  7. 百度搜素推出细雨算法
  8. TI公司TMS封装与引脚对应关系
  9. 专精特新企业认定条件 这些条件要满足
  10. php酷狗音乐json,酷狗音乐API