正方教务系统成绩爬取(仅个人)+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同学可以私聊我 这个可能是加密的部分,可以打个断点
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;
} bags 发表于 2020-7-7 00:03
看到大佬的百科全书奖章不敢说话
我这百科是以前弄的,和编程一点也无关
藏起来的小尾巴,不让你看! 感觉是不是因为每次都是深更半夜发帖,都没人看{:301_973:} 人间惨案{:301_999:} tql,献上我的膝盖,py+js
藏起来的小尾巴,不让你看! luanshils 发表于 2020-7-7 00:01
tql,献上我的膝盖,py+js
看到大佬的百科全书奖章不敢说话 luanshils 发表于 2020-7-7 00:15
我这百科是以前弄的,和编程一点也无关
啊哈哈哈,感谢评分,cb终于又破百了{:301_999:} 好家伙,这个教务处不用验证码的吗,我的教务处还得识别验证码。cookie有效期只有20分钟{:301_999:} bags 发表于 2020-7-6 23:50
感觉是不是因为每次都是深更半夜发帖,都没人看
大佬,我得抱着你单膝跪地{:300_961:} 本帖最后由 luanshils 于 2020-7-7 01:08 编辑
到时候抽个时间看看运行
藏起来的小尾巴,不让你看!