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

相关文章
|
15天前
|
人工智能 自然语言处理 数据挖掘
企业数字化转型的关键:如何利用OA系统实现自动化与智能决策
在数字化时代,传统办公系统已无法满足现代企业的需求。通过将RPA(机器人流程自动化)和AI(人工智能)技术与OA系统结合,企业能实现业务流程自动化、智能决策支持,大幅提升工作效率和资源配置优化,推动数字化转型。RPA可自动处理重复任务,如审批、数据同步等;AI则提供智能数据分析、预测和决策支持,两者协同作用,助力财务管理、人力资源管理、项目管理和客户服务等多个领域实现智能化升级。未来,智能化OA系统将进一步提升个性化服务、数据安全和协作能力,成为企业发展的关键驱动力。
|
3月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
98 3
|
7天前
|
监控 运维
HTTPS 证书自动化运维:https证书管理系统- 自动化监控
本文介绍如何设置和查看域名或证书监控。步骤1:根据证书状态选择新增域名或证书监控,线上部署推荐域名监控,未部署选择证书监控。步骤2:查询监控记录详情。步骤3:在详情页查看每日定时检测结果或手动测试。
HTTPS 证书自动化运维:https证书管理系统- 自动化监控
|
7天前
|
Linux 持续交付 调度
HTTPS 证书自动化运维:https证书管理系统-自动化部署
本指南介绍如何部署Linux服务器节点。首先复制生成的Linux脚本命令,然后将其粘贴到目标服务器上运行。接着刷新页面查看节点记录,并点击“配置证书”选择证书以自动部署。最后,节点部署完成,后续将自动调度,无需人工干预。
HTTPS 证书自动化运维:https证书管理系统-自动化部署
|
4月前
|
机器学习/深度学习 运维 Prometheus
构建高效运维体系:从自动化部署到智能监控的全方位实践
在当今数字化时代,企业对运维效率和稳定性的要求越来越高。本文将探讨如何构建一个高效的运维体系,从自动化部署、持续集成与持续交付(CI/CD)、智能监控、故障管理以及数据驱动决策等方面进行深入分析和实践指导。通过这些方法,企业可以实现更快速、更可靠的软件发布和问题解决,提升整体运营效率。
|
7天前
|
运维 监控 数据安全/隐私保护
HTTPS 证书自动化运维:HTTPS 证书管理系统之使用指南
本文详细介绍【灵燕空间HTTPS证书管理系统】(https://www.lingyanspace.com)的配置与使用,涵盖注册账户、邮箱配置及证书自动签发、监控和部署的一体化指南。通过页面顶部菜单的【视频教程】和【图文教程】,帮助用户从注册到实际应用全面掌握系统操作。最新迭代后,泛域名证书已包含根域名,无需额外申请多域名证书。
|
7天前
|
运维 监控 安全
HTTPS 证书自动化运维:HTTPS 证书管理系统之优势对比
本文详细介绍了一款功能强大的HTTPS证书管理系统,涵盖自动签发、更新、实时监控、部署一体化、自定义加密算法、集中管理和邮箱通知等功能。系统通过简化配置、智能引导、快速响应和多重防护等优势,确保企业和个人用户能高效、安全地管理证书,提升网站和应用的安全性。
|
1月前
|
人工智能 自然语言处理 JavaScript
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
Agent-E 是一个基于 AutoGen 代理框架构建的智能自动化系统,专注于浏览器内的自动化操作。它能够执行多种复杂任务,如填写表单、搜索和排序电商产品、定位网页内容等,从而提高在线效率,减少重复劳动。本文将详细介绍 Agent-E 的功能、技术原理以及如何运行该系统。
136 5
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
|
1月前
|
缓存 监控 安全
公司电脑监控软件的 Gradle 构建自动化优势
在数字化办公环境中,公司电脑监控软件面临代码更新频繁、依赖管理和构建复杂等挑战。Gradle 构建自动化工具以其强大的依赖管理、灵活的构建脚本定制及高效的构建缓存与增量构建特性,显著提升了软件开发效率和质量,支持软件的持续更新与优化,满足企业对员工电脑使用情况的监控与管理需求。
43 3
|
2月前
|
监控 Devops jenkins
自动化部署与监控:打造高效的DevOps流程
【10月更文挑战第24天】在追求快速迭代和持续交付的软件开发时代,DevOps成为提升团队效率的关键。本文深入探讨如何构建一个高效的DevOps流程,包括自动化部署、监控和故障排除等关键环节。通过实际案例,我们将学习如何利用工具简化运维任务,确保系统稳定运行,并快速响应生产问题。
114 2