Golang-自动化监控教务系统成绩单

简介: Golang-自动化监控教务系统成绩单

一、Golang模拟用户登陆,突破教务系统#


1.1 请求登陆页面#


整个流程中的第一步是获取登陆页面,就像下图这样人为的通过浏览器访问服务端,服务端返回反馈返回登陆页面



访问登陆页面的目的上图中标注出来了,为了获取到Cookie,给真正发起登陆到请求方法使用。


下面的golang发送http到get请求,获取登陆页面的代码:


// 访问登陆也,获取cookie
func GetCookieFromLoginhtml(url string) (cookie string, e error) {
   res, err := http.Get(url)
   if err != nil {
    e = err
   }
   // 获取cookie
   cookie = res.Header.Get("Set-Cookie")
   cookie = util.GetOneValueByPrefixAndSurfix("JSESSIONID=", "; Path=/", cookie)
   res.Body.Close()
   return
}


1.2 抓包分析登陆请求#


输入账号账号密码后点击登陆,将向后端发送登陆请求,如下图:



分析向后端发送到登陆请求都携带了哪些请求参数,携带了哪些请求头信息,以及需要通过Content-Type判断,该如何处理form表单中的数据发送到后台。后台才能正常响应。



在浏览器的控制台中我们可以去看下登陆页面源码



登陆页面对应的js源码



1.3 golang使用js引擎合成salt#


这一步也是必须的,所谓获取salt,其实就是通过golang使用js引擎执行encodeInp(xxx), 这样我们才能得到经过加密后的username和password,进一步获取到encoded


import (
  "github.com/robertkrimen/otto"
  "io/ioutil"
)
func EncodeInp(input string)(result string,e error)  {
  jsfile := "js/encodeUriJs.js"
  bytes, err := ioutil.ReadFile(jsfile)
  if err != nil {
    e = err
  }
  vm := otto.New()
  _, err = vm.Run(string(bytes))
  if err != nil {
    e = err
  }
  enc,err :=vm.Call("encodeInp",nil,input)
  if err != nil {
    e = err
  }
  result = enc.String()
  return
}


js部分的代码就不往外贴了,可以去下面的github地址中获取


1.4 模拟表单提交,完成登陆#


使用golang模拟登陆请求


// 模拟登陆
func login(salt, cookie string) (html string) {
  req, err := http.NewRequest("POST", LoginUrl, strings.NewReader("encoded="+salt))
  // 添加请求头
  req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36")
  req.Header.Add("Cookie", "JSESSIONID="+cookie)
  req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
  //发送请求
  client := &http.Client{}
  resp, err := client.Do(req)
  if err != nil {
    fmt.Printf("无密版qlu教务系统登陆请求失败 : %v", err)
    return
  }
  // todo 根据状态码判断下一步如何操作,如果状态码是302,表示操作成功
  fmt.Println("resp.Status:  ", resp.Status)
  b, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    fmt.Printf("error : %v", err)
    return
  }
  // 返回个人主页的html
  html = string(b)
  // 手动关闭
  resp.Body.Close()
  return
}


这一步中值得注意的地方:


第一:我们发送的请求的类型是POST请求

第二:我们应该如何处理form表单中的数据后,再发送给后端,后端才能正常处理呢?


具体处理成什么样,是需要根据请求头中的Content-Type决定的。

不知道大家知不知道常见的Content-Type的几种类型:在form 表单中有一个属性叫做 entype可以间接将数据处理成Content-Type指定数据格式, 比如我们可以像这样设置:

  • enctype = text/plain 那么form表单最终提交的格式就是: 用纯文本的形式发送。
  • enctype = application/x-www-form-urlencoded
  • 表单中的enctype值如果不设置,则默认是application/x-www-form-urlencoded,它会将表单中的数据变为键值对的形式。
  • 如果action为get,则将表单数据编码为(name1=value1&name2=value2…),然后把这个字符串加到url后面,中间用?分隔。
  • 如果action为post,浏览器把form数据封装到http body中,然后发送到服务器。
  • enctype = mutipart/form-data
  • 上传的是非文本内容,比如是个图片,文件,mp3。


根据这个知识点,结合我们当前的情况,method=post,Content-Type = application/x-www-form-urlencoded

所以,在选择golang的api时,我们选择下图这个api使用



1.5 进入成绩查询页,解析用户成绩#


如果不出意外,经过上面的处理,我们已经完成登陆,并且获取到后台页面的html源码了。


再之后我们就直奔成绩查询模块,还是使用如何的分析思路


func getAllScore(stuIdentify, cookie string) ([]mtStruct.Score, error) {
  // 发送查询成绩的请求
  u := "http://jwxt.qlu.edu.cn/jsxsd/kscj/cjcx_list"
  req, err := http.NewRequest("POST", u, strings.NewReader("kksj=&kcxz=&kcmc=&xsfs=all"))
  if err != nil {
    fmt.Printf("error : %v", err)
    return nil, err
  }
  req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36")
  req.Header.Add("Cookie", "JSESSIONID="+cookie)
  req.Header.Add("Referer", "http://jwxt.qlu.edu.cn/jsxsd/kscj/cjcx_query?Ves632DSdyV=NEW_XSD_XJCJ")
  req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*;q=0.8,application/signed-exchange;v=b3;q=0.9")
  client := &http.Client{}
  resp, err := client.Do(req)
  ...
}


代码详情可以去github上查看。


二、植入微信公共号后台#


上面的功能实现后再结合Golang开发微信公众号就能实现一款好玩的应用。


让用户通过微信公共号平台和后端进行数据的交互,我们获取到用户的信息,拿着用户的信息帮用户监听教务系统的成绩单的状态。一旦有成绩第一时间推送给用户。


点击查看公众号端设计思路


项目GitHub地址:https://github.com/zhuchangwu/golang-wechat-backend

相关文章
|
27天前
|
运维 监控 安全
构建高效运维体系:从监控到自动化的全方位实践
本文深入探讨了构建高效运维体系的关键要素,从监控、日志管理、自动化工具、容器化与微服务架构、持续集成与持续部署(CI/CD)、虚拟化与云计算以及安全与合规等方面进行了全面阐述。通过引入先进的技术和方法,结合实际案例和项目经验,为读者提供了一套完整的运维解决方案,旨在帮助企业提升运维效率,降低运营成本,确保业务稳定运行。
|
1天前
|
运维 监控 安全
构建高效运维体系:从监控到自动化的全面指南在当今数字化时代,运维作为保障系统稳定性和效率的重要环节,其重要性不言而喻。本文将深入探讨如何构建一个高效的运维体系,从监控系统的搭建到自动化运维的实施,旨在为读者提供一套完整的解决方案。
本文详细介绍了高效运维体系的构建过程,包括监控系统的选择与部署、日志分析的方法、性能优化的策略以及自动化运维工具的应用。通过对这些关键环节的深入剖析,帮助运维人员提升系统的可靠性和响应速度,降低人工干预成本,实现业务的快速发展和稳定运行。
|
3天前
|
运维 Prometheus 监控
运维中的自动化实践每月一次的系统维护曾经是许多企业的噩梦。不仅因为停机时间长,更因为手动操作容易出错。然而,随着自动化工具的引入,这一切正在悄然改变。本文将探讨自动化在IT运维中的重要性及其具体应用。
在当今信息技术飞速发展的时代,企业对系统的稳定性和效率要求越来越高。传统的手动运维方式已经无法满足现代企业的需求。自动化技术的引入不仅提高了运维效率,还显著降低了出错风险。本文通过几个实际案例,展示了自动化在IT运维中的具体应用,包括自动化部署、监控告警和故障排除等方面,旨在为读者提供一些实用的参考。
|
1月前
|
存储 弹性计算 运维
自动化监控和响应ECS系统事件
阿里云提供的ECS系统事件用于记录云资源信息,如实例启停、到期通知等。为实现自动化运维,如故障处理与动态调度,可使用云助手插件`ecs-tool-event`。该插件定时获取并转化ECS事件为日志存储,便于监控与响应,无需额外开发,适用于大规模集群管理。详情及示例可见链接文档。
|
29天前
|
存储 运维 监控
构建高效运维体系:从监控到自动化的全方位实践指南
在当今数字化时代,企业对运维(Operations)的需求日益增长。运维不仅仅是保持系统运行那么简单,它涉及到监控、日志管理、故障排除、性能优化和自动化等多个层面。本文将从实际操作的角度出发,详细探讨如何构建一个高效的运维体系。通过具体案例,我们将了解不同运维工具和方法的应用,以及它们是如何帮助企业提高生产效率和降低运营风险的。无论你是刚接触运维的新手,还是经验丰富的专家,这篇文章都将为你提供宝贵的参考和启示。
|
11天前
|
运维 监控 安全
构建高效运维体系:从监控到自动化的实践之路
在当今信息技术飞速发展的时代,运维作为保障企业信息系统稳定运行的关键环节,其重要性日益凸显。本文将探讨如何通过构建高效的运维体系,实现从被动响应到主动预防的转变,以及如何利用自动化工具提升运维效率和质量。我们将从运维的基本概念出发,逐步深入到监控、自动化和安全管理等方面,为企业提供一套实用的运维优化方案。
34 0
|
17天前
使用装饰器实现自动化日志系统
使用装饰器实现自动化日志系统
14 0
|
2月前
|
运维 监控 应用服务中间件
自动化运维:打造高效、稳定的系统环境
【8月更文挑战第30天】本文将探讨如何通过自动化运维技术,提升系统的稳定性和效率。我们将从基础概念出发,逐步深入到实践应用,分享一些实用的工具和技术,以及如何将这些工具和技术融入到日常的运维工作中。无论你是运维新手,还是有一定经验的老手,都能在这篇文章中找到有价值的信息。让我们一起探索自动化运维的世界,提升我们的工作效率,让系统运行得更加平稳。
|
21天前
|
运维 监控 负载均衡
高效运维管理:如何通过自动化提升系统可靠性
本文探讨了如何通过自动化提升系统可靠性,包括自动化监控、自动化部署、自动化测试和自动化故障恢复四个方面。通过实际案例展示了自动化在运维中的应用效果,强调了团队建设与培训的重要性以及持续改进与优化的策略。
18 0
|
1月前
|
存储 运维 监控
构建高效运维体系:从监控到自动化的全方位实践
在当今信息技术飞速发展的时代,运维作为保障信息系统稳定运行的关键环节,其重要性不言而喻。本文将围绕如何构建一个高效的运维体系进行深入探讨,内容涵盖从监控、日志分析到自动化运维工具的选择与应用,以及在实际工作中的经验和案例分享。通过本文的介绍,读者将能够了解到如何在复杂多变的技术环境中,确保系统的高可用性、高性能和安全性,为业务连续性提供坚实保障。