声明
本程序为技术学习交流使用,请勿以任何形式做非法的事情.
做这个的起因
之前做教务系统中途被绊住了,然后就很久做不出来,为了找回信心,就又找了个更简单的页面去登录,然后就试了试这个服务大厅,发现果然很简单
这个很简单,有想法的同学可以做一个校园服务平台,具体的接口怎么抓的,相信大部分人都会的,我也不再赘述,如果实在不会可以看我另外一个校园教务系统的爬虫,这个笔那个简单,没有什么复杂的不过用到了一个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
代码还有待改进,有不足之处希望各位大佬能给指出完善