刷题答题脚本—接入AI (python+css)

news/2025/1/11 20:48:44/文章来源:https://www.cnblogs.com/zyhlearning/p/18545451

刷题答题脚本———接入AI

github地址:https://github.com/LY-zhang-yi-hao/do-homework-AI-python
创作不易,github点个star,有时间分享更多实用代码,谢谢!

本项目使得刷题的脚本的编写下限变低,利用阿里云模型回答问题,不需要进行题库的编写或网页搜索。
将问题发送给AI,拿到答案后,进行回答填写。

本代码只是提供一个示例。
另外根据浏览器类型,需要不同的浏览器驱动,请自行谷歌搜索下载,code已经注释,请勿忘更改路径。
ps:需要简单的css基础或利用截图发给AI给出定位网页元素的python代码,获取问题和填写答案。

调取阿里云api,回答问题python代码块:

from http import HTTPStatus
import dashscope
from dashscope import Generation
import random
import jsonclass DashScopeAPI:def __init__(self):# 配置API-KEYdashscope.api_key = ""# 单轮对话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))# # 多轮对话# def multi_round(self, messages):# 	response = Generation.call(# 		model="qwen-turbo",# 		messages=messages,# 		result_format='message'  # 将输出设置为"message"格式# 	)# 	if response.status_code == HTTPStatus.OK:# 		# 将assistant的回复添加到messages列表中# 		messages.append(# 			{'role': response.output.choices[0]['message']['role'],# 			 'content': 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# 		))# 		# 如果响应失败,将最后一条user message从messages列表里删除,确保user/assistant消息交替出现# 		messages = messages[:-1]# 	# print(messages)# 	return messages# # 流式输出# def call_with_stream(self, messages):# 	responses = Generation.call(# 		model="qwen-turbo",# 		messages=messages,# 		result_format='message',  # 设置输出为'message'格式# 		stream=True,  # 设置输出方式为流式输出# 		incremental_output=True  # 增量式流式输出# 	)# 	for response in responses:# 		if response.status_code == HTTPStatus.OK:# 			print(response.output.choices[0]['message']['content'], end='')# 		# 将assistant的回复添加到messages列表中# 		# messages.append({'role': response.output.choices[0]['message']['role'],# 		#                  'content': response.output.choices[0]['message']['content']})# 		# yield json.dumps({'content': response.output.choices[0]['message']['content']}) + '\n'# 		else:# 			print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (# 				response.request_id, response.status_code,# 				response.code, response.message# 			))# 			# 如果响应失败,将最后一条user message从messages列表里删除,确保user/assistant消息交替出现# 			messages = messages[:-1]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)# 多轮对话# dsapi.multi_round(messages)# 流式输出# dsapi.call_with_stream(messages)

项目示例:

实验室考试接入阿里云大模型回答:

import requests
import re
import time
import urllib3
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import random
from http import HTTPStatus
import dashscope
from dashscope import Generation# 输入账号信息
url = 'http://59.68.176.173/index.php'
#url = 'https://labexam.hunnu.edu.cn/labexam/index.php'
xuehao = input("学号:")
password = input("密码:")urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
response = requests.get(url, verify=False)
html_data = response.text# 设置Edge驱动路径
edge_driver_path = 'D:/Anacnonda/msedgedriver.exe'# 创建Service对象,传递驱动路径
service = Service(executable_path=edge_driver_path)# 初始化Edge浏览器
driver = webdriver.Edge(service=service)# 访问网址
driver.get(url)# 等待加载页面中的学号输入框,增加等待时间,确保页面完全加载
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, 'xuehao'))
)# 定位学号输入框并输入学号
xuehao_input = driver.find_element(By.NAME, 'xuehao')
xuehao_input.send_keys(xuehao)# 定位密码输入框并输入密码
password_input = driver.find_element(By.NAME, 'password')
password_input.send_keys(password)
#time.sleep(8)# 定位确认登录按钮并点击
login_button = driver.find_element(By.CSS_SELECTOR, 'input[type="submit"][value="确认登录"]')
login_button.click()
time.sleep(1)# 点击“在线考试”
online_practice_button = driver.find_element(By.XPATH, "/html/body/div[2]/div[3]/div[2]/ul/a[1]/li")
online_practice_button.click()# 等待页面加载
time.sleep(1)
# 点击“同意”
checkbox_element = driver.find_element(By.ID, 'kqcl')
checkbox_element.click()# 点击“考试”
online_practice_button = driver.find_element(By.XPATH, '//*[@id="article"]/div[4]/div[2]/div/a[2]' )
#理学院//
#online_practice_button = driver.find_element(By.XPATH, '//*[@id="article"]/div[4]/div[2]/div/a' )
#online_practice_button = driver.find_element(By.XPATH, '//*[@id="article"]/div[4]/div[2]/div[1]/a' )
#online_practice_button = driver.find_element(By.XPATH, '//*[@id="article"]/div[4]/div[2]/div[2]/a' )online_practice_button.click()# 等待页面加载
time.sleep(1)# 定义调用 DashScope API 的类
class DashScopeAPI:def __init__(self):# 配置API-KEYdashscope.api_key = ""# 单轮对话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# 实例化API调用类
dsapi = DashScopeAPI()# 记录无法回答的题目列表
unanswered_questions = []# 遍历每个页面进行操作
for page_num in range(1, 11):# 每次翻页后都要重新获取当前页面的题目try:WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.shiti h3')))questions = driver.find_elements(By.CSS_SELECTOR, 'div.shiti h3')except Exception as e:print(f"无法获取题目,跳过第 {page_num} 页: {e}")continue# 遍历每个题目,将题目传入 DashScope 模型进行判断,并点击正确选项for index, question in enumerate(questions):try:question_text = question.textexcept Exception as e:print(f"无法获取题目文本,跳过该题: {e}")continue# 获取选项文本try:Choose1_label = driver.find_element(By.XPATH, f"//label[@for='ti_{(page_num-1)*10+index+1}_0']").textChoose2_label = driver.find_element(By.XPATH, f"//label[@for='ti_{(page_num-1)*10+index+1}_1']").text# 尝试获取第三、第四个选项(用于选择题)try:Choose3_label = driver.find_element(By.XPATH, f"//label[@for='ti_{(page_num-1)*10+index+1}_2']").textChoose4_label = driver.find_element(By.XPATH, f"//label[@for='ti_{(page_num-1)*10+index+1}_3']").textoptions_text = f" {Choose1_label}, {Choose2_label}, {Choose3_label}, {Choose4_label}"except Exception:options_text = f" {Choose1_label}, {Choose2_label}"except Exception as e:print(f"无法获取选项文本,跳过该题: {e}")continueprint(f"\n题目: {question_text}\n选项: {options_text}")# 调用 DashScope APImessages = [{'role': 'system', 'content': '你是一个知识渊博的化学专业的实验室安全员.'},{'role': 'user', 'content': f'给你题目,请你回答,只需要给我答案即可。如果题目没有给你选项,就是判断题,如果给你了选项abcd,就给我答案选项,注意有些是多选题。请你认真作答\n题目: {question_text}\n选项: {options_text}'}]result = dsapi.call_with_messages(messages)if result:print(f"模型回答: {result}")else:print(f"模型未返回结果: {question_text}")unanswered_questions.append(question_text)continue# 根据API返回的结果点击正确选项try:# 提取选项字母部分,去掉描述内容result_match = re.match(r'[A-D]|[对错]', result.strip().upper())if result_match:result_option = result_match.group()else:raise ValueError("无法识别的选项")# 根据返回的选项找到对应的 input 元素并点击if result_option == '对':correct_option = driver.find_element(By.ID, f'ti_{(page_num-1)*10+index+1}_1')elif result_option == '错':correct_option = driver.find_element(By.ID, f'ti_{(page_num-1)*10+index+1}_0')elif result_option == 'A':correct_option = driver.find_element(By.ID, f'ti_{(page_num-1)*10+index+1}_0')elif result_option == 'B':correct_option = driver.find_element(By.ID, f'ti_{(page_num-1)*10+index+1}_1')elif result_option == 'C':correct_option = driver.find_element(By.ID, f'ti_{(page_num-1)*10+index+1}_2')elif result_option == 'D':correct_option = driver.find_element(By.ID, f'ti_{(page_num-1)*10+index+1}_3')else:raise ValueError("无法识别的选项")correct_option.click()print(f"点击了'{result_option}'选项")except Exception as e:print(f"在点击选项时遇到错误: {e}")unanswered_questions.append(question_text)continueif page_num < 11:# 点击“下一页”按钮if page_num == 1:next_page_button = driver.find_element(By.XPATH, "//input[@type='button' and @value='下一页']")next_page_button.click()# next_page_button = driver.find_element(By.XPATH, '//*[@id="dati"]/div[26]/input[1]')# next_page_button.click()else:next_page_button = driver.find_element(By.XPATH, '//*[@id="dati"]/div[11]/input[2]')next_page_button.click()    print(f"已点击第 {page_num} 页的'下一页'按钮")  # 输出无法回答的题目
if unanswered_questions:print("以下题目未能回答:")for unanswered in unanswered_questions:print(unanswered)
else:print("所有题目都已回答")# 保持浏览器打开,等待用户按下回车键后关闭
input("Press Enter to close the browser...")
driver.quit()

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

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

相关文章

我的前端成长之路

原作者:玉伯 链接:https://www.yuque.com/yubo/morning/grow-up-at-alibaba 来源:语雀

