【python】爬取带CAS教务处信息

起因

一切的一切都要从一个安卓程序说起,我心血来潮想要做一个“易用”的移动端教务处,设计好了实体类,界面等等,突然发现!我没法直接在安卓里爬取出教务处的数据。内心一万只草泥马狂奔而过。
看到对于安卓,我实在没实力在java层面爬取出数据,于是我开始转战python,谁知道这才一个大坑的开始。

知识

1、CAS

CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。

在最开始,我以为无非就是去教务处,模拟个header,post一下我的账号和密码就好了。但谁曾想!学校已经不是当年那个天真的她,在校外想要进入学校内网,都要先过cas中央认证一遍,这就给我造成了很多的坑,她在认证的时候不停的重定向。cookie的内容甚至不是下一个request说需要的。
我会告诉你!在其中一个request的history中,找出了一段cookie和另一个cookie拼接起来进行下一个访问才成功了吗?!!

CAS实现单点登录 好文
https://blog.csdn.net/heyeqingquan/article/details/89885286

过程

1、cas认证+疯狂重定向
图片加载失败,cas页面
/cas/login.js里看到了他的加密算法,是MD5 不得不说,这有点点不行啊,现在彩虹表分分钟干爆你。
在这里插入图片描述
fiddler一顿查,发现了cas页面post所需要的所有内容,其中的lt藏在页面中,直接提前出来就好。
然后就是加密 ,发送post请求。但这里cas有两次重定向。要用第二次重定向的cookie(history) 那里面才能拿到webvpn-key,webvpn-name,这样post才能被接受进入智强的假页面。。。

2、智强假页面

为什么说是智强的假页面呢…因为发现智强原本的账号密码登录已经被弃用了,是根据cas的中央认证得到的cookie直接可以进去。但是他废弃还不废弃完,弃掉了一半,如果直接用cas的webvpn-key,webvpn-name走重定向的链接,会少一个cookie,你先要模拟智强本身的登录获取到辣个可爱的cookie塞进你的伪装cookie内,再访问重定向的链接。不然他就会给你倒回cas中央认证去,这都是什么坑,真的神奇。

实际上这才算进入教务处的页面,真正的数据还一点没找到呢!(哭)

代码如下,已经对大学去敏感化了(其实没啥用hhhh),但就这样吧,算是提醒自己。

import requests
from bs4 import BeautifulSoup
import hashlib
import time


# 获取请求参数中的lt
def getLT():
    lt_url = 'https://jwcnew.webvpn.xxxx.edu.cn/xxxxdx_jsxsd/'
    resp1 = requests.get(lt_url, verify=False)
    soup1 = BeautifulSoup(resp1.text, 'lxml').find_all('input')
    for s in soup1:
        if s.attrs['name'] == 'lt':
            print("############################")
            print("lt" + s.attrs['value'])
            print("############################")
            return s.attrs['value']


# 对密码进行MD5加密
def md5(pd_str):
    m = hashlib.md5(password.encode("utf-8"))
    return m.hexdigest()


# 获取登录教务处ticket
def getTicket(html_text):
    soup = BeautifulSoup(html_text, 'lxml').find('a')
    # print(soup.attrs['href'])
    return soup.attrs['href']


url = 'https://cas.webvpn.xxxx.edu.cn/cas/login'
payload = {'encodedService': 'https%3A%2F%2Fwebvpn.xxxx.edu.cn%2fusers%2fauth%2fcas%2fcallback%3furl',
           'service': 'https://webvpn.xxxx.edu.cn/users/auth/cas/callback?url',
           'serviceName': 'null',
           'loginErrCnt': '0',
           'username': '',
           'password': '',
           'lt': ''}

username = '201xxxxx17'
password = 'xxxxxxxxxx'

payload['username'] = username
payload['password'] = md5(password)
payload['lt'] = getLT()
print("Let me sleep for 2 seconds,zzzzZZZ")
time.sleep(2)
print("Was a nice sleep, now let me continue...")

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

# 获取选课页面的cookie,后面的选课请求都会在header中设置cookie,没有cookie将无法登陆选课页面和选课操作
# 学校的cas会重定向两次 要用第二次重定向的cookie 那里面才有vpn-key
nextreq = requests.get(url_ticket, verify=False)
cookie_need = str(nextreq.history[1].headers.get('Set-Cookie'))
print(cookie_need)

# 进入智强教务处界面
cas_select_class_url = "https://jwcnew.webvpn.xxx.edu.cn/xxxxdx_jsxsd/"
headers = {'Cookie': cookie_need}
jwc_html = requests.get(cas_select_class_url, headers=headers, verify=False)
print("####进入智强教务处界面#######")
print(jwc_html.text.find('title'))
print("############################")

# 遍历重组出新的cookie
be_re_cookies1 = jwc_html.cookies.items()
be_re_cookies = nextreq.history[1].cookies.items()

re_cookie = ''
for name, value in be_re_cookies:
    if name == "_astraeus_session":
        continue
    else:
        re_cookie += '{0}={1};'.format(name, value)
for name, value in be_re_cookies1:
    re_cookie += '{0}={1};'.format(name, value)
print("########重组后cookie########")
print(re_cookie)
print("############################")
# 登录智强教务处 吐槽一波 竟然没加密 不过想着有cas 的确无所谓了吧
# 需要 cookie有 UM_distinctid _webvpn_key webvpn_username JSESSIONID 四个
newheader = {'Cookie': re_cookie}
PostData = {'USERNAME': username, 'PASSWORD': password}
Login_post = requests.post("https://jwcnew.webvpn.xxxx.edu.cn/xxxxdx_jsxsd/xk/LoginToXk", data=PostData,
                           headers=newheader, verify=False)
time.sleep(1)
login_get = requests.get('https://jwcnew.webvpn.xxxx.edu.cn/xxxxdx_jsxsd/framework/xsMain.jsp', headers=newheader,
                         verify=False)
# print(Login_post.text)
print(login_get.text)
# 成功进入教务处

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值