小白一枚,自己閒來無事,就想搞個自動批量查詢四級成績的程序,經過不懈努力最終成功,將經驗分享,大家共同進步,如有紕漏或可改進地方,望大佬指正,不勝感激
正文:
先上網址:http://www.neea.edu.cn/cet
乍一看,似乎是個很簡單的網站,搞起來應該比較輕鬆,實際操作起來,卻發現果然還是有些碰壁
這次我用的庫是requests庫,然後創建一個session()對象進行請求,這種做法對cookie的操作上來說要方便些
先來常規操作,填入准考證和姓名,抓個包,發現帶cookie,what?啥時候出來的cookie?我是隱私窗口打開的,肯定不是以前的cookie,那就很明顯了,這個cookie應該是這個網頁剛加載的時候在某個請求時設置的,那麼我們從頭再來
重新抓包,經過觀察,發現在load.js的時候就帶有cookie了,我們觀察cookie:
Hm_lvt_dc1d69ab90346d48ee02f18510292577=1535592621;
Hm_lpvt_dc1d69ab90346d48ee02f18510292577=1535592621
這個15開頭的10位數很眼熟吧,一看就是訪問時間的時間戳,經過測試,也確實是這樣
獲得時間戳的代碼如下:
這下我們再回到填考生信息的時候,點擊驗證碼框的時候會有這麼一個請求,返回信息裏面就是驗證碼圖片鏈接,這個驗證碼不是加載了現畫的那種,是一個驗證碼對應一張圖片提前存放好的,那就簡單了,訪問圖片地址拿到圖片數據,識別就完事兒了,請求裏面還有個set-cookie,由於用的session對象訪問,這個就不需要我們自己管了。值得一提的是,請求地址裏面最後的t參數應該很明顯吧,就是一個隨機數。
驗證碼識別方面,我用的第三方,一個驗證碼不到一分錢,方便快捷準確,附上地址:http://www.ruokuai.com/,自己對接
好了這下啥都搞定了,可以查詢了
這最後一步就簡單了,一個簡單的post,帶上之前的cookies,準考號,姓名,識別到的驗證碼,就可以獲取返回結果,自己解析一下就可以得到成績
總體來說,也沒啥特別難的地方,六級查詢應該也一樣的道理,舉一反三,只是分享一下個人經驗
附總的源碼:
import requests as req
import datetime
import random
#testUrl = 'http://httpbin.org/get'
import rk
import time
import threading
def getCtime(number,name,class1):
s = req.session()
url1 = 'http://www.neea.edu.cn/html1/report/17101/6429-1.htm'
headers1 = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
rep = s.get(url1, headers=headers1)
list1 = rep.headers['Date']
year = list1[12:16]
month = list1[8:11]
day = list1[5:7]
hour = str(int(list1[17:19]) - 4)
min = list1[20:22]
sec = list1[23:25]
str1 = month + ' ' + day + ', ' + year + ' ' + hour + ':' + min + ':' + sec + ' PM'
ctime = int(datetime.datetime.strptime(str1, '%b %d, %Y %I:%M:%S %p').timestamp())
getCode(s,ctime,number,name,class1)
def getCode(s,ctime,number,name,class1):
n = random.random()
url2 = 'http://cache.neea.edu.cn/Imgs.do?c=CET&ik='+str(number)+'&t=' + str(n)
headers2 = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
'Connection': 'keep-alive',
'Cache-Control': 'no-cache',
'Pragma': 'no-cache',
'Referer': 'http://cet.neea.edu.cn/cet/'
}
s.cookies.set('Hm_lvt_dc1d69ab90346d48ee02f18510292577', str(ctime))
s.cookies.set('Hm_lpvt_dc1d69ab90346d48ee02f18510292577', str(ctime))
s.cookies.set('language', '1')
response = s.get(url2, headers=headers2).text
codeImage = response[13:-3]
image = req.get(codeImage).content
R = rk.RClient('你的若快賬戶','你的若快密碼')
result = R.rk_create(image,3040)
getGrade(s,headers2,result,number,name,class1)
def getGrade(s,headers2,code,number,name,class1):
url3 = 'http://cache.neea.edu.cn/cet/query'
data1 = {
'data': 'CET4_181_DANGCI,'+str(number)+','+name,
'v': code
}
headers3 = headers2
response = s.post(url3,headers = headers3,data = data1)
result = response.text
index = result.index('s:')
relResult = result[index+2:index+8]
if float(relResult) >= 425:
with open('D:/Pass.txt','a') as f1:
f1.write(name+'----'+class1+'----'+relResult+'\n')
else:
with open('D:/notPass.txt','a') as f2:
f2.write(name+'----'+class1+'----'+relResult+'\n')
s.close()
if __name__ == '__main__':
with open('D:/cet4.txt','r') as f:
for i in f.readlines():
number = i[0:15]
name = i[19:22]
if '-' in name:
name = i[19:21]
last = i.rfind('-')
class1 = i[last+1:-1]
print(number,name,class1)
try:
getCtime(number, name, class1)
except Exception:
continue
time.sleep(0.2)
f.close()
附封裝好的若快包:
#!/usr/bin/env python
# coding:utf-8
import requests
from hashlib import md5
class RClient(object):
def __init__(self, username, password, soft_id = 1, soft_key = 'b40ffbee5c1cf4e38028c197eb2fc751'):
self.username = username
self.password = md5(password.encode()).hexdigest()
self.soft_id = soft_id
self.soft_key = soft_key
self.base_params = {
'username': self.username,
'password': self.password,
'softid': self.soft_id,
'softkey': self.soft_key,
}
self.headers = {
'Connection': 'Keep-Alive',
'Expect': '100-continue',
'User-Agent': 'ben',
}
def rk_create(self, im, im_type, timeout=60):
"""
im: 圖片字節
im_type: 題目類型
"""
params = {
'typeid': im_type,
'timeout': timeout,
}
params.update(self.base_params)
files = {'image': ('a.jpg', im)}
r = requests.post('http://api.ruokuai.com/create.json', data=params, files=files, headers=self.headers)
result = r.json()
return result['Result']
def rk_report_error(self, im_id):
"""
im_id:報錯題目的ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://api.ruokuai.com/reporterror.json', data=params, headers=self.headers)
return r.json()