bags 发表于 2020-7-6 23:45

正方教务系统成绩爬取(仅个人)+tk可视化

本帖最后由 bags 于 2020-7-6 23:54 编辑

查了一下资料,应该是新版的正方教务系统,如果不是请略过。。。
代码比较乱,比较烂。。。有兴趣的同学可以一起探讨优化下
特点:
1.tk可视化,操作简单
2.有两个线程,避免死循环时程序假死
3.出成绩发邮件通知
不足:
1.登录教务系统是密码通过js进行加密,因能力问题无法整合到py中,只能进行整个调用
2.程序运行过程中无法最小化至系统托盘
程序编译后的样图:

因为各校教务系统不一样,就不提供成品,以下是python源码和爬下来的js文件(在py中命名为js.js)
import tkinter as tk
from tkinter import ttk
import requests,json,execjs,os,smtplib,time,threading
from lxml import etree
from email.mime.text import MIMEText
from email.header import Header

class PyWinDesign:
    def __init__(self, 启动窗口):
      self.启动窗口 = 启动窗口
      self.启动窗口.title('fjut期末成绩查询(循环爬取)——by浅山藏')
      self.启动窗口.resizable(width=False, height=False)
      screenwidth = self.启动窗口.winfo_screenwidth()
      screenheight = self.启动窗口.winfo_screenheight()
      size = '%dx%d+%d+%d' % (448, 452, (screenwidth - 448) / 2, (screenheight - 452) / 2)
      self.启动窗口.geometry(size)
      
      self.标签1_标题 = tk.StringVar()
      self.标签1_标题.set('账号')
      self.标签1 = tk.Label(self.启动窗口,textvariable=self.标签1_标题,anchor=tk.W)
      self.标签1.place(x=20,y=16,width=35,height=30)
      
      self.标签2_标题 = tk.StringVar()
      self.标签2_标题.set('密码')
      self.标签2 = tk.Label(self.启动窗口,textvariable=self.标签2_标题,anchor=tk.W)
      self.标签2.place(x=20,y=56,width=35,height=30)
      
      self.标签3_标题 = tk.StringVar()
      self.标签3_标题.set('邮箱')
      self.标签3 = tk.Label(self.启动窗口,textvariable=self.标签3_标题,anchor=tk.W)
      self.标签3.place(x=20,y=96,width=35,height=30)
      
      self.编辑框1 = tk.Text(self.启动窗口,wrap=tk.NONE)
      self.编辑框1.insert(tk.END,'')
      self.编辑框1.place(x=75,y=20,width=300,height=25)
      
      self.编辑框2_标题 = tk.StringVar()
      self.编辑框2 =tk.Entry(self.启动窗口, textvariable=self.编辑框2_标题, show='*')
      self.编辑框2.place(x=75,y=60,width=300,height=25)
      
      self.编辑框3 = tk.Text(self.启动窗口,wrap=tk.NONE)
      self.编辑框3.insert(tk.END,'')
      self.编辑框3.place(x=75,y=96,width=300,height=25)
      
      self.按钮1_标题 = tk.StringVar()
      self.按钮1_标题.set('查询')
      self.按钮1 = tk.Button(self.启动窗口,textvariable=self.按钮1_标题,command=self.按钮1_被鼠标左键单击)
      self.按钮1.place(x=168,y=139,width=112,height=43)
      
      self.编辑框4_滚动条_纵 = tk.Scrollbar(self.启动窗口)
      self.编辑框4_滚动条_纵.place(x=415,y=191,width=18,height=227)
      self.编辑框4 = tk.Text(self.启动窗口,yscrollcommand=self.编辑框4_滚动条_纵.set,wrap=tk.WORD)
      self.编辑框4_滚动条_纵.config(command=self.编辑框4.yview)
      self.编辑框4.insert(tk.END,'')
      self.编辑框4.place(x=23,y=191,width=392,height=227)
      #此处是通过讯飞及时告知版本失效或需要更新
      url = 'http://www.iyuji.cn/iyuji/s/anZ1T2k2UG9Hak1FdHhmalZ5YmpiUT09/1593880983627694'
      req = requests.get(url).text
      html = etree.HTML(req)
      txts = html.xpath('//*[@class="vp_text"]/p')
      ti = ''
      for txt in txts:
            txt = txt.xpath('.//text()')
            ti = ti + txt + '\n'
      self.编辑框4.insert(tk.END,ti)
      self.编辑框4.insert(tk.END,'\n')
      #此次检验key文件是否存在,存在则自动填写
      if os.path.exists('key.txt'):
            f = open('key.txt','r')   
            user = f.readline()
            password = f.readline()
            QQ = f.readline()
            self.编辑框1.insert(tk.END,user)
            self.编辑框2.insert(tk.END,password)
            self.编辑框3.insert(tk.END,QQ)
            f.close()
      else:
            pass

    def 按钮1_被鼠标左键单击(self):
      #启动A线程
      t1=A()
      t1.start()


