代码小白即可完成的刷题脚本 ( Cursor 和 阿里云的 API 的 Python 刷题脚本)

news/2025/1/16 8:01:48/文章来源:https://www.cnblogs.com/zyhlearning/p/18674071

利用 cursor 编写刷题脚本

项目地址:GitHub - LY-zhang-yi-hao/刷题脚本🌐
📺 附上详细的讲解视频:点击观看
实现效果:🚀
PixPin_2025-01-16_07-48-52.gif|600

初衷

在当今教育环境下,经常需要面对大量重复性的练习题。为了减轻负担,借助AI技术开发刷题脚本,合理分配娱乐时间(狗头)

AI技术的快速发展,特别是Cursor等AI编程助手的出现,即使编程基础较弱的同学也能轻松开发出实用的刷题工具。本项目旨在降低编程门槛,让更多学生受益于AI技术。

定位:编程有一点基础,能看懂基本的语句,这个脚本主要利用python进行编写,css和javascript需要用到,但是都是利用AI以及查阅资料进行编写。

前言

10月在GitHub已经开源了一个简单的刷题脚本.
项目地址:

  • 实验室安全考核 刷题脚本:
  • 简单介绍:
    本项目使得刷题的脚本的编写下限变低,利用阿里云模型回答问题,不需要进行题库的编写或网页搜索还需绕过许多反爬。
    将问题发送给AI,拿到答案后,进行回答填写。
    本代码只是提供一个示例。
    另外根据浏览器类型,需要不同的浏览器驱动,请自行谷歌搜索下载,code已经注释,请勿忘更改路径。
    ps:需要简单的css基础或利用截图发给AI给出定位网页元素的python代码,获取问题和填写答案。
    68747470733a2f2f62752e6475736179732e636f6d2f323032342f31322f30382f363735353635353536633732372e676966.gif|400

正文

  1. 调取阿里云api,回答问题python代码块
  2. 另外根据浏览器类型,需要不同的浏览器驱动,请自行谷歌搜索下载,code已经注释,请勿忘更改路径。
    Microsoft Edge WebDriver | Microsoft Edge Developer
  3. python环境的配置与安装,看炮哥的视频,配置的很简单,不用改环境那么麻烦. 环境配置链接

项目实战

  • 驾校科目一考试,拿到题目和选项,将题目和选项发送给阿里云大模型,阿里云模型回答问题,得到答案后,再进行答案填写。

逻辑 :

  1. 打开网址: https://www.jsyks.com/
  2. 点击科目一顺序练习,跳转到新的页面
  3. 获得当前的题目和选项的信息
  4. 把信息发送给阿里云模型
  5. 从阿里云模型得到答案
  6. 答案填入
  • 查找网页元素快捷键:F 12 或者 FN+F 12
  • 如果有验证码登陆 :人工干预,到输入验证码阶段,停止代码运行,人工输入之后,在键盘输入任意键,继续运行代码。

cursor 输入内容:

  • 我的角色:我是一个python小白,没有相应的css和javascript基础,所以请你对以后的代码写好非常详细的注释。
  • 任务: 请你帮我写一个python刷题脚本,打开edge浏览器,具体的题目网址: https://www.jsyks.com/ ,然后点击一些选项(待定,我给你具体的网页元素位置)拿到题目和选项,将题目和选项发送给阿里云大模型,阿里云模型回答问题,得到答案后,再进行答案填写。
  • 我的Edge驱动路径,'D:/python/msedgedriver. exe'
  • 这是调用阿里云api的代码:
from http import HTTPStatus
import dashscope
from dashscope import Generation
import random
import jsonclass DashScopeAPI:def __init__(self):# 配置API-KEYdashscope.api_key = "sk-f02484ea78744f5a90a6b680bc288dbb"# 单轮对话def call_with_messages(self, messages):response = Generation.call(model="qwen-turbo",messages=messages,# 设置随机数种子seed,如果没有设置,则随机数种子默认为1234seed=random.randint(1, 10000),# 将输出设置为"message"格式result_format='message')if response.status_code == HTTPStatus.OK:print(response.output.choices[0]['message']['content'])# print(response)else:print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (response.request_id, response.status_code,response.code, response.message))
if __name__ == '__main__':dsapi = DashScopeAPI()messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},{'role': 'user', 'content': '我的题目,请你只需要回答答案即可。91、实验室电器设备所引起的火灾,应:A.用水灭火B.用二氧化碳或干粉灭火器灭火C.用泡沫灭火器灭火'},]# 单轮对话dsapi.call_with_messages(messages)
  • 后续慢慢截图和调试就可以了,详情看我的视频(建议二倍速食用)

