You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
7.7 KiB
228 lines
7.7 KiB
1 year ago
|
from selenium.webdriver import Chrome
|
||
|
from selenium.webdriver.common.by import By
|
||
|
from selenium.webdriver.chrome.options import Options
|
||
|
import time
|
||
|
import csv
|
||
|
import difflib
|
||
|
from lxml import etree
|
||
|
import tkinter as tk
|
||
|
def close_window():
|
||
|
root.destroy()
|
||
|
|
||
|
root = tk.Tk()
|
||
|
root.title("欢迎")
|
||
|
|
||
|
# 设置窗口内容为 "欢迎使用本程序"
|
||
|
label1 = tk.Label(root, text="湖南大学实验室安全考试自动答题程序", font=('Arial', 16))
|
||
|
label1.pack(pady=10)
|
||
|
|
||
|
label2 = tk.Label(root, text="请确认使用校园网和Chrome浏览器", font=('Arial', 14))
|
||
|
label2.pack(pady=10)
|
||
|
|
||
|
label3 = tk.Label(root, text="Created By: JesterHey", font=('Arial', 14))
|
||
|
label3.pack(pady=5)
|
||
|
|
||
|
label4 = tk.Label(root, text="针对湖大物电院优化题库", font=('Arial', 14))
|
||
|
label4.pack(pady=10)
|
||
|
|
||
|
# 设置窗口大小并使其居中
|
||
|
window_width = 400
|
||
|
window_height = 200
|
||
|
screen_width = root.winfo_screenwidth()
|
||
|
screen_height = root.winfo_screenheight()
|
||
|
x_pos = (screen_width / 2) - (window_width / 2)
|
||
|
y_pos = (screen_height / 2) - (window_height / 2)
|
||
|
root.geometry(f"{window_width}x{window_height}+{int(x_pos)}+{int(y_pos)}")
|
||
|
|
||
|
# 设置5秒后自动关闭窗口
|
||
|
root.after(5000, close_window)
|
||
|
|
||
|
root.mainloop()
|
||
|
|
||
|
|
||
|
# 初始化用户名、密码和选择为空字符串
|
||
|
username = ""
|
||
|
password = ""
|
||
|
choice = ""
|
||
|
|
||
|
def get_input(event=None):
|
||
|
global username, password, choice
|
||
|
username = username_entry.get()
|
||
|
password = password_entry.get()
|
||
|
choice = choice_entry.get()
|
||
|
root.destroy() # 关闭窗口
|
||
|
|
||
|
root = tk.Tk()
|
||
|
root.title("登录窗口")
|
||
|
|
||
|
# 设置窗口大小并使其居中
|
||
|
window_width = 400
|
||
|
window_height = 400
|
||
|
screen_width = root.winfo_screenwidth()
|
||
|
screen_height = root.winfo_screenheight()
|
||
|
x_pos = (screen_width / 2) - (window_width / 2)
|
||
|
y_pos = (screen_height / 2) - (window_height / 2)
|
||
|
root.geometry(f"{window_width}x{window_height}+{int(x_pos)}+{int(y_pos)}")
|
||
|
|
||
|
# 创建用户名标签和输入框
|
||
|
tk.Label(root, text="学号").pack(pady=10)
|
||
|
username_entry = tk.Entry(root)
|
||
|
username_entry.pack(pady=10)
|
||
|
username_entry.bind('<Return>', get_input)
|
||
|
|
||
|
# 创建密码标签和输入框
|
||
|
tk.Label(root, text="个人门户密码").pack(pady=10)
|
||
|
password_entry = tk.Entry(root,show='*')
|
||
|
password_entry.pack(pady=10)
|
||
|
password_entry.bind('<Return>', get_input)
|
||
|
|
||
|
# 创建选择模式标签和输入框
|
||
|
tk.Label(root, text="Enter 1 (模拟考) or 2 (正式考):").pack(pady=10)
|
||
|
choice_entry = tk.Entry(root)
|
||
|
choice_entry.pack(pady=10)
|
||
|
choice_entry.bind('<Return>', get_input)
|
||
|
|
||
|
# 创建按钮来获取输入
|
||
|
tk.Button(root, text="提交", command=get_input).pack(pady=20)
|
||
|
|
||
|
root.mainloop()
|
||
|
|
||
|
opt= Options()
|
||
|
opt.add_experimental_option("detach", True)
|
||
|
def find_similar_values(value_to_search,page=0,filename='quizbase.csv',threshold=0.9): #设置匹配度阈值
|
||
|
results = []
|
||
|
|
||
|
value_to_search = value_to_search.replace('?', '\\?')
|
||
|
value_to_search = value_to_search.replace('(', '\\(')
|
||
|
value_to_search = value_to_search.replace(')', '\\)')
|
||
|
|
||
|
|
||
|
with open(filename, 'r',encoding='utf8') as f:
|
||
|
reader = csv.reader(f)
|
||
|
|
||
|
for row in reader:
|
||
|
similarity = difflib.SequenceMatcher(None, row[0], value_to_search).ratio()
|
||
|
if similarity >= threshold:
|
||
|
results.append(row[1])
|
||
|
|
||
|
if results == []:
|
||
|
return results
|
||
|
elif page<=4:
|
||
|
l1=[]
|
||
|
for i in results:
|
||
|
if i == '正确' or i =='错误':
|
||
|
l1.append(i)
|
||
|
return l1
|
||
|
else:
|
||
|
l1=[]
|
||
|
for item in results:
|
||
|
if item in 'ABCD':
|
||
|
l1.append(item)
|
||
|
return l1
|
||
|
return results
|
||
|
safari = Chrome(options=opt)
|
||
|
url = 'https://labsafe.hnu.edu.cn/labexam/index.php'
|
||
|
safari.get(url)
|
||
|
time.sleep(1)
|
||
|
el = safari.find_element(By.XPATH,'//*[@id="formExam"]/div/a/input')
|
||
|
el.click()
|
||
|
|
||
|
safari.find_element(By.XPATH,'//*[@id="username"]').send_keys(username)
|
||
|
time.sleep(1)
|
||
|
safari.find_element(By.XPATH,'//*[@id="password"]').send_keys(password)
|
||
|
time.sleep(1)
|
||
|
safari.find_element(By.XPATH,'//*[@id="dl"]').click()
|
||
|
time.sleep(1)
|
||
|
safari.find_element(By.XPATH,'//*[@id="article"]/div[3]/div[2]/ul/a[1]/li').click()
|
||
|
time.sleep(1)
|
||
|
safari.find_element(By.XPATH,'//*[@id="tkqcl"]/ul/li/label').click()
|
||
|
time.sleep(1)
|
||
|
choice = int(choice)
|
||
|
safari.find_element(By.XPATH,f'//*[@id="article"]/div[4]/div[2]/div/a[{choice}]').click()
|
||
|
time.sleep(1)
|
||
|
def clickanswer(l:list,page,index):
|
||
|
if l == []:
|
||
|
print('no answer')
|
||
|
elif l[0] == '错误' or l[0] == 'A':
|
||
|
_id = 'ti_'+ str(page*10+index) + '_0'
|
||
|
safari.find_element(By.ID,_id).click()
|
||
|
elif l[0] == '正确' or l[0] == 'B':
|
||
|
_id = 'ti_'+ str(page*10+index) + '_1'
|
||
|
safari.find_element(By.ID,_id).click()
|
||
|
elif l[0] == 'C':
|
||
|
_id = 'ti_'+ str(page*10+index) + '_2'
|
||
|
safari.find_element(By.ID,_id).click()
|
||
|
elif l[0] == 'D':
|
||
|
_id = 'ti_'+ str(page*10+index) + '_3'
|
||
|
safari.find_element(By.ID,_id).click()
|
||
|
pass
|
||
|
# def findanswer(s:str,answersource):
|
||
|
# s = s.split('、')[1]
|
||
|
# s = s.replace('?', '\\?')
|
||
|
# s = s.replace('(', '\\(')
|
||
|
# s = s.replace(')', '\\)')
|
||
|
# s = s + '.*?你未作答标准答案:(?P<answer>.*?)</div>'
|
||
|
# pattern = re.compile(s)
|
||
|
# answer = re.findall(pattern, answersource)
|
||
|
# return answer
|
||
|
for page in range(10): #i是页码
|
||
|
if page == 0:
|
||
|
answerlist=[]
|
||
|
page_source = safari.page_source
|
||
|
htmltxt = etree.HTML(page_source)
|
||
|
for tihao in range(1,11):
|
||
|
qtxt = htmltxt.xpath(f'//*[@id="dati"]/div[{tihao}]/h3/text()')[0].split('、',1)[-1]
|
||
|
answer = find_similar_values(value_to_search=qtxt,page=page)
|
||
|
answerlist.append(answer)
|
||
|
co=1
|
||
|
while co<=10:
|
||
|
clickanswer(answerlist[co-1],page,co)
|
||
|
co+=1
|
||
|
# <input type="radio" name="ti_91" id="ti_91_1" value="B">
|
||
|
# count = 0
|
||
|
# for i in answerlist:
|
||
|
# if i == []:
|
||
|
# count+=1
|
||
|
# print(answerlist,end=' ')
|
||
|
# print(f'有{count}个题目未匹配到答案')
|
||
|
safari.find_element(By.XPATH,'//*[@id="dati"]/div[11]/input[1]').click()
|
||
|
time.sleep(1)
|
||
|
elif 1<=page<9:
|
||
|
answerlist=[]
|
||
|
page_source = safari.page_source
|
||
|
htmltxt = etree.HTML(page_source)
|
||
|
for tihao in range(1,11):
|
||
|
qtxt = htmltxt.xpath(f'//*[@id="dati"]/div[{tihao}]/h3/text()')[0].split('、',1)[-1]
|
||
|
answer = find_similar_values(page=page,value_to_search=qtxt)
|
||
|
answerlist.append(answer)
|
||
|
co = 1
|
||
|
while co <= 10:
|
||
|
clickanswer(answerlist[co - 1], page, co)
|
||
|
co += 1
|
||
|
# count = 0
|
||
|
# for i in answerlist:
|
||
|
# if i == []:
|
||
|
# count+=1
|
||
|
# print(answerlist,end=' ')
|
||
|
# print(f'有{count}个题目未匹配到答案')
|
||
|
safari.find_element(By.XPATH,'//*[@id="dati"]/div[11]/input[2]').click()
|
||
|
time.sleep(1)
|
||
|
else:
|
||
|
answerlist = []
|
||
|
page_source = safari.page_source
|
||
|
htmltxt = etree.HTML(page_source)
|
||
|
for tihao in range(1,11):
|
||
|
qtxt = htmltxt.xpath(f'//*[@id="dati"]/div[{tihao}]/h3/text()')[0].split('、',1)[-1]
|
||
|
answer = find_similar_values(value_to_search=qtxt,page=page)
|
||
|
answerlist.append(answer)
|
||
|
co = 1
|
||
|
while co <= 10:
|
||
|
clickanswer(answerlist[co - 1], page, co)
|
||
|
co += 1
|
||
|
# # <input type="radio" name="ti_91" id="ti_91_1" value="B">
|
||
|
# count = 0
|
||
|
# for i in answerlist:
|
||
|
# if i == []:
|
||
|
# count+=1
|
||
|
# print(answerlist,end=' ')
|
||
|
# print(f'有{count}个题目未匹配到答案')
|