class A(threading.Thread):
    def __init__(self):
      threading.Thread.__init__(self)
    def run(self):
      while True:
            try:
                #获取编辑框账号密码邮箱并写入文件
                user = app.编辑框1.get('0.0','end')
                password = app.编辑框2.get()
                QQ = app.编辑框3.get('0.0','end')
                user = user.replace('\n','')
                password = password.replace('\n','')
                QQ = QQ.replace('\n','')
                f = open('key.txt','w',encoding='utf-8')   
                f.write(user+'\r'+password+'\r'+QQ)
                f.close()

                #获取webvpn界面的ktoken
                session = requests.session()
                url = 'https://webvpn.****.edu.cn/users/sign_in'
                headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.69 Safari/537.36',
                'Cookie': 'SERVERID=Server1; _webvpn_key=; webvpn_username=; _astraeus_session=cGoxeC9FRlZzSjlORVpFemh0RDRwd2dQeDRzaUp2K0Y2VkU2VWNlTzgyVUJKRWdEYkJPUGVMSGM4QVN6U0FiajN3MGNyVGtXTkhaL0RoT3JhSDBxN1ZTRTlQa1JpS2dab1A0UmgwZ2UzQVQxUmxLbm5Ra0l0N2lSTzRTcVAycjB5SjhGRUV0LzZPcHQzU0RrK3FZUVNiaWhQemNlcE8zVDFlUTNHYnBwV3lRRFlzbmxBcjlsallyMzF0MFR6cmtPcHZlUFJqMnJqelhocHQrRXl4bUJEZz09LS1PVDJBK2F2NEYzQ0I3SEdXczE4TlBBPT0%3D--0df58374967ad0e53ec583a54d7dcc32c848500c'
                }
                r1 = session.get('https://webvpn.****.edu.cn/users/sign_in',headers=headers).text
                html = etree.HTML(r1)
                token = html.xpath('/html/body/div/div/div/form/input/@value')
               
                #登录webvpn
                headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.69 Safari/537.36',
                'Cookie': 'SERVERID=Server1; _webvpn_key=; webvpn_username=; _astraeus_session=cGoxeC9FRlZzSjlORVpFemh0RDRwd2dQeDRzaUp2K0Y2VkU2VWNlTzgyVUJKRWdEYkJPUGVMSGM4QVN6U0FiajN3MGNyVGtXTkhaL0RoT3JhSDBxN1ZTRTlQa1JpS2dab1A0UmgwZ2UzQVQxUmxLbm5Ra0l0N2lSTzRTcVAycjB5SjhGRUV0LzZPcHQzU0RrK3FZUVNiaWhQemNlcE8zVDFlUTNHYnBwV3lRRFlzbmxBcjlsallyMzF0MFR6cmtPcHZlUFJqMnJqelhocHQrRXl4bUJEZz09LS1PVDJBK2F2NEYzQ0I3SEdXczE4TlBBPT0%3D--0df58374967ad0e53ec583a54d7dcc32c848500c'
                }
                data = {
                'utf8': '✓',
                'authenticity_token': token,
                'user': user,
                'user': password,
                'user': 'unknown',
                'commit': '登录 Login'
                }
                r2 = session.post('https://webvpn.****.edu.cn/users/sign_in',headers=headers,data=data)
                #登录教务系统
                url = 'https://nids-443.webvpn.****.edu.cn/authserver/login?service=https%3A%2F%2Fjwxt-443.webvpn.****.edu.cn%2Fsso%2Fjziotlogin'
                headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.69 Safari/537.36',}
                r3 = session.get(url,headers=headers).text
                html = etree.HTML(r3)
                pwdDefaultEncryptSalt= html.xpath('//*[@id="pwdDefaultEncryptSalt"]/@value')
                lk = html.xpath('//*[@id="casLoginForm"]/input/@value')
                execution = html.xpath('//*[@id="casLoginForm"]/input/@value')
                f = open("js.js", "r")
                js = f.read()            # 读取js文件
                js = execjs.compile(js)# 编译执行js代码
                password_new = js.call('_etd2',password,pwdDefaultEncryptSalt )
                password_new = str(password_new)
                data = {
                'username': user,
                'password': password_new,
                'lt':lk,
                'dllt': 'userNamePasswordLogin',
                'execution': execution,
                '_eventId': 'submit',
                'rmShown': '1'
                }
                headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.69 Safari/537.36'}
                r4 = session.post(url,headers=headers,data=data)
                #打开成绩查询界面
                url = 'https://jwxt-443.webvpn.****.edu.cn/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005'
                headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.69 Safari/537.36'}
                data = {
                'xnm':'2019',
                'xqm':'12',
                'queryModel.showCount': '20'
                }
                r5 = session.post(url,data=data,headers=headers).json()
                xm = r5['items']['xm']
                path = xm+'.txt'
                #检验本地成绩文件是否存在并于爬取到的成绩进行对比
                if os.path.exists(path):
                  n = int(r5['totalResult'])
                  f = open(path,'r+',encoding="utf-8")
                  lines = f.readlines()
                  cj_all = ''
                  for line in lines:
                        cj_all = cj_all+line
                  f.close()

                  for i in range(0,n):
                        kcmc = r5['items']['kcmc']
                        bfzcj = r5['items']['bfzcj']
                        cj = str(kcmc)+'    成绩:'+str(bfzcj) + '分 '
                        if cj+'\n' in lines:
                            app.编辑框4.insert(tk.END,'成绩未更新\n')
                            pass
                        else:
                            fo = open(path,'a',encoding="utf-8")
                            fo.write(cj+'\n')
                            fo.close()
                            new_cj = cj
                            cj_all = cj_all + new_cj
                            app.编辑框4.delete('1.0','end')
                            app.编辑框4.insert(tk.END,'出新成绩了!\n')
                            app.编辑框4.insert(tk.END,new_cj+'\n')
                           
                            #发送邮件
                            from_addr = ''                                                                  ########此处写入发送邮件的邮箱###########
                            password = ''                                                                         ##########此处写入该邮箱密钥#############
                            to_addr = QQ
                            smtp_server = 'smtp.qq.com'
                            msg = MIMEText(cj_all,'plain','utf-8')
                            # 邮件头信息
                            msg['From'] = Header(from_addr)
                            msg['To'] = Header(to_addr)
                            msg['Subject'] = Header('出新成绩啦: '+new_cj)
                            server=smtplib.SMTP_SSL(smtp_server)
                            server.connect(smtp_server,465)
                            # 登录发信邮箱
                            server.login(from_addr, password)
                            # 发送邮件
                            server.sendmail(from_addr, to_addr, msg.as_string())
                            # 关闭服务器
                            server.quit()
                            app.编辑框4.insert(tk.END,'邮件发送成功\n')
                  
                else:
                  app.编辑框4.delete('1.0','end')
                  f = open(path,'w',encoding="utf-8")
                  f.close()
                  n = int(r5['totalResult'])
                  f = open(path,'r+',encoding="utf-8")
                  for i in range(0,n):
                        kcmc = r5['items']['kcmc']
                        bfzcj = r5['items']['bfzcj']
                        cj = str(kcmc)+'    成绩:'+str(bfzcj) + '分 '
                        app.编辑框4.insert(tk.END,cj+'\n')
                        fo = open(path,'a+',encoding="utf-8")
                        fo.write(cj+'\n')
                        fo.close()
                  app.编辑框4.insert(tk.END,'未检测到本地成绩信息,已创建文件\n')
                time.sleep(300)
            except:
                app.编辑框4.delete('1.0','end')
                app.编辑框4.insert(tk.END,'查询成绩失败,原因未知,如首次报错请检查账号密码及邮箱是否正确,如运行过程中报错,请尝试重启,还是报错。。。请等待修复——by.浅山藏')
            
