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

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使