此脚本仅为个人学习编程使用,无意实现作弊目的!!!
使用本脚本产生的一切后果自负!!!
GitHub链接:https://github.com/tnzhy06/i_love_recite_words
之前写了一个基于OCR识别的记单词脚本,但是我不太满意,一是答题是必须不能移动鼠标,浏览器要显示在前面,不能愉快的玩耍。二是不同分辨率的屏幕、不同的浏览器都使得代码中的坐标参数需要修改。不是很方便。三是OCR偶尔会抽风,导致程序中止。
为了解决以上问题,我连夜学习的Playwright。写出的“我爱记单词Ver2.0”,基于Playwright实现题目爬取和浏览器自动控制。
需要安装的库:
pip install openai pip install playwright playwright install
如果安装出现错误可以改用国内镜像源安装,具体方法自行搜索。
脚本代码:
from playwright.sync_api import sync_playwright from openai import OpenAI import json def get_answer(question, options): client = OpenAI(api_key="<DeepSeek API Key>", base_url="https://api.deepseek.com") con = f"Question:{question}\nOptions:{options}" print(con) response = client.chat.completions.create( model="deepseek-chat", messages=[ { "role": "system", "content": 'user提供一个Question和4个Option,在4个Option中找出与Question相同意思相同的答案,若无意思相同的则选最相近的答案!注意每次应斟酌四个选项后再给出最佳答案。最终回答给出选项的大写字母并在其左右加上-,例如-A-' }, { "role": "user", "content": con }, ], stream=False ) print(response.choices[0].message.content.strip()) print() return response.choices[0].message.content.strip() # 定位并点击答案 def select(page, answer): index_mapping = {"-A-": 1, "-B-": 2, "-C-": 3, "-D-": 4} xpath = f"(//div[@class='van-cell van-cell--clickable'])[{index_mapping[answer]}]" button = page.locator(xpath) button.click() # 保存所有题目及答案到 JSON 文件 def save_to_json(questions, filename="list.json"): with open(filename, "w", encoding="utf-8") as file: json.dump(questions, file, indent=4, ensure_ascii=False) print(f"Questions saved to {filename}") # 主函数 def main(): with sync_playwright() as p: browser = p.chromium.launch(headless=False) context = browser.new_context( user_agent="Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36", viewport={"width": 380, "height": 600}, ) page = context.new_page() page.goto("https://skl.hduhelp.com/#/english/list") print("已开启窗口,请登录,并于5分钟内开始考试,否则窗口将自动关闭。") page.wait_for_selector('.van-col.van-col--17',timeout=300000) # 存储所有题目信息 questions = [] page.wait_for_timeout(2000) # 循环回答问题 for i in range(100): question = page.locator('.van-col.van-col--17 span:nth-of-type(2)').inner_text() options = [ opt.inner_text() for opt in page.query_selector_all('div.van-cell') ] print(i + 1) correct_answer = get_answer(question, options) # 保存题目、选项和答案 questions.append({ "number": i + 1, "question": question, "options": options, "answer": correct_answer }) select(page, correct_answer) # 等待一段时间以模拟用户操作 page.wait_for_timeout(300) save_to_json(questions) # 等待 8 分钟用于提交考卷 print("8分钟后窗口将自动关闭。请及时提交试卷") page.wait_for_timeout(480000) browser.close() if __name__ == "__main__": main()
使用方法:
- 1.进入https://www.deepseek.com/注册一个账户,将api_key="<DeepSeek API Key>"中的<DeepSeek API Key>替换为你的Key
- 2.直接运行代码,在弹出的界面中输入的账号密码登录我爱记单词,、(若没有跳转到登录界面,请检查是否开了梯子或修改了DNS)
- 3.直接点击开始考试即可。程序会自动答题。
- 4.答题完成后会在脚本文件所在目录下生成一个 list.json 文件,储存题目及给出的答案。
注意:该脚本不会自动提交试卷,请在答题结束后手动提交!!!
Comments 5 条评论
博主 y2y2
同学学号报一下,给你加学分
博主 TnZHY
@y2y2
博主 清汤挂面乎
白衣哥哥我喜欢你🥰🥰🥰🥰
博主 ForzxOL
怎么小窗口开了一会就关掉了🤔
博主 TnZHY
@ForzxOL page.wait_for_selector默认的超时时间是30s,可以自己改timeout的参数