if __name__ == '__main__':
    root = tk.Tk()
    app = PyWinDesign(root)
    root.mainloop()



JS 文件:
var CryptoJS = CryptoJS || function (u, p) {
    var d = {},
      l = d.lib = {},
      s = function () {},
      t = l.Base = {
            extend: function (a) {
                s.prototype = this;
                var c = new s;
                a && c.mixIn(a);
                c.hasOwnProperty("init") || (c.init = function () {
                  c.$super.init.apply(this, arguments)
                });
                c.init.prototype = c;
                c.$super = this;
                return c
            }, create: function () {
                var a = this.extend();
                a.init.apply(a, arguments);
                return a
            }, init: function () {}, mixIn: function (a) {
                for (var c in a) a.hasOwnProperty(c) && (this = a);
                a.hasOwnProperty("toString") && (this.toString = a.toString)
            }, clone: function () {
                return this.init.prototype.extend(this)
            }
      },
      r = l.WordArray = t.extend({
            init: function (a, c) {
                a = this.words = a || [];
                this.sigBytes = c != p ? c : 4 * a.length
            }, toString: function (a) {
                return (a || v).stringify(this)
            }, concat: function (a) {
                var c = this.words,
                  e = a.words,
                  j = this.sigBytes;
                a = a.sigBytes;
                this.clamp();
                if (j % 4)
                  for (var k = 0; k < a; k++) c |= (e >>> 24 - 8 * (k % 4) & 255) << 24 - 8 * ((j + k) % 4);
                else if (65535 < e.length)
                  for (k = 0; k < a; k += 4) c = e;
                else c.push.apply(c, e);
                this.sigBytes += a;
                return this
            }, clamp: function () {
                var a = this.words,
                  c = this.sigBytes;
                a &= 4294967295 <<
                  32 - 8 * (c % 4);
                a.length = u.ceil(c / 4)
            }, clone: function () {
                var a = t.clone.call(this);
                a.words = this.words.slice(0);
                return a
            }, random: function (a) {
                for (var c = [], e = 0; e < a; e += 4) c.push(4294967296 * u.random() | 0);
                return new r.init(c, a)
            }
      }),
      w = d.enc = {},
      v = w.Hex = {
            stringify: function (a) {
                var c = a.words;
                a = a.sigBytes;
                for (var e = [], j = 0; j < a; j++) {
                  var k = c >>> 24 - 8 * (j % 4) & 255;
                  e.push((k >>> 4).toString(16));
                  e.push((k & 15).toString(16))
                }
                return e.join("")
            }, parse: function (a) {
                for (var c = a.length, e = [], j = 0; j < c; j += 2) e |= parseInt(a.substr(j,
                  2), 16) << 24 - 4 * (j % 8);
                return new r.init(e, c / 2)
            }
      },
      b = w.Latin1 = {
            stringify: function (a) {
                var c = a.words;
                a = a.sigBytes;
                for (var e = [], j = 0; j < a; j++) e.push(String.fromCharCode(c >>> 24 - 8 * (j % 4) & 255));
                return e.join("")
            }, parse: function (a) {
                for (var c = a.length, e = [], j = 0; j < c; j++) e |= (a.charCodeAt(j) & 255) << 24 - 8 * (j % 4);
                return new r.init(e, c)
            }
      },
      x = w.Utf8 = {
            stringify: function (a) {
                try {
                  return decodeURIComponent(escape(b.stringify(a)))
                } catch (c) {
                  throw Error("Malformed UTF-8 data");
                }
            }, parse: function (a) {
                return b.parse(unescape(encodeURIComponent(a)))
            }
      },
      q = l.BufferedBlockAlgorithm = t.extend({
            reset: function () {
                this._data = new r.init;
                this._nDataBytes = 0
            }, _append: function (a) {
                "string" == typeof a && (a = x.parse(a));
                this._data.concat(a);
                this._nDataBytes += a.sigBytes
            }, _process: function (a) {
                var c = this._data,
                  e = c.words,
                  j = c.sigBytes,
                  k = this.blockSize,
                  b = j / (4 * k),
                  b = a ? u.ceil(b) : u.max((b | 0) - this._minBufferSize, 0);
                a = b * k;
                j = u.min(4 * a, j);
                if (a) {
                  for (var q = 0; q < a; q += k) this._doProcessBlock(e, q);
                  q = e.splice(0, a);
                  c.sigBytes -= j
                }
                return new r.init(q, j)
            }, clone: function () {
                var a = t.clone.call(this);
                a._data = this._data.clone();
                return a
            }, _minBufferSize: 0
      });
    l.Hasher = q.extend({
      cfg: t.extend(),
      init: function (a) {
            this.cfg = this.cfg.extend(a);
            this.reset()
      }, reset: function () {
            q.reset.call(this);
            this._doReset()
      }, update: function (a) {
            this._append(a);
            this._process();
            return this
      }, finalize: function (a) {
            a && this._append(a);
            return this._doFinalize()
      }, blockSize: 16,
      _createHelper: function (a) {
            return function (b, e) {
                return (new a.init(e)).finalize(b)
            }
      }, _createHmacHelper: function (a) {
            return function (b, e) {
                return (new n.HMAC.init(a,
                  e)).finalize(b)
            }
      }
    });
    var n = d.algo = {};
    return d
}(Math);
(function () {
    var u = CryptoJS,
      p = u.lib.WordArray;
    u.enc.Base64 = {
      stringify: function (d) {
            var l = d.words,
                p = d.sigBytes,
                t = this._map;
            d.clamp();
            d = [];
            for (var r = 0; r < p; r += 3)
                for (var w = (l >>> 24 - 8 * (r % 4) & 255) << 16 | (l >>> 24 - 8 * ((r + 1) % 4) & 255) << 8 | l >>> 24 - 8 * ((r + 2) % 4) & 255, v = 0; 4 > v && r + 0.75 * v < p; v++) d.push(t.charAt(w >>> 6 * (3 - v) & 63));
            if (l = t.charAt(64))
                for (; d.length % 4;) d.push(l);
            return d.join("")
      }, parse: function (d) {
            var l = d.length,
                s = this._map,
                t = s.charAt(64);
            t && (t = d.indexOf(t), -1 != t && (l = t));
            for (var t = [], r = 0, w = 0; w <
                l; w++)
                if (w % 4) {
                  var v = s.indexOf(d.charAt(w - 1)) << 2 * (w % 4),
                        b = s.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4);
                  t |= (v | b) << 24 - 8 * (r % 4);
                  r++
                }
            return p.create(t, r)
      }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    }
})();
(function (u) {
    function p(b, n, a, c, e, j, k) {
      b = b + (n & a | ~n & c) + e + k;
      return (b << j | b >>> 32 - j) + n
    }

    function d(b, n, a, c, e, j, k) {
      b = b + (n & c | a & ~c) + e + k;
      return (b << j | b >>> 32 - j) + n
    }

    function l(b, n, a, c, e, j, k) {
      b = b + (n ^ a ^ c) + e + k;
      return (b << j | b >>> 32 - j) + n
    }

    function s(b, n, a, c, e, j, k) {
      b = b + (a ^ (n | ~c)) + e + k;
      return (b << j | b >>> 32 - j) + n
    }
    for (var t = CryptoJS, r = t.lib, w = r.WordArray, v = r.Hasher, r = t.algo, b = [], x = 0; 64 > x; x++) b = 4294967296 * u.abs(u.sin(x + 1)) | 0;
    r = r.MD5 = v.extend({
      _doReset: function () {
                this._hash = new w.init()
            },
            _doProcessBlock: function (q, n) {
                for (var a = 0; 16 > a; a++) {
                  var c = n + a,
                        e = q;
                  q = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360
                }
                var a = this._hash.words,
                  c = q,
                  e = q,
                  j = q,
                  k = q,
                  z = q,
                  r = q,
                  t = q,
                  w = q,
                  v = q,
                  A = q,
                  B = q,
                  C = q,
                  u = q,
                  D = q,
                  E = q,
                  x = q,
                  f = a,
                  m = a,
                  g = a,
                  h = a,
                  f = p(f, m, g, h, c, 7, b),
                  h = p(h, f, m, g, e, 12, b),
                  g = p(g, h, f, m, j, 17, b),
                  m = p(m, g, h, f, k, 22, b),
                  f = p(f, m, g, h, z, 7, b),
                  h = p(h, f, m, g, r, 12, b),
                  g = p(g, h, f, m, t, 17, b),
                  m = p(m, g, h, f, w, 22, b),
                  f = p(f, m, g, h, v, 7, b),
                  h = p(h, f, m, g, A, 12, b),
                  g = p(g, h, f, m, B, 17, b),
                  m = p(m, g, h, f, C, 22, b),
                  f = p(f, m, g, h, u, 7, b),
                  h = p(h, f, m, g, D, 12, b),
                  g = p(g, h, f, m, E, 17, b),
                  m = p(m, g, h, f, x, 22, b),
                  f = d(f, m, g, h, e, 5, b),
                  h = d(h, f, m, g, t, 9, b),
                  g = d(g, h, f, m, C, 14, b),
                  m = d(m, g, h, f, c, 20, b),
                  f = d(f, m, g, h, r, 5, b),
                  h = d(h, f, m, g, B, 9, b),
                  g = d(g, h, f, m, x, 14, b),
                  m = d(m, g, h, f, z, 20, b),
                  f = d(f, m, g, h, A, 5, b),
                  h = d(h, f, m, g, E, 9, b),
                  g = d(g, h, f, m, k, 14, b),
                  m = d(m, g, h, f, v, 20, b),
                  f = d(f, m, g, h, D, 5, b),
                  h = d(h, f,
                        m, g, j, 9, b),
                  g = d(g, h, f, m, w, 14, b),
                  m = d(m, g, h, f, u, 20, b),
                  f = l(f, m, g, h, r, 4, b),
                  h = l(h, f, m, g, v, 11, b),
                  g = l(g, h, f, m, C, 16, b),
                  m = l(m, g, h, f, E, 23, b),
                  f = l(f, m, g, h, e, 4, b),
                  h = l(h, f, m, g, z, 11, b),
                  g = l(g, h, f, m, w, 16, b),
                  m = l(m, g, h, f, B, 23, b),
                  f = l(f, m, g, h, D, 4, b),
                  h = l(h, f, m, g, c, 11, b),
                  g = l(g, h, f, m, k, 16, b),
                  m = l(m, g, h, f, t, 23, b),
                  f = l(f, m, g, h, A, 4, b),
                  h = l(h, f, m, g, u, 11, b),
                  g = l(g, h, f, m, x, 16, b),
                  m = l(m, g, h, f, j, 23, b),
                  f = s(f, m, g, h, c, 6, b),
                  h = s(h, f, m, g, w, 10, b),
                  g = s(g, h, f, m,
                        E, 15, b),
                  m = s(m, g, h, f, r, 21, b),
                  f = s(f, m, g, h, u, 6, b),
                  h = s(h, f, m, g, k, 10, b),
                  g = s(g, h, f, m, B, 15, b),
                  m = s(m, g, h, f, e, 21, b),
                  f = s(f, m, g, h, v, 6, b),
                  h = s(h, f, m, g, x, 10, b),
                  g = s(g, h, f, m, t, 15, b),
                  m = s(m, g, h, f, D, 21, b),
                  f = s(f, m, g, h, z, 6, b),
                  h = s(h, f, m, g, C, 10, b),
                  g = s(g, h, f, m, j, 15, b),
                  m = s(m, g, h, f, A, 21, b);
                a = a + f | 0;
                a = a + m | 0;
                a = a + g | 0;
                a = a + h | 0
            }, _doFinalize: function () {
                var b = this._data,
                  n = b.words,
                  a = 8 * this._nDataBytes,
                  c = 8 * b.sigBytes;
                n |= 128 << 24 - c % 32;
                var e = u.floor(a /
                  4294967296);
                n[(c + 64 >>> 9 << 4) + 15] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360;
                n[(c + 64 >>> 9 << 4) + 14] = (a << 8 | a >>> 24) & 16711935 | (a << 24 | a >>> 8) & 4278255360;
                b.sigBytes = 4 * (n.length + 1);
                this._process();
                b = this._hash;
                n = b.words;
                for (a = 0; 4 > a; a++) c = n, n = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360;
                return b
            }, clone: function () {
                var b = v.clone.call(this);
                b._hash = this._hash.clone();
                return b
            }
    });
    t.MD5 = v._createHelper(r);
    t.HmacMD5 = v._createHmacHelper(r)
})(Math);
(function () {
    var u = CryptoJS,
      p = u.lib,
      d = p.Base,
      l = p.WordArray,
      p = u.algo,
      s = p.EvpKDF = d.extend({
            cfg: d.extend({
                keySize: 4,
                hasher: p.MD5,
                iterations: 1
            }),
            init: function (d) {
                this.cfg = this.cfg.extend(d)
            }, compute: function (d, r) {
                for (var p = this.cfg, s = p.hasher.create(), b = l.create(), u = b.words, q = p.keySize, p = p.iterations; u.length < q;) {
                  n && s.update(n);
                  var n = s.update(d).finalize(r);
                  s.reset();
                  for (var a = 1; a < p; a++) n = s.finalize(n), s.reset();
                  b.concat(n)
                }
                b.sigBytes = 4 * q;
                return b
            }
      });
    u.EvpKDF = function (d, l, p) {
      return s.create(p).compute(d,
            l)
    }
})();
CryptoJS.lib.Cipher || function (u) {
    var p = CryptoJS,
      d = p.lib,
      l = d.Base,
      s = d.WordArray,
      t = d.BufferedBlockAlgorithm,
      r = p.enc.Base64,
      w = p.algo.EvpKDF,
      v = d.Cipher = t.extend({
            cfg: l.extend(),
            createEncryptor: function (e, a) {
                  return this.create(this._ENC_XFORM_MODE, e, a)
                }, createDecryptor: function (e, a) {
                  return this.create(this._DEC_XFORM_MODE, e, a)
                }, init: function (e, a, b) {
                  this.cfg = this.cfg.extend(b);
                  this._xformMode = e;
                  this._key = a;
                  this.reset()
                }, reset: function () {
                  t.reset.call(this);
                  this._doReset()
                }, process: function (e) {
                  this._append(e);
                  return this._process()
                },
                finalize: function (e) {
                  e && this._append(e);
                  return this._doFinalize()
                }, keySize: 4,
            ivSize: 4,
            _ENC_XFORM_MODE: 1,
            _DEC_XFORM_MODE: 2,
            _createHelper: function (e) {
                return {
                  encrypt: function (b, k, d) {
                        return ("string" == typeof k ? c : a).encrypt(e, b, k, d)
                  }, decrypt: function (b, k, d) {
                        return ("string" == typeof k ? c : a).decrypt(e, b, k, d)
                  }
                }
            }
      });
    d.StreamCipher = v.extend({
      _doFinalize: function () {
            return this._process(!0)
      }, blockSize: 1
    });
    var b = p.mode = {},
      x = function (e, a, b) {
            var c = this._iv;
            c ? this._iv = u : c = this._prevBlock;
            for (var d = 0; d < b; d++) e ^=
                c
      },
      q = (d.BlockCipherMode = l.extend({
            createEncryptor: function (e, a) {
                return this.Encryptor.create(e, a)
            }, createDecryptor: function (e, a) {
                return this.Decryptor.create(e, a)
            }, init: function (e, a) {
                this._cipher = e;
                this._iv = a
            }
      })).extend();
    q.Encryptor = q.extend({
      processBlock: function (e, a) {
            var b = this._cipher,
                c = b.blockSize;
            x.call(this, e, a, c);
            b.encryptBlock(e, a);
            this._prevBlock = e.slice(a, a + c)
      }
    });
    q.Decryptor = q.extend({
      processBlock: function (e, a) {
            var b = this._cipher,
                c = b.blockSize,
                d = e.slice(a, a + c);
            b.decryptBlock(e, a);
            x.call(this,
                e, a, c);
            this._prevBlock = d
      }
    });
    b = b.CBC = q;
    q = (p.pad = {}).Pkcs7 = {
      pad: function (a, b) {
            for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, l = [], n = 0; n < c; n += 4) l.push(d);
            c = s.create(l, c);
            a.concat(c)
      }, unpad: function (a) {
            a.sigBytes -= a.words & 255
      }
    };
    d.BlockCipher = v.extend({
      cfg: v.cfg.extend({
            mode: b,
            padding: q
      }),
      reset: function () {
            v.reset.call(this);
            var a = this.cfg,
                b = a.iv,
                a = a.mode;
            if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor;
            else c = a.createDecryptor, this._minBufferSize = 1;
            this._mode = c.call(a,
                this, b && b.words)
      }, _doProcessBlock: function (a, b) {
            this._mode.processBlock(a, b)
      }, _doFinalize: function () {
            var a = this.cfg.padding;
            if (this._xformMode == this._ENC_XFORM_MODE) {
                a.pad(this._data, this.blockSize);
                var b = this._process(!0)
            } else b = this._process(!0), a.unpad(b);
            return b
      }, blockSize: 4
    });
    var n = d.CipherParams = l.extend({
            init: function (a) {
                this.mixIn(a)
            }, toString: function (a) {
                return (a || this.formatter).stringify(this)
            }
      }),
      b = (p.format = {}).OpenSSL = {
            stringify: function (a) {
                var b = a.ciphertext;
                a = a.salt;
                return (a ? s.create([1398893684,
                  1701076831
                ]).concat(a).concat(b) : b).toString(r)
            }, parse: function (a) {
                a = r.parse(a);
                var b = a.words;
                if (1398893684 == b && 1701076831 == b) {
                  var c = s.create(b.slice(2, 4));
                  b.splice(0, 4);
                  a.sigBytes -= 16
                }
                return n.create({
                  ciphertext: a,
                  salt: c
                })
            }
      },
      a = d.SerializableCipher = l.extend({
            cfg: l.extend({
                format: b
            }),
            encrypt: function (a, b, c, d) {
                  d = this.cfg.extend(d);
                  var l = a.createEncryptor(c, d);
                  b = l.finalize(b);
                  l = l.cfg;
                  return n.create({
                        ciphertext: b,
                        key: c,
                        iv: l.iv,
                        algorithm: a,
                        mode: l.mode,
                        padding: l.padding,
                        blockSize: a.blockSize,
                        formatter: d.format
                  })
                },
                decrypt: function (a, b, c, d) {
                  d = this.cfg.extend(d);
                  b = this._parse(b, d.format);
                  return a.createDecryptor(c, d).finalize(b.ciphertext)
                }, _parse: function (a, b) {
                  return "string" == typeof a ? b.parse(a, this) : a
                }
      }),
      p = (p.kdf = {}).OpenSSL = {
            execute: function (a, b, c, d) {
                d || (d = s.random(8));
                a = w.create({
                  keySize: b + c
                }).compute(a, d);
                c = s.create(a.words.slice(b), 4 * c);
                a.sigBytes = 4 * b;
                return n.create({
                  key: a,
                  iv: c,
                  salt: d
                })
            }
      },
      c = d.PasswordBasedCipher = a.extend({
            cfg: a.cfg.extend({
                kdf: p
            }),
            encrypt: function (b, c, d, l) {
                l = this.cfg.extend(l);
                d = l.kdf.execute(d,
                  b.keySize, b.ivSize);
                l.iv = d.iv;
                b = a.encrypt.call(this, b, c, d.key, l);
                b.mixIn(d);
                return b
            }, decrypt: function (b, c, d, l) {
                l = this.cfg.extend(l);
                c = this._parse(c, l.format);
                d = l.kdf.execute(d, b.keySize, b.ivSize, c.salt);
                l.iv = d.iv;
                return a.decrypt.call(this, b, c, d.key, l)
            }
      })
}();
(function () {
    for (var u = CryptoJS, p = u.lib.BlockCipher, d = u.algo, l = [], s = [], t = [], r = [], w = [], v = [], b = [], x = [], q = [], n = [], a = [], c = 0; 256 > c; c++) a = 128 > c ? c << 1 : c << 1 ^ 283;
    for (var e = 0, j = 0, c = 0; 256 > c; c++) {
      var k = j ^ j << 1 ^ j << 2 ^ j << 3 ^ j << 4,
            k = k >>> 8 ^ k & 255 ^ 99;
      l = k;
      s = e;
      var z = a,
            F = a,
            G = a,
            y = 257 * a ^ 16843008 * k;
      t = y << 24 | y >>> 8;
      r = y << 16 | y >>> 16;
      w = y << 8 | y >>> 24;
      v = y;
      y = 16843009 * G ^ 65537 * F ^ 257 * z ^ 16843008 * e;
      b = y << 24 | y >>> 8;
      x = y << 16 | y >>> 16;
      q = y << 8 | y >>> 24;
      n = y;
      e ? (e = z ^ a]], j ^= a]) : e = j = 1
    }
    var H = [0, 1, 2, 4, 8,
            16, 32, 64, 128, 27, 54
      ],
      d = d.AES = p.extend({
            _doReset: function () {
                for (var a = this._key, c = a.words, d = a.sigBytes / 4, a = 4 * ((this._nRounds = d + 6) + 1), e = this._keySchedule = [], j = 0; j < a; j++)
                  if (j < d) e = c;
                  else {
                        var k = e;
                        j % d ? 6 < d && 4 == j % d && (k = l << 24 | l << 16 | l << 8 | l) : (k = k << 8 | k >>> 24, k = l << 24 | l << 16 | l << 8 | l, k ^= H << 24);
                        e = e ^ k
                  }
                c = this._invKeySchedule = [];
                for (d = 0; d < a; d++) j = a - d, k = d % 4 ? e : e, c = 4 > d || 4 >= j ? k : b] ^ x] ^ q[l[k >>>
                  8 & 255]] ^ n]
            }, encryptBlock: function (a, b) {
                this._doCryptBlock(a, b, this._keySchedule, t, r, w, v, l)
            }, decryptBlock: function (a, c) {
                var d = a;
                a = a;
                a = d;
                this._doCryptBlock(a, c, this._invKeySchedule, b, x, q, n, s);
                d = a;
                a = a;
                a = d
            }, _doCryptBlock: function (a, b, c, d, e, j, l, f) {
                for (var m = this._nRounds, g = a ^ c, h = a ^ c, k = a ^ c, n = a ^ c, p = 4, r = 1; r < m; r++) var q = d ^ e ^ j ^ l ^ c,
                  s = d ^ e ^ j ^ l ^ c,
                  t =
                  d ^ e ^ j ^ l ^ c,
                  n = d ^ e ^ j ^ l ^ c,
                  g = q,
                  h = s,
                  k = t;
                q = (f << 24 | f << 16 | f << 8 | f) ^ c;
                s = (f << 24 | f << 16 | f << 8 | f) ^ c;
                t = (f << 24 | f << 16 | f << 8 | f) ^ c;
                n = (f << 24 | f << 16 | f << 8 | f) ^ c;
                a = q;
                a = s;
                a = t;
                a = n
            }, keySize: 8
      });
    u.AES = p._createHelper(d)
})();

