前言:
本程序可实现对已给出题库的网页知识答题活动能够自动给出答案功能,由于写程序的时候马上就快要到考试时间了,所以写的有点仓促,后续可完善的地方还有很多,不过这个简陋版的能用就行。
本程序的使用步骤是只需鼠标选择一下题目的文本,程序就会自动给出答案。
程序原理:
程序的实现原理是使用pynput中的监听鼠标函数,只要当鼠标按下时的坐标不等于松开时的坐标即可判断出鼠标完成框选了,接着使用pyperclip库(获取剪切板)与pyautogui库(用于模拟ctrl+c)判断鼠标完成框选后,模拟ctrl+c键把题目文本复制到剪切板中,再通过读取剪切板完成对题目文本的读取,接着使用python-docx库现将docx格式的题库导入,然后进行比对,使其输出对应的答案即可。
程序源码:
需要导入的库:
from docx import Document
import pyperclip
from pynput.mouse import Listener
from pynput import keyboard
import pyautogui
import win32clipboard as w
#全局变量
drag_flag = True # 判断双击
mouse_press = (0,0) # 鼠标释放的坐标
mouse_release =(0,0) # 鼠标按下的坐标
如果没有对应的库,就用pip install xxx下载一下即可
鼠标监听功能:
def on_click(x, y, button, pressed):
# 监听鼠标点击
global drag_flag,mouse_press,mouse_release
if drag_flag:
drag_flag = False
else:
drag_flag = True
if pressed:
mouse_press = (x, y)
else:
mouse_release = (x, y)
if drag_flag:
if mouse_press != mouse_release: # 按下和抬起的坐标不相等
#鼠标拖动事件
w.EmptyClipboard
pyautogui.hotkey('ctrl','c')
recent_txt = pyperclip.paste() # 获取剪切板
w.EmptyClipboard
#print(recent_txt)
findanswer(recent_txt) # 执行翻译函数
else:
pass
# 鼠标点击事件
比对与输出功能:
def find(file_path, content):
docx = Document(file_path)
print(content)
found = False
count = 0
for para in docx.paragraphs:
if content in para.text:
print(f"Found '{content}' in paragraph:")
print(para.text)
found = True
count = 0 # 重置计数器,因为我们刚刚找到了一个匹配的段落
elif found:
print(para.text) # 打印接下来的段落
count += 1
if count >= 8: # 如果已经打印了四个段落,停止打印
print("***********") # 空行,以便在输出中分隔不同的段落
break
def findanswer(content):
find("C:\\Users\\z\\Desktop\\python homework\\zxb.docx",content)
注意使用的时候要把题库的地址导入到find函数中,最好设置一个文件夹,把题库与程序放一起然后用vscode打开文件夹。
主函数:
def main():
with Listener(on_click=on_click) as listener:
listener.join()
if __name__ == '__main__':
main()
运行例子:
鼠标选中一段文本后,答案直接输出在vscode中
以后的改进方向
在实际使用时发现,有的答题网页是禁止鼠标选择且禁止复制的,这个时候我一般有两种办法,第一种是浏览器那三个点里找“开发者选项”,有个按钮叫“在页面中选中一个元素以进行检查”点击按钮后点击题目所在位置,开发者工具中就会有题目对应的网页元素,在网页元素中题目就可以选择了。另一种方法是点击打印按钮,在打印界面可以进行复制与选择了。
所以以后的改进方向可以是:
自动读取题目对应的网页元素,实现自动读取题目的功能。
设置鼠标的坐标,以实现鼠标自动答题,自动读取选择按钮的间隔然后自动计算点击位置。
答案显示界面可以设定为显示在页面最上层,这样就不用切屏来看答案了。
总程序:
from docx import Document
import pyperclip
from pynput.mouse import Listener
from pynput import keyboard
import pyautogui
import win32clipboard as w
#全局变量
drag_flag = True # 判断双击
mouse_press = (0,0) # 鼠标释放的坐标
mouse_release =(0,0) # 鼠标按下的坐标
def find(file_path, content):
docx = Document(file_path)
print(content)
found = False
count = 0
for para in docx.paragraphs:
if content in para.text:
print(f"Found '{content}' in paragraph:")
print(para.text)
found = True
count = 0 # 重置计数器,因为我们刚刚找到了一个匹配的段落
elif found:
print(para.text) # 打印接下来的段落
count += 1
if count >= 8: # 如果已经打印了四个段落,停止打印
print("***********") # 空行,以便在输出中分隔不同的段落
break
def findanswer(content):
find("C:\\Users\\z\\Desktop\\python homework\\zxb.docx",content)
# 监听鼠标
def on_click(x, y, button, pressed):
# 监听鼠标点击
global drag_flag,mouse_press,mouse_release
if drag_flag:
drag_flag = False
else:
drag_flag = True
if pressed:
mouse_press = (x, y)
else:
mouse_release = (x, y)
if drag_flag:
if mouse_press != mouse_release: # 按下和抬起的坐标不相等
#鼠标拖动事件
w.EmptyClipboard
pyautogui.hotkey('ctrl','c')
recent_txt = pyperclip.paste() # 获取剪切板
w.EmptyClipboard
#print(recent_txt)
findanswer(recent_txt) # 执行翻译函数
else:
pass
# 鼠标点击事件
def main():
with Listener(on_click=on_click) as listener:
listener.join()
if __name__ == '__main__':
main()
标签:鼠标,答题,python,作弊,content,flag,print,import,mouse
From: https://blog.csdn.net/shiwen233/article/details/139707079