最后代码

# 导入所需的库from selenium import webdriver  # 用于控制浏览器from selenium.webdriver.common.by import By  # 用于定位网页元素from selenium.webdriver.support.ui import WebDriverWait  # 用于等待网页元素加载from selenium.webdriver.support import expected_conditions as EC  # 用于设置等待条件from selenium.webdriver.edge.service import Service  # 用于设置Edge浏览器驱动from http import HTTPStatus  # 用于处理HTTP状态码import dashscope  # 阿里云APIfrom dashscope import Generation  # 阿里云生成模型import random  # 用于生成随机数import time  # 用于添加延时import json  # 用于处理JSON数据class AutoExam:def __init__(self):"""初始化自动答题类设置浏览器驱动并创建浏览器实例"""# 创建Edge浏览器驱动服务service = Service('D:/python/msedgedriver.exe')# 创建浏览器实例self.driver = webdriver.Edge(service=service)# 创建等待对象,最长等待时间为10秒self.wait = WebDriverWait(self.driver, 10)# 创建阿里云API实例self.dsapi = DashScopeAPI()def start_exam(self):"""开始考试:1. 打开指定网址2. 等待页面加载3. 点击"顺序练习"链接"""try:# 打开指定网址self.driver.get("https://www.jsyks.com/")# 等待页面完全加载time.sleep(3)# 只使用一种最可靠的定位方式practice_link = self.wait.until(EC.presence_of_element_located((By.XPATH, "//a[.//img[@alt='科目一顺序练习']]")))# 使用JavaScript点击元素,避免被遮挡的问题self.driver.execute_script("arguments[0].scrollIntoView(true);", practice_link)time.sleep(1)  # 等待滚动完成self.driver.execute_script("arguments[0].click();", practice_link)# 等待新页面加载time.sleep(3)# 切换到新打开的标签页self.driver.switch_to.window(self.driver.window_handles[-1])# 等待题目页面加载完成self.wait.until(EC.presence_of_element_located((By.ID, "ExamTit")))except Exception as e:print(f"启动考试时出错: {e}")print("具体错误:无法找到或点击'顺序练习'链接")# 如果发生错误,尝试关闭浏览器self.driver.quit()raise  # 重新抛出异常,中止程序def get_question_content(self):"""获取题目内容返回值:题目文本,如果出错返回None"""try:# 增加重试机制for _ in range(3):  # 最多重试3次try:# 等待题目元素出现并获取文本question_element = self.wait.until(EC.visibility_of_element_located((By.ID, "ExamTit")))# 获取题目文本并清理多余的空格和特殊字符question_text = question_element.text.replace('\u00A0', ' ').strip()if question_text:  # 确保获取到了文本print("\n获取到的题目:")print(question_text)return question_texttime.sleep(1)except:time.sleep(1)raise Exception("无法获取题目内容")except Exception as e:print(f"获取题目时出错: {e}")return Nonedef get_options(self):"""获取所有选项内容返回值:选项文本列表,如果出错返回None"""try:# 增加重试机制for _ in range(3):  # 最多重试3次try:# 等待选项列表元素出现options_list = self.wait.until(EC.visibility_of_element_located((By.ID, "ExamOpt")))options = []# 遍历选项A到Dfor option_id in ['ExamOptA', 'ExamOptB', 'ExamOptC', 'ExamOptD']:option_element = self.wait.until(EC.visibility_of_element_located((By.ID, option_id)))# 获取label元素中的文本label_text = option_element.find_element(By.TAG_NAME, "label").textif label_text:  # 确保获取到了文本options.append(label_text)if len(options) == 4:  # 确保获取到了所有选项print("\n获取到的选项:")for i, option in enumerate(options):print(f"{chr(65+i)}. {option}")  # 打印 A. xxx, B. xxx 等return optionstime.sleep(1)except:time.sleep(1)raise Exception("无法获取完整的选项内容")except Exception as e:print(f"获取选项时出错: {e}")return Nonedef choose_answer(self, answer):"""选择答案参数:answer: AI返回的答案文本"""try:# 从AI答案中提取选项字母(A、B、C、D)# 处理可能的答案格式:'B' 或 'B、12个月' 或 'B.'等answer = answer.strip().upper()  # 转换为大写并去除空格option_letter = answer[0]  # 获取第一个字符# 验证是否是有效的选项if option_letter not in ['A', 'B', 'C', 'D']:print(f"无效的答案格式: {answer}")returnoption_id = f"in{option_letter}"  # 构造选项ID,例如"inA"# 找到对应的单选按钮并点击answer_element = self.wait.until(EC.element_to_be_clickable((By.ID, option_id)))# 使用JavaScript点击元素,避免可能的点击问题self.driver.execute_script("arguments[0].click();", answer_element)print(f"已选择答案: {option_letter}")except Exception as e:print(f"选择答案时出错: {e}")print(f"尝试选择的答案选项: {answer}")def submit_to_ai(self, question, options):"""将题目提交给AI获取答案参数:question: 题目文本options: 选项列表返回值:AI的答案"""# 将题目和选项组合成完整的问题full_question = f"{question}\n" + "\n".join(options)# 构造发送给AI的消息,强调只需要返回选项字母messages = [{'role': 'system', 'content': 'You are a helpful assistant. Please only respond with a single letter (A, B, C, or D) as the answer.'},{'role': 'user', 'content': f'请只回答选项字母(A、B、C、D),不要包含其他内容。题目:{full_question}'}]# 调用AI获取答案answer = self.dsapi.call_with_messages(messages)if answer:print("\nAI的答案:")print(answer)return answerdef click_next_question(self):"""点击下一题按钮返回值:是否成功点击下一题"""try:# 通过span标签文本定位"下一题"按钮next_button = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='下一题']")))next_button.click()time.sleep(2)  # 等待新题目加载return Trueexcept Exception as e:print(f"点击下一题时出错: {e}")return Falsedef run(self):"""运行主程序控制答题流程 - 循环处理题目直到用户选择退出"""try:# 开始考试self.start_exam()question_count = 0while True:question_count += 1print(f"\n正在处理第 {question_count} 题...")# 获取题目内容question = self.get_question_content()# 获取选项内容options = self.get_options()# 如果成功获取到题目和选项if question and options:# 获取AI答案ai_answer = self.submit_to_ai(question, options)# 选择答案self.choose_answer(ai_answer)print(f"\n第 {question_count} 题完成!")# 询问用户是否继续下一题user_input = input("\n是否继续下一题?(y/n): ").lower()if user_input != 'y':print("\n答题结束!")break# 点击下一题if not self.click_next_question():print("\n无法进入下一题,答题结束!")breakelse:print("\n获取题目或选项失败!")breakexcept Exception as e:print(f"运行出错: {e}")finally:# 等待用户按键后关闭浏览器input("\n按回车键关闭浏览器...")self.driver.quit()# 保持原有的DashScopeAPI类不变class DashScopeAPI:def __init__(self):dashscope.api_key = "sk-f02484ea78744f5a90a6b680bc288dbb"def call_with_messages(self, messages):response = Generation.call(model="qwen-turbo",messages=messages,seed=random.randint(1, 10000),result_format='message')if response.status_code == HTTPStatus.OK:return response.output.choices[0]['message']['content']else:print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (response.request_id, response.status_code,response.code, response.message))return None# 程序入口if __name__ == "__main__":# 创建自动答题实例并运行bot = AutoExam()bot.run()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/869978.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P7744 [COCI2011-2012#3] POGODAK

