安卓开发-模拟登陆上海理工大学-方正教务系统(HttpsURLConnection)
通过HttpsURLConnection模拟登录
今天,写一下基于方正教务系统的上海理工大学教务系统,项目放在了码云,有需要的可以直接翻到最后查看
首先还是登陆一下,看看我们在登陆的时候提交了什么
火狐浏览器为例,f12开发者模式,选择网络,然后登录,找到发送信息的post选项
可以看到除了账号密码和几项固定内容外,还包含了2个随机数据(不确定哪些是会变化的话可以多次登录对比数据)
那么首先我们就要先寻找这些数据的来源,回到登陆界面右键查看网页源代码。
然后搜索这两个数据的id,这里比较好获取,不同学校可能在不同地方。
那么我们模拟登录前首先就需要获取到这两个数据,cookie管理依然是采用自带CookieManager自动管理。
先准备个工具类,构造函数中准备好CookieManager,至于为什么需要cookie可以看我的上一篇博客。
public class Login_download {Context context;Login_download(Context context) {this.context = context;CookieManager cookieManager = new CookieManager();CookieHandler.setDefault(cookieManager);//接受所有cookiecookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);}
//其他函数
}
首先我们是需要获取内容的,由于https的安全特性,我们是不能直接使用HttpsURLConnection进行登录,一般有两种解决方法,这里我们使用比较暴力简单的信任所有证书。
直接放代码(放入工具类)
private static final class DefaultTrustManager implements X509TrustManager {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}}
//MOOD为GET或POST URL就是网址private static HttpsURLConnection getHttpsURLConnection(String uri, String method) throws IOException {SSLContext ctx = null;try {ctx = SSLContext.getInstance("TLS");ctx.init(new KeyManager[0], new TrustManager[] { new DefaultTrustManager() }, new SecureRandom());} catch (KeyManagementException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}SSLSocketFactory ssf = ctx.getSocketFactory();URL url = new URL(uri);HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();httpsConn.setSSLSocketFactory(ssf);//设置一下头,这里根据学校不同需要更改httpsConn.setRequestProperty("Accept",":text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");httpsConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");httpsConn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0");httpsConn.setHostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String arg0, SSLSession arg1) {return true;}});httpsConn.setRequestMethod(method);//这里其实是需要细分的,但是我偷懒了httpsConn.setDoInput(true);httpsConn.setDoOutput(true);httpsConn.setAllowUserInteraction(true);return httpsConn;}
通过这两个函数,我们就可以得到一个信任所有证书的HttpsURLConnection,随后的登录操作都使用这样获取的HttpsURLConnection。
HttpsURLConnection的用法和HttpURLConnection一样,这里节约版面,就不提,不太会的可以去上一篇,然后把HttpURLConnection直接替换一下就可以( ̄y▽, ̄)╭
下面按步骤放代码,尽量少讲
获取两个数据
这里推荐使用正则方法,我这里偷懒,直接subString。
String a=dct.getinf("https://ids6-443.webvpn.usst.edu.cn/authserver/login?service=https%3A%2F%2Fwebvpn.usst.edu.cn%2Fusers%2Fauth%2Fcas%2Fcallback%3Furl%3Dhttp%253A%252F%252Fwww.usst.edu.cn%252Fxywww%252Flist.htm","UTF-8");int yy=a.indexOf("name=\"lt\" value=\"");int yyy=a.indexOf("name=\"execution\" value=\"");String ln=a.substring(yy+17,a.indexOf("\"/>",yy));String execution=a.substring(yyy+24,a.indexOf("\"/>",yyy));String body11="username="+user;String body12="password="+password;String body13="lt="+ln;String body14="dllt=userNamePasswordLogin&execution="+execution+"&_eventId=submit&rmShown=1";body = body11 + "&" + body12 + "&" + body13 + "&" + body14;
body就是我们根据网页里获取的信息,拼接出来的。
随后发送该信息
String a=dct.postinf(URL,body,"UTF-8");
这里我们要去本科教务系统
继续观察可以看到点击后经过多次重定向后才进入本科教务系统,这里只需要做一次第一步。
String temp1=dct.getinf("https://jwgl.webvpn.usst.edu.cn/sso/jziotlogin","UTF-8");
学生课表查询
这里点击后我们可以看到进行了很多信息,但是GET的操作里并没有看到我们要的课表,这时候继续向下翻,能看到3个post,这里面就有我们需要的课表信息
post包含的信息也很简单,只包含了年份和学期数。这个数字我们可以直接从这个界面获取,查看源代码我们可以看到当前学期作为默认选项已经被选择
直接获取,然后jsoup解析
String temp2=dct.getinf(" https://jwgl.webvpn.usst.edu.cn/kbcx/xskbcx_cxXskbcxIndex.html?gnmkdm=N253508&layout=default&su="+username.getText().toString(),sc.get_class_code());Document doc = Jsoup.parse(temp2);Elements inf=doc.getElementsByClass("row");List<Element> HYSOptionList=inf.select("option");String poinf=null;for (Element Option:HYSOptionList) {if (0 != Option.getElementsByAttribute("selected").size()) {if(poinf==null){poinf="xnm="+Option.val()+"&xqm=";}elsepoinf+=Option.val();}}
poinf就是我们获取课表所需要提交的信息了:xnm=2019&xqm=12
最后一步就很明确了
myclass = dct.postinf(URL, poinf,"UTF-8");
这里的返回值是一个json字符串,解析方法这里就先不写了(饿死我了)
直接放代码,大家可以参考一下
try {JSONObject jsonObject = new JSONObject(myclass);JSONObject info = jsonObject.getJSONObject("xsxx");String id = info.getString("XH_ID");id+= info.getString("XM");id+="的课表";headname=id;//课表标题System.out.println(id);JSONArray Class_inf = new JSONArray(jsonObject.getString("kbList"));myclass=Class_inf.toString();for (int i = 0; i < Class_inf.length(); i++) {JSONObject jsonOb = Class_inf.getJSONObject(i);String classtime1 = jsonOb.getString("xqj");String classtime2 = jsonOb.getString("jcor");String name = jsonOb.getString("kcmc");String classroom1 = jsonOb.getString("xqmc");String classroom2 = jsonOb.getString("cdmc");String weeks = jsonOb.getString("zcd");String teacher = jsonOb.getString("xm");Log.d("上课时间::", "星期"+classtime1+" : "+classtime2+" "+weeks);Log.d("课程名称::", name);Log.d("上课地址::", classroom1+"-"+classroom2);Log.d("老师::", teacher+"\n");}} catch (JSONException e) {Log.e("jsonArray: ", e.toString());}
至此,上海理工大学的模拟登录和课表爬取已经结束啦(撒花),时间仓促写的比较粗。至于整个课表的项目,我已经上传了码云,有需求的同学可以去那里看看,包含所有代码
https://gitee.com/teddydesign/t_timetable?_from=gitee_search
回复:
我这个其实就是用的webvpn,见图一。具体代码写的不细,你可以看看我的码云的项目
String a=dct.getinf("https://ids6-443.webvpn.usst.edu.cn/authserver/login?service=https%3A%2F%2Fwebvpn.usst.edu.cn%2Fusers%2Fauth%2Fcas%2Fcallback%3Furl%3Dhttp%253A%252F%252Fwww.usst.edu.cn%252Fxywww%252Flist.htm","UTF-8");int yy=a.indexOf("name=\"lt\" value=\"");int yyy=a.indexOf("name=\"execution\" value=\"");String ln=a.substring(yy+17,a.indexOf("\"/>",yy));String execution=a.substring(yyy+24,a.indexOf("\"/>",yyy));String body11="username="+user;String body12= "password="+password;String body13= "lt="+ln;String body14= "dllt=userNamePasswordLogin&execution="+execution+"&_eventId=submit&rmShown=1";body = body11 + "&" + body12 + "&" + body13 + "&" + body14;System.out.println(body);
安卓开发-模拟登陆上海理工大学-方正教务系统(HttpsURLConnection)相关推荐
- nodejs模拟登陆旧版正方教务系统
nodejs模拟登陆旧版正方教务系统 nodejs模拟登陆学校教务系统 1.分析教务系统地址 2.分析请求头和请求数据 3.对Cookie.__VIEWSTATE数据的获取 (1)获取cookie ( ...
- 模拟登陆广西科技大学正方教务系统
一.首先对登录过程进行抓包,看看需要什么数据 登录地址:教学管理信息服务平台 我们可以看到登录采用POST对http://jwxt.gxust.edu.cn:9600/xtgl/login_slo ...
- 基于Python 3.11.0版本模拟登录并爬取西安理工大学正方教务系统的学分绩点并计算
目录 使用软件以及运行环境 对于环境的搭建 代码思路 需要导入的包 模拟登录 爬取数据 绩点计算器 功能一 功能二 完整代码 使用软件以及运行环境 win10系统,Vs Code软件,Python 3 ...
- 解析教务系统查看平时成绩(方正教务系统)
好啦,身患懒癌的我终于迎来了更新. 干货,很干很干的货.期末考试完了很多小伙伴都在等成绩的出来,成绩出来又只有一个最终成绩,所以才有了这次的更新,教大家如何查看自己的平时成绩和卷面成绩!!!(P.S: ...
- 新版方正教务系统爬虫
新版方正教务系统爬虫 技术 解释 Python 2.7 BeautifulSoup 4.X Pycharm 2017 Firefox - Firebug - 新版教务处地址 218.199.228.4 ...
- 如何不通过调用官方微博api制作一个第三方微博app---在Android开发模拟登陆微博(weibo.cn)
前段时间对一个第三方微博app---Share的实现原理非常感兴趣,也想自己实现一个自己的第三方微博app.目标有了,那就去查一下微博数据怎么获取吧.原来微博是有开放第三方接口的,只需要申请一个app ...
- python 裁判文书网_python - 用selenium模拟登陆裁判文书网,系统报错找不到元素。...
问 题 from selenium import webdriver from selenium.webdriver.common.desired_capabilities import Desire ...
- 方正教务系统自动评价
var answer_id = ["DataGrid1_JS1_", "DataGrid1_JS2_"]; var pj_value = ["对待教学 ...
- java 模拟登录出现系统异常_很奇怪!Java web问题,模拟登陆教务系统刷新两次后就没反应了!...
我用HttpClient 4.5模拟登陆自己学校的教务系统,我们学校登陆成功先返回一个302跳转(勿喷,正方教务...): 先获取隐藏值: /** * 获取隐藏值 * @throws ClientPr ...
最新文章
- 计算机网络专业教学模式,计算机网络技术专业教学模式改革探索
- Flex的事件(三)
- 这届 Windows 不行,是因为微软不卖“软件”改卖“服务”?
- 杭电OJ分类题目(1)
- Windows server2016 安装SqlServer2005 无法启动服务
- DirectX修复工具
- node.js离线库
- nginx流媒体服务器性能,搭建nginx流媒体服务器(支持HLS)
- 计算机图形学-五角星的画法(转)
- 【日常实用篇】解决2345压缩软件自带的流氓广告
- 小红书笔记如何发布内容
- c++中static的用法详解
- 【HDLBits 刷题】所有答案直达链接汇总
- 安卓设备门禁识别开发_基于Android和RFID的门禁管理系统
- 软件工程专业就业前景怎么样?
- 如何让多个div横向排列而不换行
- [听风]TBC单体插件动作条Bartender4
- 大数据的分布式SQL查询引擎 -- Presto的详细使用
- OpenCv设置摄像头参数/获得摄像头参数值
- 达梦数据库开发规范及存储过程与函数