打造正方管理系统Android客户端(一)

一个大学没有自己的移动客户端,不能忍!查成绩,课表考试都要打开网页,不能忍!超级课程表丑陋的UI不能忍!广告不能忍!
那么既然这么多不能忍,那不如我们自己开发一个,当然,指望正方给你提供API那是不可能的了,所以,就只有爬网页了。

用到的工具:
  • chrome (用开发者工具抓包)
  • Jsoup (解析html)
  • okhttputils (网络访问,张鸿洋大神的开源框架)
    关于 Jsoupokhttputils不会使用的同学,可以自行google。本篇教程还没有使用到Jsoup;
环境搭建

在Android Studio添加依赖

compile 'com.zhy:okhttputils:2.3.9'
compile 'org.jsoup:jsoup:1.9.1'

登录抓包
  1. 首先进入你学校的正方管理系统首页,比如我们学校的首页,chrome打开开发者选项;顶部选项卡切换到Network界面;
  2. 登录你的账号,登录成功后查看chrome开发者工具

Paste_Image.png

黑框中的就是我们需要的,当然有可能你学校的是defaultX,貌似用default1~6 6个页面吧。然后我们点一下他,就会看到具体的Headers信息,这是我们需要的,首先我们先看最下面的Form Data 如图:
form data

这些就是我们请求的表单数据;
前面两个 __VIEWSTATE__VIEWSTATEGENERATOR不知道什么意思,一会直接复制那个值就可以了。

txtUserName : 用户名
TextBox2 : 密码
txtSecretCode : 验证码
RadioButtonList1:用户类型,学生,教师
Button1: 不知道是什么,传一个空字符串就可以了
lbLanguage : 不知道是什么,传一个空字符串就可以了

好了,上面的就是我们需要请求的表单信息,当然,要想在手机上模拟登录,还是不都够了,我们还需要以下的信息 ,可以在Request Headers中得到:

Host:210.44.159.4
Referer:http://210.44.159.4/default2.aspx

General中得到:

Request URL:http://210.44.159.4/default2.aspx

有了上面的这些信息,我们就可以在手机上请求登录了,激动吧!
等等,那个验证码我们怎么得到呢?

获取验证码

不着急,这个好办;回到正方管理系统首页;鼠标放在验证码上面,然后右键-检查,就会看到:

验证码url

黑框中的链接就是验证码的url,然后,右键-Copy link address 就可以得到我们的验证码url了,不信的话可以复制到浏览器打开,看是不是我们的验证码呢;

http://210.44.159.4/CheckCode.aspx

还有个问题就是,我们有时候会因为一些问题需要切换验证码,那么,如何更新验证码呢?

这个也不难,从上图中我们可以看到, 验证码图片有一个onClick() 事件,它触发了一个reloadcode() 方法;然后我们查看网页源代码,找到这个方法,发现是这样的

function reloadcode()
{
     var verify=document.getElementById('icode');
     verify.src=verify.src+'?';
}

很容易知道,切换验证码,只是在源url后面加了一个 ? ,就可以切换验证码了。

登录

有了这些信息就可以请求登录的了;网络访问我用的是张鸿洋的okhttputils当然你也可以用别的。
想看看布局,布局简单:

 <EditText
        android:id="@+id/et_stuid"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入学号" />

    <EditText
        android:id="@+id/et_stupsw"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv_code"
            android:layout_width="70dp"
            android:layout_height="30dp"
            android:layout_gravity="center" 
            android:clickable="true"
            android:onClick="reloadcode"/>

        <EditText
            android:id="@+id/et_code"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="验证码" />
    </LinearLayout>

    <Button
        android:id="@+id/bt_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登录" 
        android:onClick="login"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/tv_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </ScrollView>

EditText用于输入学号密码和验证码,最下面的TextView用于展示登录后的页面,主要是给大家看看请求登录之后是什么样子。我们先来看看部分代码吧

  • 加载验证码
     /**
     * 加载验证码
     */
    private void initCode() {
        OkHttpUtils
                .get()
                .url(codeUrl)
                .build()
                .connTimeOut(5000)
                .execute(new BitmapCallback() {
                    @Override
                    public void onError(okhttp3.Call call, Exception e) {
                        //加载失败
                    }

                    @Override
                    public void onResponse(Bitmap response) {
                        //设置验证码
                        ivCode.setImageBitmap(response);
                    }
                });
    }
  • 切换验证码
 public void reloadcode(View view) {
        codeUrl += '?';
        //修改url后重庆请求验证码
        initCode();
    }
  • 登录
  OkHttpUtils.post()
                //loginUrl就是你请求登录的url
                .url(loginUrl)
                //下面数据抓包可以得到
                .addParams("__VIEWSTATE", "dDwtMTMxNjk0NzYxNTs7PpK7CYMIAY8gja8M8G8YpGL8ZEAL")
                .addParams("__VIEWSTATEGENERATOR", "92719903")
                .addParams("txtUserName", stuId) //学号,
                .addParams("TextBox2", stuPsw)//密码
                .addParams("txtSecretCode", code) //验证码
                .addParams("RadioButtonList1", "%D1%A7%C9%FA")
                .addParams("Button1", "")
                .addParams("lbLanguage", "")
                .addHeader("Host", "210.44.159.4")
                .addHeader("Referer", "//210.44.159.4/default2.aspx")
                .build()
                .connTimeOut(5000)
                .execute(new StringCallback() {

                    @Override
                    public void onError(Call call, Exception e) {
                        //请求失败
                    }

                    @Override
                    public void onResponse(String response) {
                        System.out.println("onResponse");
                        //请求成功,response就是得到的html文件(网页源代码)
                        if (response.contains("验证码不正确")) {
                            //如果源代码包含“验证码不正确”
                            System.out.println("验证码不正确");
                        } else if (response.contains("密码错误")) {
                            //如果源代码包含“密码错误”
                            System.out.println("验证码不正确");
                        } else if (response.contains("用户名不存在")) {
                            //如果源代码包含“用户名不存在”
                            System.out.println("用户名不存在");
                        } else {
                            //登录成功
                            System.out.println("登录成功");
                            tvContent.setText(response);
                        }
                    }
                });
    }
  • 权限
    最后要记得把权限加上
 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 大功告成
    我们跑起来吧;
登录界面

哈哈,是不是有了,还有模有样的,激动吗?
我们输入信息登录试一试;

登录成功

我们看一下网页的源代码,是不是包含上面的代码呢,是不是发现了什么,
“欢迎您 :”,“xxx同学”,哈哈,这个就是我们在网页登录成功之后的右上角显示的欢迎信息的源代码。这就说明我们登录成功了。
当然还有的情况就是验证码错误,密码错误以及用户名不存在,同样我们也可以从源代码看出来, 其实在网页上就是显示了一个alert()的弹窗,里面有提示信息,所以,我们在手机上就很容易判断出事登录成功了,还是登录失败了,然后写上相关的逻辑,我这里就不一一写出来了,交给你吧,其实在上面,我已经给你简单的判断了一下了。
好了,上面的就是今天的内容,后面的内容我将介绍大家最关心的考试查询,成绩查询和课表查询

本教程的Demo我已经托管了Github上;
项目地址:https://github.com/hunao0221/LoginDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容