许昌学院校园网服务大厅模拟登录

声明

本程序为技术学习交流使用,请勿以任何形式做非法的事情.

做这个的起因

之前做教务系统中途被绊住了,然后就很久做不出来,为了找回信心,就又找了个更简单的页面去登录,然后就试了试这个服务大厅,发现果然很简单

这个很简单,有想法的同学可以做一个校园服务平台,具体的接口怎么抓的,相信大部分人都会的,我也不再赘述,如果实在不会可以看我另外一个校园教务系统的爬虫,这个笔那个简单,没有什么复杂的不过用到了一个js加密的文件,需要自己再网站里面下载下来

登录页面
登录成功页面
在这里插入图片描述

思路

在页面里获取登录需要的参数,然后引入网页的encrypt.js加密的文件,通过python的js解析器运行加密函数加密登录密码,然后通过session.post()把参数提交给服务器登录,通过查询返回信息里面的关键词判断是否登陆成功.登陆成功后即可查询信息.

程序

下面是代码:

#查询信息接口http://ehall.xcu.edu.cn/jsonp/userDesktopInfo.json
import requests
#正则库
import re
#调用js文件加密所用的库
import execjs

#登录接口
def login(sess, uname, pwd):
    #登录接口
    login_url = 'https://authserver.xcu.edu.cn/authserver/login?service=http://ehall.xcu.edu.cn/login?service=http://ehall.xcu.edu.cn/new/index.html'
    #访问网页获取加密所需数据
    get_login = sess.get(login_url)
    #设置访问信息的编码为utf-8
    get_login.encoding = 'utf-8'
    #提取出来登录参数   lt,salt,execution
    lt = re.search('name="lt" value="(.*?)"', get_login.text).group(1)
    salt = re.search('id="pwdDefaultEncryptSalt" value="(.*?)"', get_login.text).group(1)
    execution = re.search('name="execution" value="(.*?)"', get_login.text).group(1)
    #打开js加密库读入加密文件
    f = open("encrypt.js", 'r', encoding='UTF-8')
    js = f.read()
    #将js字符串导入到js解析器
    ctx = execjs.compile(js)
    f.close()
    #使用js函数进行加密
    password = ctx.call('_ep', pwd, salt)
    #post信息
    personal_info = {
        'username': uname,
        'password': password,
        'lt': lt,
        'dllt': 'userNamePasswordLogin',
        'execution': execution,
        '_eventId': 'submit',
        'rmShown': '1'
    }
    #使用post登录
    post_login = sess.post(login_url, personal_info)
    #设置数据编码格式
    post_login.encoding = 'utf-8'
    #判断是否登录成功
    if re.search("信息", post_login.text):
        print("SUCCESS!")
    else:
        print("FAILED!")
    pass
    #访问一下信息接口
    stuInfor = sess.get('http://ehall.xcu.edu.cn/jsonp/userDesktopInfo.json')
    print(stuInfor.text)
pass
    

#主函数
def main():
    username = '学号'
    password = '密码'
    #创建一个session会话
    sess = requests.session()
    login(sess, username, password)
    #访问完毕关闭会话
    sess.close()
pass


if __name__ == '__main__':
    main()
pass

代码还有待改进,有不足之处希望各位大佬能给指出完善

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YY博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值