Android登录学校正方教务处--CSDN第一次发帖

2023-10-24 16:10

本文主要是介绍Android登录学校正方教务处--CSDN第一次发帖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近想写一个仅供学校学生使用的福利app,登录验证方式就想到了学校教务系统的验证,没有和老师有任何的沟通,也没有私有接口

======================================================================================================

先说环境吧,燕山大学教务处 http://jwc.ysu.edu.cn/  开发环境为Eclipse+ADT22.3,HAXM加速的Android2.3模拟器

再说软件吧,Firefox + Live Http Header扩展

最后就是测试账号吧,咳咳,是楼主的

=====================================================================================================

demo已共享到github  https://github.com/hailian/ysujwc

======================================================================================================

点击登录到教务系统

然后就跳转,地址栏就变成如下


括号中间的字符串随机出线。。。。

一、得到这些随机字符

打开Firefox,回到http://jwc.ysu.edu.cn/,等待载入完成后,打开Live HTTP headers;

再点击登录镜像系统,把Live HTTP headers滚动条拖到最上面,看到如图选中的,即为地址


下面就是获取这些地址;

try {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://jwc.ysu.edu.cn/zjdxgc/default2.aspx");
//
//
HttpResponse response = client.execute(httpGet);
int responseCode = response.getStatusLine().getStatusCode();
Log.e("responseCode--", "" + responseCode);
//
Header[] headers = response.getAllHeaders();
for (Header header : headers) {
Log.d("header",
header.getName() + ": " + header.getValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}

实验发现GET方式过去,responseCode是200,并不是上图的302,自然得不到Location;

原来是自动重定向,以上代码改为

try {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(
"http://jwc.ysu.edu.cn/zjdxgc/default2.aspx");
//
//
HttpParams params = new BasicHttpParams();
params.setParameter("http.protocol.handle-redirects", false);
httpGet.setParams(params);
//
HttpResponse response = client.execute(httpGet);
int responseCode = response.getStatusLine().getStatusCode();
Log.e("responseCode--", "" + responseCode);
//
Header[] headers = response.getAllHeaders();
for (Header header : headers) {
Log.d("header",
header.getName() + ": " + header.getValue());
}


if (responseCode == 302) {
Header locationHeader = response
.getFirstHeader("Location");
if (locationHeader != null) {
url_location = "http://jwc.ysu.edu.cn"
+ locationHeader.getValue();
Log.i("url_location---", url_location);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

这样就获得了地址




二、获取Post键值对,和验证码

再验证码输入0000,再次打开Live HTTP headers ,然后点击网页上登录,弹出验证码不正确;


切换到HTTP headers 页面,拖到最上,点击Replay... 


其中txtUserName为学号,TextBox2为密码,txtSecretCode为验证码,这是显而易见的;

但是__VIEWSTATE和RadioButtonList1是什么意思,还有转码。。。

想了想,我认为RadioButtonList1的转码是输入验证码时,其下面的“学生”,后来证明了我的想法;

但是这个__VIEWSTATE是不是与ip有关呢?我去隔壁宿舍登了一下,证明无关,那我就写死吧。。

后来证明错了。。__VIEWSTATE是一个与时间有关的字符串。


查看网页源代码,发现第78行有这个字符串



想到了读取输入流,转换成字符串再解析,但由于上一个是禁止自动重定向,这次新建一个;解析是用String.split()方法

try {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(
"http://jwc.ysu.edu.cn/zjdxgc/default2.aspx");
//
HttpGet httpGet2 = new HttpGet(
"http://jwc.ysu.edu.cn/zjdxgc/default2.aspx");
//
//
HttpParams params = new BasicHttpParams();
params.setParameter(
"http.protocol.handle-redirects", false);
httpGet.setParams(params);
//
HttpResponse response = client.execute(httpGet);
HttpResponse response2 = client.execute(httpGet2);
int responseCode = response.getStatusLine()
.getStatusCode();
int responseCode2 = response2.getStatusLine()
.getStatusCode();
Log.e("responseCode--", "" + responseCode);
Log.e("responseCode2--", "" + responseCode2);
//
Header[] headers = response.getAllHeaders();
for (Header header : headers) {
Log.d("header", header.getName() + ": "
+ header.getValue());
}


if (responseCode == 302 && responseCode2 == 200) {
String[] html = EntityUtils.toString(
response2.getEntity()).split("\n");
String[] inCodeStr = html[77].split("\"");
String key = inCodeStr[5];
Log.i("", key);
Header locationHeader = response
.getFirstHeader("Location");
if (locationHeader != null) {
String location = "http://jwc.ysu.edu.cn"
+ locationHeader.getValue();
Log.i("url_location---", location);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

然后log显示的为

验证码,就简单的用GET流生成Bitmap

HttpURLConnection h;
try {
h = (HttpURLConnection) new URL(url_yzm).openConnection();
h.setReadTimeout(5000);
h.setDoInput(true);
h.connect();
Bitmap bm = BitmapFactory.decodeStream(h.getInputStream());
//
h.getInputStream().close();
// img_yzm.setImageBitmap(bm);
Message msg = new Message();
msg.what = HANDLER_IMG_SUCCEED;
msg.obj = bm;
handler.sendMessage(msg);
Log.i("yzm---", "yzm success");
} catch (MalformedURLException e) {
Log.e("MalformedURLException", e.toString());
Log.i("yzm---", "yzm fail1");
} catch (IOException e) {
Log.e("MalformedURLException", e.toString());
Log.i("yzm---", "yzm fail2");
}

三、post吧

直接上代码

try {
HttpClient client = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("__VIEWSTATE", key));
// "dDwyODE2NTM0OTg7Oz6EIvBWZGpFetygfIX+qirD5BTcnA=="));
// params.add(new BasicNameValuePair("__VIEWSTATE",
// "dDwyODE2NTM0OTg7Oz7vFIof%2Bc6rGXD5W9puRFp5VKKG%2FQ%3D%"));
params.add(new BasicNameValuePair("txtUserName", ed_id
.getText().toString()));
params.add(new BasicNameValuePair("TextBox2", ed_pwd
.getText().toString()));
params.add(new BasicNameValuePair("txtSecretCode",
ed_yzm.getText().toString()));
params.add(new BasicNameValuePair("RadioButtonList1",
"学生"));
// params.add(new BasicNameValuePair("RadioButtonList1",
// "%D1%A7%C9%FA"));
params.add(new BasicNameValuePair("Button1", ""));
params.add(new BasicNameValuePair("lbLanguage", ""));
params.add(new BasicNameValuePair("hidPdrs", ""));
params.add(new BasicNameValuePair("hidsc", ""));
//


httpPost.setEntity(new UrlEncodedFormEntity(params,
HTTP.ISO_8859_1));


HttpResponse response = client.execute(httpPost);
int responseCode = response.getStatusLine()
.getStatusCode();
Log.e("responseCode--", "" + responseCode);
//
if (responseCode == 200) {
String[] result = EntityUtils.toString(
response.getEntity()).split("\n");
String loginState = result[4].substring(9,
result[4].length() - 9);
Log.d(TAG, loginState);
if (loginState.equals("正方教务管理系统")) {
Log.v("loginState--", loginState);
Log.v("namelist--88", result[88]);
Log.v("namelist--89", result[89]);
Log.v("namelist--90", result[90]);
Log.v("namelist--91", result[91]);
Log.v("namelist--92", result[92]);
String[] namelist = result[88].split("<");
String[] names = namelist[1].split(">");
String name = names[1];
Log.i(TAG, name);

} else {
Log.e(TAG, "login fail");
Message msg = new Message();
msg.what = HANDLER_LOGIN_FAIL;
handler.sendMessage(msg);
}


}


} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

图片



这篇关于Android登录学校正方教务处--CSDN第一次发帖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/276319

相关文章

高考志愿填报:选好专业还是选好学校?

目录 引言 专业解析 工科类专业 文科类专业 医药类专业 商科类专业 名校效应分析 名校声誉的影响 教育资源和研究机会 学术氛围和创新能力 就业优势 好专业和好学校的权衡 职业目标的判断 行业需求的考量 教育质量的比较 结论 引言 2024年高考帷幕落下,一场新的思考与选择悄然来临。对于每一位高考考生,学校和专业都是开启大学新生活的两个前置必

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

android 带与不带logo的二维码生成

该代码基于ZXing项目,这个网上能下载得到。 定义的控件以及属性: public static final int SCAN_CODE = 1;private ImageView iv;private EditText et;private Button qr_btn,add_logo;private Bitmap logo,bitmap,bmp; //logo图标private st

Android多线程下载见解

通过for循环开启N个线程,这是多线程,但每次循环都new一个线程肯定很耗内存的。那可以改用线程池来。 就以我个人对多线程下载的理解是开启一个线程后: 1.通过HttpUrlConnection对象获取要下载文件的总长度 2.通过RandomAccessFile流对象在本地创建一个跟远程文件长度一样大小的空文件。 3.通过文件总长度/线程个数=得到每个线程大概要下载的量(线程块大小)。

时间服务器中,适用于国内的 NTP 服务器地址,可用于时间同步或 Android 加速 GPS 定位

NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备【如计算机、手机】的时间的协议。 NTP 实现什么目的?   目的很简单,就是为了提供准确时间。因为我们的手表、设备等,经常会时间跑着跑着就有误差,或快或慢的少几秒,时间长了甚至误差过分钟。 NTP 服务器列表 最常见、熟知的就是 www.pool.ntp.org/zo

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

智慧环保一体化平台登录

据悉,在当今这个数字化、智能化的时代,环境保护工作也需要与时俱进,不断创新。朗观视觉智慧环保一体化平台应运而生,它利用先进的信息技术手段,为环保工作提供了更加便捷、高效的管理方式,成为推动绿色发展的重要力量。 一、智慧环保一体化平台的诞生背景 随着工业化进程的加快,环境污染问题日益严重,传统的环保管理模式已经难以满足现代社会的需求。为了提高环保工作的效率和质量,智慧环保一体化平台应运而