function _gas(data, key0,
    iv0) {
    key0 = key0.replace(/(^\s+)|(\s+$)/g, "");
    var key = CryptoJS.enc.Utf8.parse(key0);
    var iv = CryptoJS.enc.Utf8.parse(iv0);
    var encrypted = CryptoJS.AES.encrypt(data, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();
}

function encryptAES(data, _p1) {
    if (!_p1) {
      return data;
    }
    var encrypted = _gas(_rds(64) + data, _p1, _rds(16));
    return encrypted;
}

function _ep(p0, p1) {
    try {
      return encryptAES(p0, p1);
    } catch (e) {}
    return p0;
}
var $_chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
var _chars_len = $_chars.length;

function _rds(len) {
    var retStr = '';
    for (i = 0; i < len; i++) {
      retStr += $_chars.charAt(Math.floor(Math.random() * _chars_len));
    }
    return retStr;
}

function _etd2(_p0, _p1) {
    var _p2 = encryptAES(_p0, _p1);
    return _p2
}

喜欢的童鞋可以给个评分,我的币快不够我逛论坛了{:301_973:}
PS.fjut同学可以私聊我

我是sss 发表于 2022-1-2 09:32

这个可能是加密的部分,可以打个断点

function _gas(data, key0,
    iv0) {
    key0 = key0.replace(/(^\s+)|(\s+$)/g, "");
    var key = CryptoJS.enc.Utf8.parse(key0);
    var iv = CryptoJS.enc.Utf8.parse(iv0);
    var encrypted = CryptoJS.AES.encrypt(data, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();
}

function encryptAES(data, _p1) {
    if (!_p1) {
      return data;
    }
    var encrypted = _gas(_rds(64) + data, _p1, _rds(16));
    return encrypted;
}

luanshils 发表于 2020-7-7 00:15

bags 发表于 2020-7-7 00:03
看到大佬的百科全书奖章不敢说话

我这百科是以前弄的,和编程一点也无关


                                        藏起来的小尾巴,不让你看!

bags 发表于 2020-7-6 23:50

感觉是不是因为每次都是深更半夜发帖,都没人看{:301_973:}

bags 发表于 2020-7-6 23:56

人间惨案{:301_999:}

luanshils 发表于 2020-7-7 00:01

tql,献上我的膝盖,py+js


                                        藏起来的小尾巴,不让你看!

bags 发表于 2020-7-7 00:03

luanshils 发表于 2020-7-7 00:01
tql,献上我的膝盖,py+js




看到大佬的百科全书奖章不敢说话

bags 发表于 2020-7-7 00:18

luanshils 发表于 2020-7-7 00:15
我这百科是以前弄的,和编程一点也无关




啊哈哈哈,感谢评分,cb终于又破百了{:301_999:}

xccxvb 发表于 2020-7-7 00:28

好家伙,这个教务处不用验证码的吗,我的教务处还得识别验证码。cookie有效期只有20分钟{:301_999:}

zhenqiao 发表于 2020-7-7 00:39

bags 发表于 2020-7-6 23:50
感觉是不是因为每次都是深更半夜发帖,都没人看

大佬,我得抱着你单膝跪地{:300_961:}

luanshils 发表于 2020-7-7 01:04

本帖最后由 luanshils 于 2020-7-7 01:08 编辑

到时候抽个时间看看运行


                                        藏起来的小尾巴,不让你看!
页: [1] 2 3 4 5
查看完整版本: 正方教务系统成绩爬取(仅个人)+tk可视化