序言
本片文章講解爬取強智科技教務系統平台
因只能以本校為例,侵刪請聯系 nepenthic@163.com
僅供學習參考
正文
如果你有心抓取強智科技的教務系統登入頁面,你會發現輸入完賬號密碼會把表單參數加密發送到登入校驗頁
通過查看網頁源代碼我們可以一路追溯到加密方法
因為我寫這篇文章時候教務系統已經崩了,請求502,所以不講解如何追溯的
加密方法其實是base64加密
使用python的base64庫能直接轉換,下面的轉換方法
1 def strToBase64(s): 2 strEncode = base64.b64encode(s.encode('utf8')) 3 return str(strEncode, encoding='utf8')
得到加密數據,我們提交給login頁
1 def get_class(name, passwd): 2 encoded = strToBase64(name) + '%%%' + strToBase64(passwd) # 自己在線轉換base4 name+%%%+passwd 3 param = { # 提交的表單 4 'userAccount': name, 5 'userPassword': passwd, 6 'encoded': encoded # base64加密后的字符串 7 } 8 head = { # 請求頭 9 "rq": rq, 10 "Cookie": "application/x-www-form-urlencoded; charset=UTF-8", 11 "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", 12 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36", 13 "Referer": "https://www.baidu.com/", 14 "accept-encoding": "gzip, deflate, br", 15 "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", 16 "cache-control": "max-age=0", 17 "Connection": "keep-alive", 18 "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" 19 } 20 session = requests.session() # 使用session保持在線 21 jsess = session.post(url="http://jiaowu.jvtc.jx.cn/jsxsd/xk/LoginToXk", params=param, headers=head) # 發送請求
29 param2 = { # 獲得課表jsp頁面的表單 30 "Referer": "http://jiaowu.jvtc.jx.cn/jsxsd/framework/xsMain_new.jsp?t1=1", # 來自主頁面的跳轉 31 "rq": rq 32 } 33 r = session.post("http://jiaowu.jvtc.jx.cn/jsxsd/framework/main_index_loadkb.jsp", params=param2) # 提交課表時間請求,返回本周課表
34 soundCode = r.text 35 # all=session.post('http://jiaowu.jvtc.jx.cn/jsxsd/xskb/xskb_list.do') #全課表,真心分析不動
上面代碼中,21行把加密賬號密碼post給登入頁面,33行請求了課表的jsp頁面,打印34行就是你的課表頁面
下面我直接上傳整個代碼(包含了qq及wx的推送功能)
# -*- codeing = utf-8 -*- # @TIME : 2021/5/15 3:56 # @Auther : 幼稚鬼(Naive) # @what are you to do? : 九江職業技術學院xxxxxx班課表推送 import base64 import linecache import os import re import requests from bs4 import BeautifulSoup import pytz import datetime import pandas as pd from pandas import DataFrame pytz.country_timezones('cn') tz = pytz.timezone('Asia/Shanghai') #保持時區+8 rq = str(datetime.datetime.now(tz).strftime('%Y-%m-%d')) xq = str(datetime.datetime.now(tz).isoweekday()) xq = int(xq) cn = "" # 星期幾 if xq == 7: cn = "星期日" elif xq == 1: cn = "星期一" elif xq == 2: cn = "星期二" elif xq == 3: cn = "星期三" elif xq == 4: cn = "星期四" elif xq == 5: cn = "星期五" elif xq == 6: cn = "星期六" def strToBase64(s): strEncode = base64.b64encode(s.encode('utf8')) return str(strEncode, encoding='utf8') def get_class(name, passwd): encoded = strToBase64(name) + '%%%' + strToBase64(passwd) # 自己在線轉換base4 name+%%%+passwd param = { # 提交的表單 'userAccount': name, 'userPassword': passwd, 'encoded': encoded # base64加密后的字符串 } head = { # 請求頭 "rq": rq, "Cookie": "application/x-www-form-urlencoded; charset=UTF-8", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36", "Referer": "https://www.baidu.com/", "accept-encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", "cache-control": "max-age=0", "Connection": "keep-alive", "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" } session = requests.session() # 使用session保持在線 jsess = session.post(url="http://jiaowu.jvtc.jx.cn/jsxsd/xk/LoginToXk", params=param, headers=head) # 發送請求 if jsess.status_code == 200: # 驗證是否鏈接成功 print("鏈接成功!") else: print("鏈接失敗!") calls("\n有內鬼,停止交易!\n\n服務器都炸了你還在這里吟詩作對,切") wx("\n有內鬼,停止交易!\n\n服務器都炸了你還在這里吟詩作對,切") planB() param2 = { # 獲得課表jsp頁面的表單 "Referer": "http://jiaowu.jvtc.jx.cn/jsxsd/framework/xsMain_new.jsp?t1=1", # 來自主頁面的跳轉 "rq": rq } r = session.post("http://jiaowu.jvtc.jx.cn/jsxsd/framework/main_index_loadkb.jsp", params=param2) # 提交課表時間請求,返回本周課表 soundCode = r.text # all=session.post('http://jiaowu.jvtc.jx.cn/jsxsd/xskb/xskb_list.do') #全課表,真心分析不動 findall(soundCode) def findall(soundCode): demand = BeautifulSoup(soundCode, 'lxml') if len(demand.select('title')) != 0: if str(demand.title.string) == '登錄': # str(demand.title.string)驗證是否還在登入頁面,因為強智系統還是出問題 若還在則結束推送 print("鏈接成功,當依然在登入頁面!") calls("\n有內鬼,停止交易!\n\n服務器都炸了你還在這里吟詩作對,切切") wx("\n有內鬼,停止交易!\n\n服務器都炸了你還在這里吟詩作對,切切") planB() else: print("len(demand.select('title')) != 0 的未知錯誤,請處理!") calls("\n有內鬼,停止交易!\n\n服務器都炸了你還在這里吟詩作對,切切切") wx("\n有內鬼,停止交易!\n\n服務器都炸了你還在這里吟詩作對,切切切") planB() else: print("進入主頁成功,等待加載 * * * * * * ") week = re.findall('上課時間:第(.*?)周 星期', str(soundCode))[0] fo = open("log.txt", "w+") # log.txt 第一行記載本周周數與最后更新時間 fo.write(week + "\n" + rq) fo.close() axq = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'] answer = [['星期一', []], ['星期二', []], ['星期三', []], ['星期四', []], ['星期五', []], ['星期六', []], ['星期日', []]] list = demand.select('p') # 本周有的課都在<p>標簽里 answerindex = 0 for i in axq: for li in list: string1 = str(li) stringclass = '' if string1.find(i) != -1: # 查看p.string是否包含今天的星期數cn namestart = re.findall("\[(.*?)\]節<", string1) # 匹配第幾節 j = str(namestart[0]) if j == '01-02': j = "第一大節" elif j == '03-04': j = "第二大節" elif j == '05-06': j = "第三大節" elif j == '07-08': j = "第四大節" elif j == '09-10': j = "第五大節" elif j == '11-12': j = "第六大節" stringclass += j namestart = re.findall("課程名稱:(.*?)<br/>", string1) # 匹配課程名稱 stringclass += "\n" + namestart[0] namestart = re.findall("上課地點:(.*?)\">", string1) # 匹配上課地點 stringclass += "\n" + namestart[0] if stringclass != '': answer[answerindex][1].append(stringclass) # 把一節課的數據存入answer answerindex += 1 # print(answer) msg(answer) answer[6][1].append(None) answer[6][1].append(None) answer[6][1].append(None) answer[6][1].append(None) answer[6][1].append(None) answer[6][1].append(None) toexcl(answer, week) def msg(answer): # 遍歷answer進行QQ推送 if len(answer[int(xq) - 1][1]) == 0: # 無課判斷 print("休息日 無課\n\n業精於勤,荒於嬉;行成於思,毀於隨——韓愈") calls("\n休息日 無課\n\n業精於勤,荒於嬉;行成於思,毀於隨——韓愈") wx("\n休息日 無課\n\n業精於勤,荒於嬉;行成於思,毀於隨——韓愈") else: lifeline = "" for i in answer[int(xq) - 1][1]: lifeline += '\n' + str(i) + '\n' print(lifeline) wx(lifeline) calls(lifeline) # 到這開始存csv def calls(strs): # qq推送 print("qq:",strs) listqq = [推送的QQ] for i in listqq: qqone = 'https://qmsg.zendee.cn/send/ qmsg醬的key ?msg=' + strs + '&qq=' + i requests.get(qqone) print("QQ推送成功") def wx(strs): # 微信企業推送 # print("wx:", strs) urlwxqy = "https://sctapi.ftqq.com/ server醬的key .send" parmwxqy = { 'title': rq + ' ' + cn, 'desp': strs, } requests.post(url=urlwxqy, params=parmwxqy) print("企業微信推送成功") def planB(): print("開始執行方案B") week = linecache.getline(r'log.txt', 1) if len(week) == 3: week = week[0:2] elif len(week) == 2: week = week[0:1] lastdate = linecache.getline(r'log.txt', 2)[0:10] path = r'xxxx班第{}周課表.xlsx'.format(week) if os.path.exists(path): pass else: path = r'xxxx班第{}周課表.xlsx'.format(int(week) - 1) if os.path.exists(path): pass else: strs = "\n無歷史課表\n\n生而為人,我很抱歉\n" print(strs) calls(strs) wx(strs) exit(0) pdarry = pd.read_excel(r'xxxx第{}周課表.xlsx'.format(week)) list1 = pdarry[xq].values strs = '\n執行方案B\n數據來源:{}\n\n'.format(lastdate) for i in list1: if str(i) == '蕪湖': i = '' strs += str(i) if strs == '\n執行方案B\n數據來源:{}\n\n'.format(lastdate): strs += "休息日 無課\n\n業精於勤,荒於嬉;行成於思,毀於隨——韓愈\n" strs += "\n\n歷史課表,僅供參考!!!" print(strs) calls(strs) wx(strs) print("執行方案B成功") exit(0) def toexcl(anwser, week): # 存csv print("開始執行存xlsx") data = [anwser[0][1], anwser[1][1], anwser[2][1], anwser[3][1], anwser[4][1], anwser[5][1], anwser[6][1]] pdarrays = DataFrame(data, index=[1, 2, 3, 4, 5, 6, 7], columns=['第一大節', '第二大節', '第三大節', '第四大節', '第五大節', '第六大節'], dtype=str) pdarrays2 = pdarrays.fillna('蕪湖') # 查找空數據 pdarrays3 = pdarrays2.T # 行列數據轉置 pdarrays3.to_excel(r'xxxx班第{}周課表.xlsx'.format(week)) print("存入xlsx成功")if __name__ == '__main__': get_class('賬號', '密碼')
代碼有些臃腫,但能運行就沒再精益求精了
需要注意的是param請求的時間格式是 2021-05-05 這樣子的
其中的qq和wx推送方式自行注冊 QQ推送 : qmsg醬 微信推送 : server醬 獲得key填入對應代碼位置即可
再次聲明,如果學校在意請聯系我刪除