通过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)相关推荐

  1. nodejs模拟登陆旧版正方教务系统

    nodejs模拟登陆旧版正方教务系统 nodejs模拟登陆学校教务系统 1.分析教务系统地址 2.分析请求头和请求数据 3.对Cookie.__VIEWSTATE数据的获取 (1)获取cookie ( ...

  2. 模拟登陆广西科技大学正方教务系统

    一.首先对登录过程进行抓包,看看需要什么数据   登录地址:教学管理信息服务平台 我们可以看到登录采用POST对http://jwxt.gxust.edu.cn:9600/xtgl/login_slo ...

  3. 基于Python 3.11.0版本模拟登录并爬取西安理工大学正方教务系统的学分绩点并计算

    目录 使用软件以及运行环境 对于环境的搭建 代码思路 需要导入的包 模拟登录 爬取数据 绩点计算器 功能一 功能二 完整代码 使用软件以及运行环境 win10系统,Vs Code软件,Python 3 ...

  4. 解析教务系统查看平时成绩(方正教务系统)

    好啦,身患懒癌的我终于迎来了更新. 干货,很干很干的货.期末考试完了很多小伙伴都在等成绩的出来,成绩出来又只有一个最终成绩,所以才有了这次的更新,教大家如何查看自己的平时成绩和卷面成绩!!!(P.S: ...

  5. 新版方正教务系统爬虫

    新版方正教务系统爬虫 技术 解释 Python 2.7 BeautifulSoup 4.X Pycharm 2017 Firefox - Firebug - 新版教务处地址 218.199.228.4 ...

  6. 如何不通过调用官方微博api制作一个第三方微博app---在Android开发模拟登陆微博(weibo.cn)

    前段时间对一个第三方微博app---Share的实现原理非常感兴趣,也想自己实现一个自己的第三方微博app.目标有了,那就去查一下微博数据怎么获取吧.原来微博是有开放第三方接口的,只需要申请一个app ...

  7. python 裁判文书网_python - 用selenium模拟登陆裁判文书网,系统报错找不到元素。...

    问 题 from selenium import webdriver from selenium.webdriver.common.desired_capabilities import Desire ...

  8. 方正教务系统自动评价

    var answer_id = ["DataGrid1_JS1_", "DataGrid1_JS2_"]; var pj_value = ["对待教学 ...

  9. java 模拟登录出现系统异常_很奇怪!Java web问题,模拟登陆教务系统刷新两次后就没反应了!...

    我用HttpClient 4.5模拟登陆自己学校的教务系统,我们学校登陆成功先返回一个302跳转(勿喷,正方教务...): 先获取隐藏值: /** * 获取隐藏值 * @throws ClientPr ...

最新文章

  1. 计算机网络专业教学模式,计算机网络技术专业教学模式改革探索
  2. Flex的事件(三)
  3. 这届 Windows 不行,是因为微软不卖“软件”改卖“服务”?
  4. 杭电OJ分类题目(1)
  5. Windows server2016 安装SqlServer2005 无法启动服务
  6. DirectX修复工具
  7. node.js离线库
  8. nginx流媒体服务器性能,搭建nginx流媒体服务器(支持HLS)
  9. 计算机图形学-五角星的画法(转)
  10. 【日常实用篇】解决2345压缩软件自带的流氓广告
  11. 小红书笔记如何发布内容
  12. c++中static的用法详解
  13. 【HDLBits 刷题】所有答案直达链接汇总
  14. 安卓设备门禁识别开发_基于Android和RFID的门禁管理系统
  15. 软件工程专业就业前景怎么样?
  16. 如何让多个div横向排列而不换行
  17. [听风]TBC单体插件动作条Bartender4
  18. 大数据的分布式SQL查询引擎 -- Presto的详细使用
  19. OpenCv设置摄像头参数/获得摄像头参数值
  20. 达梦数据库开发规范及存储过程与函数

热门文章

  1. 零基础学习python第二课笔记
  2. LeetCode高频题76. 最小覆盖子串:欠账还债还款问题,子串考虑i开头的情况所有答案更新一波
  3. 保卫资金链:资金链的五种死法和五种活法
  4. 服务器拷文件突然自动关机,windows server 2008R2自动关机解决方法
  5. 微信群影视机器人登录使用教程
  6. c语言如何输出字母锥子塔,GCC连接脚本学习笔记 zz
  7. Python学习 Day30 正则表达式(二)
  8. Tita OKR实施攻略
  9. 良精商城网店购物系统
  10. 基于Python实现的二手车价格预测