维护骰子的三面来快速维护整个骰子,然后模拟便会简单题目大意 详细题目传送门在这个立方体中,两个对立面的点数之和等于 \(7\)。将立方体放在了一个 \(r\times c\) 的矩阵的左上方,最初立方体的方向是上侧显示 \(1\),右侧显示 \(3\)。次重复以下动作:向右滚动立方体,直到…

shiro550 分析复现

shiro550 分析复现shiro是java中用来处理鉴权问题的组件,提供了快捷的用户鉴权认证功能.在shrio版本低于1.2.24的时候存在shiro550漏洞,我们clone一个P牛的项目去进行实验测试.实验环境为java8u65 看一下项目添加的依赖: <dependencies><dependency><groupId>…

手摸手实战前端项目CI CD

由于图片和格式解析问题,为了更好阅读体验可前往 阅读原文CI/CD 是 持续集成(Continuous Integration) 和 持续交付/部署(Continuous Delivery/Continuous Deployment) 的缩写,是现代软件开发中的一种自动化方法论,用于加速代码交付和部署的流程,同时保证代码质量和稳定…

读量子霸权05量子计算机种类

量子计算机有多种设计,包括超导、离子阱、光量子、硅光子、拓扑等,各有优缺点。IBM、谷歌等公司发布量子计算机,光量子计算机有望超越其他类型。D-Wave量子计算机在优化领域表现出色。1. 竞赛 1.1. 能够有效发挥作用的计算机体系结构不止一种 1.2. 图灵机就是在可应用于广泛…

dotnet C# 在不同的机器 CPU 型号上的基准性能测试

本文将记录我在多个不同的机器上,在不同的 CPU 型号上,执行相同的我编写的 dotnet 的 Benchmark 的代码,测试不同的 CPU 型号对 C# 系的优化程度。本文非严谨测试,数值只有相对意义以下是我的测试结果,对应的测试代码放在 github 上,可以在本文末尾找到下载代码的方法 我…

dotnet 对一些 Win32 方法进行 Benchmark 基准性能测试

本文记录对一些 Win32 方法进行 Benchmark 基准性能测试本文非严谨测试,仅在我开发机器进行测试,没有在纯净系统和机器上进行测试 开始之前的说明: 本文使用的是 BenchmarkDotNet 进行测试,没有考虑 AOT 之后的调用性能,仅仅只是 Release 版本的 dotnet 程序的调用而已 数…

洞悉图数据库:构建未来的基石

代码无法创建多段文本或复杂格式内容在实际情况下你可能会利用多行样式设置图像和链接来增强一个网站页面但…………HTML</no value> 代码无法创建多段文本或复杂格式内容。在实际情况下,你可能会利用多行、样式设置、图像和链接来增强一个网站页面,但我能给你提供关于…

在外漂泊的这几年总结和感悟,展望未来

大家好,我加入博客园已经七年了。我是在2017年参加国内第一份全职实习时创建了博客园账号,读了求救信,并最近并办理了园子会员。希望博客园越来越好!最后想说一句:“其他er 和 .NETer,大家不要再打了,一起合作,共同拯救园子吧!” 在国内的日子 我在2017年至2018年国内…

使用python实现tcp通信

TCP协议使服务器和客户端通过socket进行通信服务器端通信流程如下: 1.使用socket类创建一个套接字对象 2.使用bind(ip,port)方法绑定IP地址和端口号 3.使用listen()方法开始TCP监听 4.使用accept0方法等待客户端的连接 5.使用recv0/send0方法接收/发送数据 6.使用close0关闭套…

使用python实现tcp一次通信

TCP协议使服务器和客户端通过socket进行通信服务器端通信流程如下: 1.使用socket类创建一个套接字对象 2.使用bind(ip,port)方法绑定IP地址和端口号 3.使用listen()方法开始TCP监听 4.使用accept0方法等待客户端的连接 5.使用recv0/send0方法接收/发送数据 6.使用close0关闭套…

树莓派Linux安装usb摄像头/打印机

设备HP IR Camara USB\VID_04F2&PID_B634&REV_0012&MI_02 HP Wide Vision FHD Camera USB\VID_04F2&PID_B634&REV_0012&MI_00 USB小票机 USB\VID_0471&PID_0055&REV_0100lsusb 命令列出设备 插入设备前 alex@raspberrypi:~ $ lsusb Bus 002 De…

How to fix Raspberry Pi 中使用 Vim 显示 UTF-8 字符 Emoji 中文乱码 bug All In One

How to fix Raspberry Pi 中使用 Vim 显示 UTF-8 字符 Emoji 中文乱码 bug All In OneHow to fix Raspberry Pi 中使用 Vim 显示 UTF-8 字符 Emoji 中文乱码 bug All In One errorssolutions $ cat /etc/locale.gen$ sudo vim /etc/locale.gen # 1. 开启 zh_CN.UTF-8 UTF-8, 即…