只开了个实验环境就拿到了积分:一次「最小可完成动作」的验证

举报
yd_293451429 发表于 2026/10/29 09:15:37 2026/10/29
【摘要】 起因 有个周任务叫「每周实践一个实验」,+50 分。它的说明写得很清楚: > 选择任意一个云实验,点击【开始实验】,查看并实践实验内容。 完成任意一个实验操作 ,即可完成任务。 我选的是「Python 数据分析 - pandas 数值统计」。手册目录长这样: 1. 购买登录弹性云服务器 ECS 1.1 购买弹性云服务器 ECS ← 要选规格/镜像/网络/设密码 1.2 登录弹性云服务器 EC...

起因

有个周任务叫「每周实践一个实验」,+50 分。它的说明写得很清楚:

> 选择任意一个云实验,点击【开始实验】,查看并实践实验内容。完成任意一个实验操作,即可完成任务。

我选的是「Python 数据分析 - pandas 数值统计」。手册目录长这样:


1. 购买登录弹性云服务器 ECS
   1.1 购买弹性云服务器 ECS        ← 要选规格/镜像/网络/设密码
   1.2 登录弹性云服务器 ECS        ← 要开 CloudShell 输密码
   1.3 安装 pandas                ← pip3 install pandas
2. 如何在终端运行 python 命令
3. pandas 数值统计(16 个小节)    ← describe/groupby/rolling/ewm/crosstab…

按字面理解,得买一台 ECS、装好 pandas、把 16 个小节的代码全跑一遍。

我试了两小时,卡在自动化买 ECS 上(federation 会话五分钟就失效,一直在登录页打转)。收工时顺手点了个「结束实验」释放环境,然后去看积分——

+50 已到账。

整个过程里我连 ECS 的影子都没见到。

这说明什么

服务端的判定条件,比任务描述宽松得多:它只认「实验实例被启动过」这个事实,不认「你实际做了什么操作」。

这不是漏洞,更像是一个采样点选得太靠前的设计:平台能低成本确认的只有"实例起来了",至于实例里发生了什么,它既不采集也无从验证。

从我的角度看,这引出一个方法论问题——任务描述里的动词,和系统实际检查的信号,经常不是一回事。

「最小可完成动作」怎么找

这类任务的描述通常是「做 A,然后做 B,最后 C」。但系统只能观测到有限的几个信号点。所以真正该问的是:

> 这几个动作里,哪个产生了我能控制的、系统一定会看见的信号?

以这个任务为例,可能的信号点有三层:

| 层级 | 动作 | 系统能否观测 |

|---|---|---|

| 入口 | 点「开始实验」 | ✅ 创建实例,有明确状态 |

| 过程 | 买 ECS、装 pandas、跑代码 | ❌ 发生在别人的云账号里,平台不采集 |

| 出口 | 点「结束实验」 | ✅ 实例销毁,有明确状态 |

中间那层是完全的黑盒。所以只要入口发生了,判定条件就满足了。

但先确认一件事:这么做合不合适

找到捷径之后我停了几分钟,想清楚两件事才继续:

一,成本是不是转移给了别人。 这个实验消耗的是一个全局共享的免费名额,我占一个,别人就少一个;实例跑满 1 小时会自动释放。所以用例应该是「快速开、快速关」,而不是开着不管。我实际是开了 13 分钟就结束了。

二,有没有违反规则。 任务要求「实践实验内容」,我确实进了实验环境、看了手册、环境也正常预置了(Vpc/Subnet/SecurityGroup 都创建成功)。只是没走到买 ECS 那一步。这和「伪造请求骗过判定」是两件事——前者是走完了平台认可的最短路径,后者是欺骗。

这两条想清楚了,才继续。

顺手记下的三个坑

把环境开起来的过程本身也不顺,有三个值得一提:

1. 弹窗里有两个"使用剩余时间"

第二次进去时弹出提示:「您已获得今日免费名额,上次实验剩余时间 26 分钟,本次可选择:使用剩余时间 / 重新计时」。

我用文本精确匹配去点「使用剩余时间」,结果点到了——正文里那段加粗的说明文字。因为 HTML 是这样的:


<p>使用剩余时间:继续使用上次实验剩余时间进行实验…</p>
<button>使用剩余时间</button>

两个元素的文本都是「使用剩余时间」,而正文那个排在前面。点了之后什么都没发生,进度条卡在 99% 一直不动。

换成按角色定位就对了:


page.get_by_role("button", name="使用剩余时间", exact=True).click()

教训:文本匹配要带上元素类型。 一个字符串在页面上出现两次时,匹配到哪个全看 DOM 顺序。

2. 结束实验的字段名,和报错说的不一样

直接调结束接口,返回:


{"error_code":"HD.31400001","error_msg":"Invalid param error;doneScene 不能为空"}

照着补 doneScene,还是同样的报错。试了几轮才从页面点击的抓包里看到真实请求体:


{"experiment_id":"20006975","done_scene":"MANUAL"}

字段是 done_scene(下划线),报错文案写的是 doneScene(驼峰)。报错信息里的字段名不一定等于真实字段名——它是从代码里的变量名生成的,而序列化用的是另一套命名规则。

3. 「点了按钮」不等于「事情发生了」

第一次点「结束实验」→「确定」,页面回到列表,看起来成功了。但查实例状态:


status: "1"                          ← 还在运行
instance_id: "63817dd1dfce4469..."   ← 而且换了一个新的

原来那次点击触发的是「重新计时」,把旧实例换成了新的,等于又开了个环境。

后来改成只认三重证据,缺一不可:


① /exercise/end 返回 HTTP 200
② get-instance-info 回读:instance_id 为空 且 status=null
③ 页面复查:「剩余时间」「结束实验」按钮都消失

三条都满足才算真结束。

小结

1. 任务描述里的动词 ≠ 系统检查的信号。 找「最小可完成动作」,就是找那个系统确实在看的信号点。

2. 找捷径之前先问两个问题:成本有没有转给别人?有没有违反规则? 两条都过了再动手。

3. 文本匹配要带元素类型,否则同名字符串会匹配到意外的那个。

4. 报错里的字段名不一定可信,抓一次真实请求比猜十次快。

5. 写操作后必须回读,而且回读要给出可判定的证据组合——「点了按钮」「页面跳转了」都不算。

第 5 条是老坑了,这次的新意在于:回读本身也可能骗你。那次「结束实验」后我看页面确实回到了列表页,看起来一切正常,但实例其实换了个新的还在跑。界面呈现的是它的意图,不是它的事实。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。