此脚本仅为个人学习编程使用,无意实现作弊目的!!!
使用本脚本产生的一切后果自负!!!

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 文件,储存题目及给出的答案。

注意:该脚本不会自动提交试卷,请在答题结束后手动提交!!!