杭电选课脚本(一)登录选课系统

又到了学期末,选课的时间到了,中国的大学系统你懂得,卡,每次到了抢课时间,总是又卡又慢,半天刷不出来一个网站,如何写一个脚本,到了抢课时间运行一下,可以省时省力。这一篇只是伪登陆,后续的选课不知道能不能分析出来

步骤

  • 伪登陆数字杭电
  • 登陆选课系统
  • 获取sessionId

详细

如果懒的看一步步的话,可以直接拉到底看代码

  • 第一步伪登陆数字杭电

杭电选课脚本(一)登录选课系统_第1张图片
打开chrome检查窗口,捕捉登陆
在from data中有以下几个请求参数
encodedService’: ‘http://i.hdu.edu.cn/dcp/index.jsp‘,
‘service’: ‘http://jxgl.hdu.edu.cn/default.aspx‘,
‘serviceName’: ”,
‘loginErrCnt’: ‘0’,
‘username’: ”,
‘password’: ”,
‘lt’: ”

  其中username就是学号,password是加密后的密码,lt是实时刷新,目的是要你首先必须用网页登陆,然而可以先获取登陆页面抓取lt值,service就是我们要登陆进去的选课页面

 这里面主要就是要看看password是如何加密的,在检查台会上会发现login网络请求是由login.js脚本发起,那么接下来就看看这个脚本内容:

其中找到这样一个函数:
    function submitInfo() {
        //瀵瑰瘑鐮佽繘琛宮d5鍔犲瘑
        SetUserNameCookies();
        if(document.getElementById("password").value.length!=32&&document.getElementById("password").value!="") {
            document.getElementById("password").value=hex_md5(document.getElementById("password").value);
        }
        document.forms["login_form"].submit();
    }

document.getElementById(“password”).value=hex_md5(document.getElementById(“password”).value);

看上去好像是md5加密,于是我用的账号密码md5加密了一下,发现和检查台上密码的加密后字符串一致,所以是md5无疑。

那么参数已经完成了,请求后返回的text如下:







CAS认证转向




 



如果实在浏览器上登录,那么返回的这个页面会自动跳转到http://jxgl.hdu.edu.cn/default.aspx?ticket=ST-6851071-Kz4bvVrhqKPfh6pFivDs

但是我们是伪登陆,那继续去访问这个页面,通过request发起get请求,发现我们已经到了数字杭电页面,那么第一步就已经完成。

  • 登录选课系统

登录上数字杭电然后点击选课系统,发现就是一个固定的URL ,并没有什么参数,如果没有登录数字杭电去直接访问选课系统就会又调到登录页面,那么我们刚刚第一步在登陆上数字杭电的同时,肯定设置了什么token,cookie什么的,在检查台仔细查看登录选课系统的请求header中发现了一个cookie,而这个cookie就是我们登录数字杭电成功后设置的,那么我们可以在上面登录玩数字杭电获取cookie值,然后再登录选课系统

cookie值的格式如下:ASP.NET_SessionId=1rxqzzyizfp02d45us3pbjb3; path=/; HttpOnly, route=acc407ccf2cd41551684a22ae27321f5;Path=/

获取cookie,再在请求选课的URL中设置cookie,就可以跳转到选课页面

  • 获取sessionId
    在上一步就获取到了cookie值,里面就有了sessionId等信息,这些信息在后续的查看课程,选择课程都需要加在header中。

程序源代码(python3.5,macOs10.12)

import requests
import hashlib
from lxml import etree


def md5(str):
    m = hashlib.md5(str.encode("utf-8"))
    return m.hexdigest()


# 获取请求参数中的lt
def getLT():
    lt_url = 'http://cas.hdu.edu.cn/cas/login?service=http%3A%2F%2Fi.hdu.edu.cn%2Fdcp%2Findex.jsp'
    r = requests.get(lt_url)
    html_text = r.text
    html_tree = etree.HTML(html_text)
    return html_tree.xpath('//*[@id="login_form"]/div/div[1]/input[2]')[0].get('value')


def getTicket(html_text):
    html_tree = etree.HTML(html_text)
    return html_tree.xpath('/html/body/noscript/p/a')[0].get('href')


url = 'http://cas.hdu.edu.cn/cas/login'
payload = {'encodedService': 'http://i.hdu.edu.cn/dcp/index.jsp',
           'service': 'http://jxgl.hdu.edu.cn/default.aspx',
           'serviceName': '',
           'loginErrCnt': '0',
           'username': '',
           'password': '',
           'lt': ''}

username = '15031243'
password = ''

payload['username'] = username
payload['password'] = md5(password)
# 在登陆首页抓取lt
payload['lt'] = getLT()

# 获取登陆ticket
r = requests.post(url, data=payload)
url_ticket = getTicket(r.text)

# 获取选课页面的cookie,后面的选课请求都会在header中设置cookie,没有cookie将无法登陆选课页面和选课操作
next = requests.get(url_ticket)
cookie = str(next.headers.get('Set-Cookie'))
print(cookie)
cas_select_class_url = 'http://jxgl.hdu.edu.cn/xs_main.aspx?xh=' + username
headers = {'Cookie': cookie}
select_html = requests.get(cas_select_class_url, headers=headers)

select = 'http://jxgl.hdu.edu.cn/zylb.aspx?xh=15031243&nj=2015'

你可能感兴趣的:(Python,hdu)