【Unity】仓库逻辑:拾取物体进仓库和扔掉物品

unity中实现仓库逻辑:玩家前后左右移动,碰到的物体放入仓库,点击仓库中的物体扔回3D中需求说明 目标:实现玩家移动过程中,拾取物体,物体被放入仓库;点击仓库中物体,重新扔回3D场景中逻辑。 逻辑分析:需要玩家可以移动; 需要检测玩家和物体的碰撞,并摧毁物体; 需要识…

为什么卷积现在不火了:CNN研究热度降温的深层原因分析

在深度学习领域,卷积神经网络(CNN)曾经是计算机视觉的代名词。自2012年AlexNet在ImageNet竞赛中取得突破性成功以来,CNN在图像识别、目标检测等领域掀起了一场革命。然而,纵观近年的顶会论文和研究热点,我们不得不承认一个现实:CNN相关的研究论文正在减少,曾经的"…

hostapd移植到RK356X

1. 简介开发环境:Ubuntu20.04目标平台:RK356X,内核版本:4.19.234hostapd版本:2.10, 依赖特定版本的openssl和libnlopsnssl版本:3.0.15libnl版本:3.2.32. openssl 移植hostapd依赖openssl,需要先移植openssl获取openssl源码,选择使用3.0.15版本,链接如下https://openssl…

最全面的输入法教程:后话

完结撒花~🎉🎉🎉最后,本文就来讲讲一些更加进阶的场景,以及一些感想。 ‍ 特殊场景 如果你有输入生僻字的需求,可以看看这篇文章:【技术贴】快速输入生僻字 - 知乎 此外除了输入汉字,学术方面还有时候得输入数学公式,此时就可以考虑用 LaTex 了,具体可以看我这篇文…

【最优化方法】第三次要点整理

目录非精确线搜索技术Armijo-Goldstein 准则Wolfe-Powell 准则强 Wolfe-Powell 准则 【问题】在迭代中,已知 \(x^{(k)}\) 和下降方向 \(d^{(k)}\),如何确定下降步长 \(\alpha^{(k)}\),使得 \(f(x^{(k)} + \alpha^{(k)} d^{(k)}) < f(x^{(k)})\)? 非精确线搜索技术 求 \(…

AlignSum:数据金字塔与层级微调,提升文本摘要模型性能 | EMNLP24

来源:晓飞的算法工程笔记 公众号,转载请注明出处论文: AlignSum: Data Pyramid Hierarchical Fine-tuning for Aligning with Human Summarization Preference论文地址:https://arxiv.org/abs/2410.00409 论文代码:https://github.com/csyanghan/AlignSum创新点发现在文本摘…

快速提升职场效率:从整理任务清单开始

在职场中,我们总会面对各种大小不一的任务,常常让人有种“任务无处不在、却无从下手”的感觉。有效地管理工作,既需要掌握具体的任务管理方法,也需要选择一款适合的工具帮助我们更高效地完成这些任务。今天就从最基础的“整理任务清单”说起,分享一些提高职场效率的实用技…

ABB IRB5500喷涂机器人电机维修故障方法

ABB喷涂机器人电机在运行过程中可能会遇到多种常见故障,用户需根据电机的实际运行状况,细致地进行故障辨析并采取适当的处理措施。在进行维修作业时,务必严格遵守安全操作规程,确保不会对机器人本身及维修人员造成任何伤害。 一、ABB喷涂机器人电机维修故障现象的初步判断与…

NocoBase 本周更新汇总:提升工作流易用性

汇总一周产品更新日志,最新发布可以前往我们的博客查看。 NocoBase 目前更新包括两个分支:main 和 next 。 main :截止目前最稳定的版本,推荐安装此版本。 next:内测版,包含一些未发布的新特性,这个版本可能还不完全稳定,适用于开发者或测试人员,用于提前体验新功能或…

AD(活动目录)环境下使用kms服务自动激活域里windows

AD(活动目录)环境下使用kms服务自动激活域里windows 做基础架构运维对AD域架构和kms激活应该是比较熟悉的,关于kms激活服务器搭建,可以看看网上的相关资料,其安装在CentOS比较稳定,当然也支持其他类似的OS。安装过程不再赘述了。希望能够帮助大家! 可以参考: bbs.pcbet…

Mac和安卓手机互传文件(ADB)

点赞 + 关注 + 收藏 = 学会了 本文简介 今年的 Mac mini M4 真的鲨疯了,丐版原价4字头,领到国补的3字头可以拿下。相信很多想体验 macOS 的工友都蠢蠢欲动了。 但是,电脑便宜了,手机可不便宜。对于正在使用 「苹果电脑 + 安卓手机」 的工友来说,想让这两设备互传体积大、数…