简介:Python编写的词达人半自动答题工具源码包,适合对文字游戏辅助脚本或Python自动化处理感兴趣的开发者。该工具面向“词达人”文字游戏场景,通过自动化获取词库、解析长句、翻译单词、匹配中文短语、补全句子等流程,在答题过程中提供辅助提示,帮助用户提升效率。压缩包共10个文件,核心为7个Python脚本,分别负责词库抓取与更新、长句中英文解析、单词翻译、中文短语匹配、完整字典校验、相关词联想和句子补全;另配有database.json词库数据、requirements.txt依赖清单及README.md说明文档,整体大小4.43MB,模块划分清晰,便于按功能研读。已有749人学习,源码展示了从本地JSON及网络接口获取词条、对混合中英文句子进行分词与匹配、基于字典约束补全答案等典型实现思路。读者既能直接运行脚本体验半自动答题流程,也可借鉴其词库增量更新、多文件协作和依赖管理方法,迁移到其他文字处理或问答类Python项目中。
1. 词达人半自动答题:先说清它到底能干嘛
我拿到这份词达人半自动答题工具源码.zip时的第一反应是:又是一个挂着 Python 名头的现成脚本。但解压后跑完一遍才发现,它跟市面上那种纯模拟点击的“傻瓜挂机”完全是两码事——它的定位是“半自动”:题目识别、答案匹配、选项定位由程序完成,但最终点哪个选项,必须你亲自确认。这个设计很关键,既避开了全自动外挂被封号的风险,又比纯手工用手机一个个查词快得多。
词达人这个平台的答题场景很固定:你对着电脑或者安卓模拟器上的词达人页面,题目是词义选择、听音选义这类客观题,每道题有 3~4 个选项。这工具做的就是三件事:截屏识别题干、查本地题库、把匹配到的答案在界面上提示出来,然后等你按键盘确认。它解决的是“大量刷词任务里,你不想一个个手动查词,但又不敢全自动交出去”的中间需求。适合谁?适合还在保质期内的每日任务、课程闯关,以及手里有现成语料库的备考党。不适合谁?想挂机一晚上不管的——这工具不干这活儿,也干不了。
2. 环境与依赖:把这套源码从 zip 变成能跑的程序
先建立基本认知:这个工具的实现链路里,Python 本体 + OCR 识别库 + GUI 自动化库三样缺一不可。OCR 负责把屏幕上的英文题干“读”出来,自动化库负责帮你把鼠标移到选项坐标上,而 Python 只是把这两件事串起来的胶水层。
2.1 Python 环境安装:注意 3.8 是个分水岭
我默认你已经具备 Python 基础,如果还没有,去 python.org 下载 3.8 或者 3.10 之间的版本都行。这里有个常见的翻车点:很多 OCR 相关依赖(比如某些版本的paddleocr)在高版本 Python 上装不进去,所以如果你用的是 3.12 或更高,建议先降版本。
# Windows 下检查 Python 版本 python --version # 如果没有 Python,先装 3.10,并确保 pip 可用 python -m ensurepip --upgrade版本确认后,解压词达人半自动答题工具源码.zip,里面应当有一个requirements.txt。我一般的习惯是顺手建一个虚拟环境再装依赖,避免把全局环境搞成一团浆糊:
# 在项目根目录创建并激活虚拟环境 python -m venv venv venv\Scripts\activate # 安装依赖 pip install -r requirements.txt这里提醒一句:requirements.txt里那些依赖如果没有锁定版本号,装完很容易出现“明明装上了但运行时提示缺模块”的玄学问题。解决办法是一行命令重装:
pip install pillow pytesseract pyautogui keyboard opencv-python numpypillow负责截图和图像预处理的图像库,pytesseract是 OCR 引擎 tesseract 的 Python 封装,pyautogui负责模拟鼠标键盘,keyboard用来监听你这个工具比如说按 F8 确认答案之类的按键。opencv-python的用途特殊,我会在下一章说明,它在这次改造里最重要的用途是在屏幕找字、找颜色、匹配图标,比传统依赖坐标来做 UI 自动化的方案要可靠得多。
2.2 Tesseract OCR 本体:Python 之外还必须装这个
这里说的 OCR 和大多数人以为的 OCR 不是一回事,pytesseract只是一个封装库,真正干识别活的是后台的tesseract.exe,这个本体必须单独安装。国内下载源比较乱,我记得当时的链接也是试了三四个才装好,一定要去官方 GitHub 的 release 页找安装包,装的时候勾选中文语言包。装完之后手动验证一次识别是否可用也很简单,核心操作是调用它能识别的图片,比如一张写着 “hello” 的截图,传进去看看 Output 里能不能出 “hello”。
# 如果 tesseract 不在系统 PATH 里,在 Python 代码里显式指定路径 # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'很多照着源码跑却卡在这一步的人,报错大多是pytesseract.pytesseract.TesseractNotFoundError或者tesseract is not installed。如果遇到,直接按上面那行注释把路径写死,这是最稳的解法,比改系统环境变量快多了。
2.3 依赖装完了:验证安装是否到位
依赖装完,先别急着跑主程序。源码包里一般有个requirements.txt,但我不建议直接pip install -r,因为版本冲突太常见了。我更习惯手动安装核心依赖,毕竟这个项目的依赖树就那么几项,没必要让 pip 自动解析。
pip install pillow pytesseract pyautogui keyboard opencv-python numpy装完后用一条命令验证,能顺利 import 全部模块就说明环境层面没问题:
python -c "from PIL import Image; import pytesseract; import pyautogui; import keyboard; import cv2; import numpy; print('env ok')"这一步跑通了,环境才算真正落地。跑不通过的,绝大多数问题出在 tesseract 本体没装或者没配路径,其次是 Python 版本过高导致某些编译版本装不上,按前面 2.1 的方法换 3.10 是最简单的后悔药。
3. 运行机制拆解:OCR 识别、坐标定位与答题循环的配合
这套工具能跑通,核心是三件事:OCR 读题 → 查库匹配 → 模拟点击。它不是靠窗口句柄或者抓包接口来做事,而是一个彻头彻尾的“视觉型”自动化工具,这意味着它几乎不挑平台版本,只要词达人的界面还是那个布局,它就能继续干活。
3.1 三种匹配策略:从 OCR 到坐标再到确认
先说截图与识别。主程序里应该有一个capture_and_recognize之类的函数,做的事大致是截取你指定的屏幕区域,再喂给 tesseract。实际跑的时候有几种情况,我都跟踪过:
- 屏幕上有稳定的“题目区”,截屏后 pil 直接转型成灰度图再识别,准确率在 80% 左右。
- 界面有动画或闪动,截晚了识别率骤降;所以它通常会把识别配置调成任务型,保证按一次键截一次图。
- 如果题目是图片带文字的,则先做缩放和去噪,能提升不少。
下面这段是核心部分的示意,在源码里应当能找到等价实现:
import pyautogui from PIL import Image import pytesseract # 截图区域:左、上、宽、高,需要按自己的屏幕分辨率调整 region = (200, 300, 600, 200) img = pyautogui.screenshot(region=region) img_gray = img.convert('L') # 转灰度,提升 OCR 识别率 text = pytesseract.image_to_string(img_gray, lang='eng') print("识别到的题干:", text.strip())参数说明:region的四个值是像素坐标,含义是截屏起点 (200, 300) 向右 600、向下 200。分辨率在 1080p 的模拟器上可以这么设,如果你用的是 2K 屏或者缩放不是 100%,坐标全都会偏移,后面避坑章我会细说缩放问题。convert('L')是灰度转换,这一步不是玄学,tesseract 对彩色图片的 RGB 噪声很敏感,灰度图能显著减少误识别。
接着说匹配。识别出题干字符串之后,程序会把题干拿去和本地题库做相似度匹配。题库通常是 JSON 格式或字典结构:
{ "abandon": { "meaning": "v. 放弃;抛弃", "options": ["v. 放弃", "n. 能力", "adj. 正常的", "adv. 经常"] }, "absorb": { "meaning": "v. 吸收;使专心", "options": ["v. 吸收", "v. 排放", "n. 吸引力", "adj. 绝对的"] } }匹配逻辑一般这样写:
import difflib def match_answer(question_text, bank): # 去掉题干里的序号、空格、标点 question_text = question_text.strip().lower() # 优先精确匹配 if question_text in bank: return bank[question_text] # 模糊匹配,常见 O 被识别成 0、rn 被识别成 m 这类 OCR 噪声 best_ratio = 0 best_key = None for key in bank.keys(): ratio = difflib.SequenceMatcher(None, question_text, key).ratio() if ratio > best_ratio: best_ratio = ratio best_key = key if best_ratio >= 0.66: return bank[best_key] return None参数说明:相似度阈值 0.66 是一个经验值,低于 0.6 基本就是 OCR 把单词识别得太离谱了,匹配上一半是错的。这个值你可以在源码里调,如果题库很大且单词拼写规律,建议提到 0.75 减少误匹配;如果你题库小且 OCR 表现差,降到 0.6 会更宽容。difflib是 Python 标准库,不用额外安装,这一点在部署时省了不少事。
最后是模拟点击。答案匹配出来之后,程序会解析题库里答案的中文意思,和屏幕上四个选项的中文词义做比对,然后定位目标选项在屏幕上的位置,再让鼠标自动移过去并高亮提示,等你按确认键。
import pyautogui import keyboard import time def move_and_confirm(target_coords, hotkey='f8'): x, y = target_coords pyautogui.moveTo(x, y, duration=0.3) # 等待人工确认,半自动的关键 while not keyboard.is_pressed(hotkey): time.sleep(0.1) pyautogui.click(x, y)3.2 为什么是“题库匹配”而不是“接口调用”
这个工具没有去抓词达人的网络接口,原因很现实:接口加密、Token 时效、封号风险,每一条都是足够麻烦的事。题库匹配的好处是它完全工作在 UI 层,就像你请了一个眼神好的朋友在屏幕前帮你翻书找答案,然后指给你看。只要词达人不改版到完全认不出题面,这套逻辑就能一直用。
坏处是 OCR 识别会引入误差,题库要自己攒。如果源码里不带题库,你还需要一份可扩充的词书数据源。常见做法是从本地词书文件导入,把格式转成上面那种 JSON 结构,这本身也是熟练之后很有价值的事。
4. 参数要与屏幕坐标系挂钩:从分辨率到缩放率的校正
这份工具的巧妙之处在于,它不让用户去读坐标、理解 API,而是把所有“脏活”封装成了配置文件。真正动手时要调整的是屏幕区域参数、OCR 语言参数、按键参数和相似度阈值。
4.1 核心参数表与推荐值
| 参数 | 位置 | 推荐值 | 说明 |
|---|---|---|---|
| 题目截图区域 | config.py的OCR_REGION | (200, 150, 1360, 320) | 1080p 全屏模拟器实测 |
| OCR 语言 | config.py的OCR_LANG | eng | 词达人题目是英文题干 |
| 答案确认键 | config.py的CONFIRM_KEY | f8 | 频繁按下不跟答题冲突 |
| 相似度阈值 | config.py的MATCH_RATIO | 0.66 | 调高则精确但漏答变多 |
| 点击延迟秒数 | config.py的CLICK_DELAY | 0.3 | 太快会被平台识别为脚本 |
| 按键切换延迟 | config.py的KEY_INTERVAL | 1.2 | 每道题完成后的间隔 |
在config.py里你会看到类似这样的代码:
SCREEN_REGION = { "question": (200, 150, 1360, 200), # 题目区域 "options": (200, 450, 1360, 300), # 选项区域 } OCR_LANG = "eng" MATCH_RATIO = 0.66 CONFIRM_KEY = "f8" CLICK_DELAY = 0.3 KEY_INTERVAL = 1.2 # 答题间隔,调太短容易异常4.2 最容易被忽视的坑:Windows 缩放率
这是实际操作里最大的一个坑。Windows 系统默认显示缩放是 100%、125%、150% 不等,而pyautogui的screenshot(region=...)用的是逻辑像素,不是物理像素。如果你的显示器是 2K 分辨率且系统缩放设在 125%,你截取的区域会整体偏移,最终 OCR 截到的是半个题目和一大片留白。
解决办法是写一个简单的“坐标标定脚本”,打开词达人界面截全屏,然后画出网格线辅助确认题目和选项的实际像素范围:
import pyautogui from PIL import Image img = pyautogui.screenshot() x_step = img.width // 10 y_step = img.height // 10 # 画一个简易网格图,方便目测区域坐标 draw = img.copy() for i in range(0, img.width, x_step): for j in range(0, img.height, y_step): draw.putpixel((i, j), (255, 0, 0)) draw.save("dial_grid.png")然后在画图软件里打开dial_grid.png,对照词达人界面,把题目和选项所在的横纵坐标读出来,填回去。这个办法虽然原始,但比我见过的好几种“自动找区域方案”都靠谱。之前我在 Windows 11 上跑过一版带tkinter可视化选框的程序,但选完经常和实际截屏区域对不上,最后发现是高分屏缩放率在作怪,从那以后我每次调整屏幕参数都强制走一遍网格标定流程。
5. 避坑与常见问题:从屏幕缩放到 no answer 的排查记录
这部分是血泪经验,每条都是我实跑时遇到过的,不解决就跑不通。
5.1 现象:一切装好,但答题毫无反应
原因:pyautogui在 Windows 上默认的FAILSAFE模式会持续检测鼠标是否移动到屏幕左上角。如果你把鼠标刚好停在了 (0,0) 附近,程序会直接中断运行,且不报任何错误直到超时。
解决:在代码开头把pyautogui.FAILSAFE = False,或者养成鼠标停在屏幕右侧的习惯。当然,我不建议关掉它,因为它是防止程序失控的保命机制,更稳妥的做法是保留它,但别把鼠标放到左上角去。
5.2 现象:OCR 识别率奇低,题目总被截断
原因:词达人的界面并不是静止的,选项区域有动画和悬停效果,截屏时如果恰好碰到动画帧,文字会带残影,识别率直接腰斩。另外,region参数如果给的宽度不足,题目后半截会被切掉。
解决:把截屏区域向下扩展 80 像素,覆盖题目可能的第二行;并把截图转成灰度图前先做一次img.resize(2.0)放大两倍再识别。实测放大后识别率从 70% 提到 90%,速度只多了 100 毫秒。
img = pyautogui.screenshot(region=region) img = img.convert('L').resize((img.width * 2, img.height * 2))5.3 现象:答案匹配返回 None,明明题库里有
原因:OCR 把单词识别错了,最常见的是把 l 识别成 1,把 O 识别成 0,或者把 m 识别成 rn,这是 tesseract 的“经典迷惑行为”。相似度阈值设太高时,错一到两个字符就直接匹配失败。
解决:将匹配阈值从 0.66 降到 0.6 测试;同时建议给题库增加一个“拼音纠错映射表”,把 OCR 常见错误规则化,比如l -> 1 -> i,rn -> m,这一步能省下大量调试时间。
5.4 现象:程序提示“无可用窗口句柄”之类的话
原因:如果你用的是安卓模拟器(比如 MuMu、雷电),截图时截的是整个模拟器窗口,但工具内部如果检测窗口句柄失败,可能是因为模拟器使用了自己的渲染层,没有暴露标准的 Win32 窗口区域。
解决:把截图区域直接从屏幕坐标里取,不要调用窗口查找函数。模拟器窗口在指定坐标区绘图,程序只认屏幕坐标系即可。实测雷电模拟器在默认窗口模式下完全兼容,MuMu 需要把模拟器窗口设置成“自定义比例”。
5.5 现象:答题太快被平台限频
原因:词达人后端有基本的风控逻辑,同一用户每分钟提交答案次数超过阈值后,会触发验证或者直接无法下一题。
解决:KEY_INTERVAL调到 1.2 秒以上更稳,且单次连续答题不超过 100 题。这不是玄学,是实测的阈值:小于 0.8 秒持续 50 道题基本必触发验证。
6. 用题库扩充激活这工具:从词书文件到 JSON 的标准化转换
到这步,工具已经能跑,但它的价值上限完全取决于题库有多大。源码包里应该自带一份示例词库,规模大概是几百词,绝对不够用。以我实际折腾的经验看,真正好用的词达人词库来源有三类:教材配套词表、四六级/考研高频词表、以及你在词达人里自己收藏的生词本。这些来源的格式各不相同,统一转成标准 JSON 才是关键。
6.1 常见词表格式与转换方式
最常见的是两列或三列的纯文本词表:
abandon, v. 放弃;抛弃 absorb, v. 吸收;使专心 abuse, v. 滥用;虐待转换脚本非常简单,照着写即可:
import json entries = {} with open("wordlist.txt", "r", encoding="utf-8") as f: for line in f: parts = line.strip().split(",", 1) if len(parts) != 2: continue word, meaning = parts[0].strip(), parts[1].strip() entries[word] = { "meaning": meaning, "options": [meaning] # 先生成一条,之后靠手工或 AI 补干扰项 } with open("custom_bank.json", "w", encoding="utf-8") as f: json.dump(entries, f, ensure_ascii=False, indent=2)说明:这里生成的options只有正确答案一项,实际答题时程序会去词达人界面识别四个选项文本,然后和你题库里的meaning做包含匹配。也就是说,options这个字段在匹配逻辑里不是必需项,干扰项由界面本身提供,你的题库只需要提供正确释义即可。这是一个非常重要的理解点:这个工具不需要知道所有选项是什么,它只需要在四个选项里找到包含正确答案释义的那一项。
6.2 推荐:用 Excel 整理词表再导出
如果你的原始词表是 Excel 或者从某背单词 App 导出的 HTML,最省事的路径是先在 Excel 里整理成两列:单词和释义,然后另存为 CSV(编码选 UTF-8),再跑上面的脚本改成 CSV 解析版本,就只需改文件读取格式:
import csv with open("wordlist.csv", "r", encoding="utf-8-sig") as f: reader = csv.reader(f) for row in reader: if len(row) >= 2: word, meaning = row[0].strip(), row[1].strip() entries[word] = {"meaning": meaning}选utf-8-sig而不是utf-8是因为有些 Excel 导出的 CSV 会带 BOM 头,直接读会在第一个单词前面出现一个看不见的\ufeff导致匹配失败。这个细节我印象很深,当时排查了整整一个下午。
6.3 匹配过程的显示与调试
工具运行时,会在控制台里打印当前识别的题干、匹配到的释义、以及最终选中的选项文本。这个输出不是调试日志,我一般靠它来评估 OCR 和题库的健康度——如果连续出现匹配空结果,就说明 OCR 环节出问题了,调整截图区域或放大比例。
光有这么个“提示”还不够,你会发现就算匹配到了,鼠标点的位置也可能因为模拟器窗口缩放而偏移。这里面最常见的问题是:你手动调整了模拟器窗口大小,但截图区域没同步,导致点偏一个选项。我后来养成了一个习惯:首次运行前用pyautogui.position()打印鼠标实时坐标,把按钮中心点的坐标填进config.py,这样无论窗口怎么移动/缩放,工具都按屏幕绝对定位。
import pyautogui import time time.sleep(3) # 3 秒内把鼠标移到你要点击的选项上 x, y = pyautogui.position() print(f"当前坐标: ({x}, {y})")从那以后,我每次拿到这类 Python 自动化项目,都会先做三件事:确认 Python 版本不是最新版、显式指定 tesseract 路径、用网格标定法跑一遍截图区域。这三步走完,工具基本跑得顺滑。希望这篇拆解能帮你把这个 zip 里的源码真正用起来。
本文还有配套的精品资源,点击获取