爬取強智科技教務系統 制作qq微信推送課表 以九江職業技術學院教務系統為例


序言

本片文章講解爬取強智科技教務系統平台

因只能以本校為例,侵刪請聯系 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("\[(.*?)\]節&lt;", 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("課程名稱:(.*?)&lt;br/&gt;", 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填入對應代碼位置即可

 

再次聲明,如果學校在意請聯系我刪除

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM