dsh-educoder:EduCoder 作业全自动化插件

前言

DeepSeek Harness (DSH) 的核心理念是“一切皆插件”。在开发或使用 DSH 进行自动化任务时,往往需要编写脚本调用外部接口。对于头歌(EduCoder)这类作业平台,通常的自动化方案需要浏览器自动化、截图识别或 OCR,这会增加复杂度并消耗资源。

dsh-educoder 是一个直接针对 EduCoder 平台 JSON 接口开发的 DSH 插件。它通过全量扫描账号未完成的作业并一次性解决,实现了“零 token”扫描和“零 token”选择题。本插件不依赖浏览器,仅使用平台公开接口,适合需要在 DSH 流程中自动处理 EduCoder 作业的场景。

插件概况

  • 名称:dsh-educoder
  • 所有者:isheng-eqi
  • 类别:工作流
  • 许可证:MIT

核心价值:
1. 全量扫描:一键扫描账号下所有未完成的作业。
2. 低 token 设计:扫描过程零 token,选择题零 token(通过平台响应回吐答案键),仅代码题调用模型。
3. 真实提交:自动执行真实的提交和评测流程,消耗评测次数。

安装与启用

插件包名为 dsh-educoder,bundle 行 id 为 educoder。推荐使用预构建的 npm 包,避免本地构建授权问题。

在 DSH 的插件管理中,执行以下命令之一:

# npm 安装(推荐)
#   target: dsh-educoder

# 从 GitHub 安装
#   target: github:isheng-eqi/dsh-educoder

安装后,在 ~/.dsh/profiles/<profile>/cordis.patch.yml 文件中会出现 educoder 配置项。配置支持热应用,修改后无需重启 DSH。

配置项

在 DSH 的插件设置界面或配置文件中填写以下参数:

键 默认 说明
login / password 空 头歌账号。首次登录后复用会话 cookie,密码不直接显示在对话中。
sessionFile ~/.educoder/session.json 会话缓存路径,与 educoder-lab CLI 共享。
provider / model 空 生成答案用的模型;留空则使用当前会话模型。
maxAttempts 3 每道代码题最多重试次数。
maxTokens 8000 单次生成上限。
gradeTimeoutSec 180 单次评测最长等待时间。
pollIntervalSec 3 轮询评测结果的间隔。
challengeLimit 0 单份作业中 0 表示一次做完所有未通过关卡。
homeworkLimit 0 单次全量扫描最多处理几份作业;0 表示不限。
toolTimeoutMinutes 45 工具整体超时时间。

典型用法

1. 账号检测与课程列表

在提交任何作业前,先检查账号连接状态。只列出课程不能证明会话有效(/courses.json 不需要登录),必须读取一次关卡数据。

educoder_account  url: <你的作业链接>

2. 扫描未完成作业

零 token 扫描账号(或指定一门课)的所有作业,仅读取数据,不提交。

educoder_sweep  mode=scan

3. 一次性解决所有作业

执行真正的解决流程。选择题自动从平台响应获取答案键,无需模型;代码题调用模型生成并提交评测。

educoder_sweep  mode=solve

4. 单份作业处理

针对特定作业进行巡检或解决。

# 巡检模式,只读不提交
educoder_homework  url: <作业链接>  mode=survey

# 解决模式,默认
educoder_homework  url: <作业链接>  mode=solve

关键实现要点

插件基于对 EduCoder 平台接口的实测实现,核心逻辑如下:

  • 签名机制:每个请求携带 X-EDU-Type/Timestamp/Signature。签名算法为 md5(base64("method=<M>&ak=<AK>&sk=<SK>&time=<epoch-ms>"))。AK/SK 为平台前端 bundle 中的公开常量。
  • 关卡遍历:平台无“获取第 N 关”接口。插件先通过 prev_game 回退到未通过关卡的起点,再向前遍历。通过一关后需重新读取该关卡,因为 next_game 在通过前为 null。
  • 一次评测:一个关卡的多个文件整体评测。上传时设置 evaluate: 0,待所有文件传完再触发一次 game_build.json,避免多次触发导致半成品评测浪费配额。
  • 评测判定:等待 game.evaluate_count 真正上涨,确认新一轮评测开始;随后等待两次轮询结果一致。game.status == 2 直接判定通过。
  • 占位符处理:平台填空题的占位符是 —(U+2014),非合法代码。如果答案中保留该字符,插件会直接本地重试,不浪费评测次数。
  • 失败反馈:不截断两边输出,而是定位第一处差异(行/列 + 上下文),以便模型快速修正。
  • 会话失效检测:平台返回 401 时 HTTP 状态码为 200。插件检测到 body 中的 {"status":401} 会自动触发重登,并在任何写入操作前执行。
  • 会话验证:/courses.json 不需要登录也返回数据,因此不能用来验证凭据。插件将会话校验放在第一次关卡读取上。

适用场景与注意

  • 真实提交:mode=solve 会真实提交到平台并消耗评测次数。不确定时请先用 mode=survey。
  • 账号安全:驱动的是配置中填写的账号,请勿指向他人账号。
  • 权限与缓存:会话缓存文件以 0600 权限写入,仅本机可读。
  • 公开密钥:AK/SK 为平台公开常量,插件不涉及第三方密钥。
  • 非官方客户端:这是一个非官方自动化客户端,请在头歌平台条款允许的范围内使用。
  • 代码修改:如果修改了 index.js 或 lib/*.js,必须重启 DSH(dsh web)。DSH 按包名缓存模块,同一进程内不会重新加载同名包。

总结

dsh-educoder 通过精准的 API 操作和低 token 策略,将 EduCoder 作业自动化集成到了 DSH 生态中。它适合需要在 DSH 流程中自动处理大量作业、追求成本控制和操作效率的开发者。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