python小程序——实现答题作弊

前言:

        本程序可实现对已给出题库的网页知识答题活动能够自动给出答案功能,由于写程序的时候马上就快要到考试时间了,所以写的有点仓促,后续可完善的地方还有很多,不过这个简陋版的能用就行。

        本程序的使用步骤是只需鼠标选择一下题目的文本,程序就会自动给出答案。

程序原理:

        程序的实现原理是使用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()

### 使用 Puppeteer 编写自动答题脚本 为了实现自动化操作浏览器并完成在线答题的任务,可以利用 Node.js 的 Puppeteer 库来模拟真实用户的交互行为。下面是一个简单的例子,展示如何通过 Puppeteer 实现登录网站、查找题目以及提交答案的过程。 #### 安装依赖库 首先需要安装 puppeteer 和其他必要的 npm 包: ```bash npm init -y npm install puppeteer ``` #### 创建项目文件结构 创建一个新的 JavaScript 文件 `autoAnswer.js` 来编写主要逻辑代码。 #### 初始化浏览器实例与页面对象 在 `autoAnswer.js` 中初始化 Puppeteer 并启动无头模式下的 Chromium 浏览器实例[^1]: ```javascript const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); })(); ``` 设置 `{headless:false}` 可以让开发者看到实际的操作过程以便调试;生产环境中通常会将其设为 true 以提高效率。 #### 访问目标网页并填写表单数据 接下来定义访问特定 URL 地址,并填充用户名密码字段进行登录验证(假设存在这样的输入框): ```javascript await page.goto('https://example.com/login'); await page.type('#username', 'yourUsername'); // 替换成真实的账号名 await page.type('#password', 'yourPassword'); // 替换成真实的密码 await Promise.all([ page.waitForNavigation(), page.click('.login-button') // 假定有一个类名为 .login-button 的按钮用于触发登录动作 ]); ``` 此处需要注意的是不同站点的具体 HTML 结构可能有所差异,因此需根据实际情况调整选择器路径。 #### 自动化处理问卷调查或测试题目的流程 一旦成功进入含有试题的页面,则可以通过遍历 DOM 节点获取所有问题及其选项列表,再按照一定策略随机选取或者基于预置的知识库给出正确答案。这里提供一种简单的方式作为示范——对于每道多选题都随机勾选一个选项: ```javascript // 获取所有的问答区域容器节点集合 let questionContainers = await page.$$('.question-container'); for (var i=0; i<questionContainers.length;i++) { let container = questionContainers[i]; // 查找当前问题下所有的可选项元素 let options = await container.$$('[type="radio"]'); if(options && options.length>0){ // 随机挑选其中一个选项点击它 var randomIndex = Math.floor(Math.random() * options.length); await options[randomIndex].click(); console.log(`已为第 ${i+1} 题选择了编号为 ${randomIndex + 1} 的选项`); } } ``` 上述代码片段中使用了两个连续美元符号 `$$(selector)` 表达式来定位一组相似类型的子组件,这有助于简化复杂文档树上的查询工作。 最后不要忘记关闭浏览器连接,在整个任务完成后释放资源: ```javascript await browser.close(); ``` 完整的程序应当将这些部分组合起来形成连贯的工作流。当然这只是非常基础的功能演示,具体应用时还需要考虑更多细节比如异常情况捕获、验证码识别等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值