liammtop 发表于 2025-5-24 18:53:30

薅华为云1000代金券攻略

建议把本文复制下来到markdown阅读器中阅读!{tieba27}
**问卷B**可再申请2张37元微认证代金券。——工作日每天18点前发放符合条件 **(必须前一天微认证通过且证书生成)的用户。**
就是说做完1~5项目的**拿完证书还要等一天**
不然大概率像我一样只能拿600了(目前在提工单看能不能拿到优惠券)
## **第一步:检查和报名** :

**活动链接 含AFF [点此进入活动](https://forum.naixi.net/goto.php?url=https%3A%2F%2Fedu.huaweicloud.com%2Fsignup%2Fa84b127961f4408bb69d560f48c5675d%3Fmedium%3Dshare_kfzlb%26invitation%3Dfcd83cbe1f19499caa81dade356bab3c)**

参加活动前先去[账号中心-基本信息](https://forum.naixi.net/goto.php?url=https%3A%2F%2Faccount.huaweicloud.com%2Fusercenter%2F%3Fregion%3Dcn-north-4%23%2Faccountindex%2FaccountInfo) 确保已经绑定邮箱,否则领券不正常

然后报名 (https://forum.naixi.net/goto.php?url=https%3A%2F%2Fedu.huaweicloud.com%2Fsignup%2Fa84b127961f4408bb69d560f48c5675d%3Fmedium%3Dshare_kfzlb%26invitation%3Dfcd83cbe1f19499caa81dade356bab3c)

含AFF,介意的麻烦自行去除,如果看完觉得有帮助,请帮个忙,感谢

进入页面点击报名,信息随便填,邮箱和手机号是对的就可以

点击下面的两个链接领优惠券(https://forum.naixi.net/goto.php?url=https%3A%2F%2Faccount.huaweicloud.com%2Fusercenter%2F%23%2FgetCoupons%3FactivityID%3DP250519080433786145MVJF0RBC7PW%26contentID%3DPCP2505190756275141QAH6KN0I0QSC7)

(https://forum.naixi.net/goto.php?url=https%3A%2F%2Faccount.huaweicloud.com%2Fusercenter%2F%23%2FgetCoupons%3FactivityID%3DP2505190810074330F9FL3G19P9B26%26contentID%3DPCP2505190806245341XT14RQ1MXGZ5A)

考完两门,五门后续考其他的需要填问卷领代金券再去买考试资格

活动报名后,通过以上**任意2门**微认证填写**[问卷A](https://forum.naixi.net/goto.php?url=https%3A%2F%2Fsurvey.huaweicloud.com%2Fsurvey%2F%23%2Fqtn%3Fid%3Dd3da780b2e5d49bbba8bc1c989529640)**可以一次性申请2张67元+1张57元;集齐5个云原生微认证**兑换云原生入门级开发者认证证书后填写****[问卷B](https://forum.naixi.net/goto.php?url=https%3A%2F%2Fsurvey.huaweicloud.com%2Fsurvey%2F%23%2Fqtn%3Fid%3Deeb2f0a80fc345aa8aeaf4a8b8e637b0)**可再申请2张37元微认证代金券。——工作日每天18点前发放符合条件(必须前一天微认证通过且证书生成)的用户。

!(https://i.miji.bid/2025/05/24/03692a4869e8a7e21469901896f4383f.png)

## 第二步,免费云电脑(选一个就行)(不做这步就看第四步)

#### 阿里云的无影云电脑(推荐)

支付宝扫码就可以登录,没用过的可以领一个月 [无影云电脑](https://forum.naixi.net/goto.php?url=https%3A%2F%2Fwuying.aliyun.com%2Flist) 点进去支付宝操作,搞完记得取消自动续费,领完下载客户端或者直接网页操作,推荐,用过的如果是学生,可以用300优惠券买这个

方法 (https://forum.naixi.net/goto.php?url=https%3A%2F%2Funiversity.aliyun.com%2F%3FclubTaskBiz%3DsubTask..11897123..10224..%26userCode%3Dvp0rgj0w) 到这里先领券

领完到[个人版云电脑月套包](https://forum.naixi.net/goto.php?url=https%3A%2F%2Fcommon-buy.aliyun.com%2F%3FcommodityCode%3Dgws_personaldurationpkg_public_cn%23%2Fbuy) 只能买铂金款

!(https://img.116119.xyz/img/2025/05/24/58979201f73389652b8261e4a1ad5e9a.png)

#### TOdesk 0.01六小时

(https://forum.naixi.net/goto.php?url=https%3A%2F%2Fpc.todesk.com%2F)

#### 领沃云电脑,每天有一点时长

(https://forum.naixi.net/goto.php?url=https%3A%2F%2Fgame.lingwoyun.cn%2F)

## 第三步,obs虚拟摄像头

用手机先给自己录一段视频,把手机放在面前,假装做题一分钟,然后传到云电脑里,可以用文叔叔

[文叔叔 - 传文件,找文叔叔(大文件、永不限速)](https://forum.naixi.net/goto.php?url=https%3A%2F%2Fwww.wenshushu.cn%2F)

在云电脑里下载安装obs [下载 | OBS](https://forum.naixi.net/goto.php?url=https%3A%2F%2Fobsproject.com%2Fzh-cn%2Fdownload)

安装后应该会有如图这个向导,选择只使用虚拟摄像头,没出现的话店场景集合右边的工具,点击自动配置向导

!(https://img.116119.xyz/img/2025/05/24/08a8564da07cf8cda2718b54452ae199.png)

!(https://img.116119.xyz/img/2025/05/24/0957be8603dcb033a48458e9f0e7b62d.png)

[!(https://img.116119.xyz/img/2025/05/24/567c6a3dbc5cadb81648316932cfcbf7.png)](https://forum.naixi.net/goto.php?url=https%3A%2F%2Fimg.st%2Fimage%2FL8Fq)

[!(https://img.116119.xyz/img/2025/05/24/e36d1bbe1f7326b410f6fa12d3ecdbf0.png)](https://forum.naixi.net/goto.php?url=https%3A%2F%2Fimg.st%2Fimage%2FLVUh)

上面这些操作搞完后去(https://forum.naixi.net/goto.php?url=https%3A%2F%2Fwww.onlinemictest.com%2Fzh%2Fwebcam-test%2F) 测试一下

## 第四步,安装防切屏检测(如果不用云电脑,安装这个)

这一步如果你用了第二步,那么无需操作,直接看后面的

油猴脚本:

```
// ==UserScript==
// @name         通用阻止切屏检测
// @namespace    http://tampermonkey.net/
// @version      0.1.0
// @description尝试阻止各类网站的切屏、焦点丢失等检测
// @author       nodeseek@小号 && Gemini
// @match      http://*/*
// @match      https://*/*
// @run-at       document-start
// @grant      unsafeWindow
// @license      GPL-3.0
// ==/UserScript==

(function () {
    'use strict';
    const window = unsafeWindow; // 使用原始 window 对象

    // 黑名单事件,这些事件的监听器将被阻止
    const blackListedEvents = new Set([
      "visibilitychange", // 页面可见性改变
      "blur",             // 元素或窗口失去焦点
      "focus",            // 元素或窗口获得焦点 (某些检测可能反向利用focus)
      "pagehide",         // 页面隐藏(例如导航到其他页面)
      "freeze",         // 页面被冻结 (较新的事件)
      "resume",         // 页面从冻结状态恢复 (较新的事件)
      "mouseleave",       // 鼠标移出元素(通常是 document 或 body)
      "mouseout",         // 鼠标移出元素(更通用的移出,但要小心副作用)
      // "focusout",      // 元素将要失去焦点(与blur类似,但更通用,看情况添加)
      // "focusin",       // 元素将要获得焦点(与focus类似,看情况添加)
    ]);

    // 白名单属性,这些属性在 document 对象上将被伪造
    const spoofedDocumentProperties = {
      hidden: { value: false, configurable: true },
      mozHidden: { value: false, configurable: true }, // Firefox (旧版)
      msHidden: { value: false, configurable: true },// Internet Explorer
      webkitHidden: { value: false, configurable: true }, // Chrome, Safari, Opera (旧版 Blink/WebKit)
      visibilityState: { value: "visible", configurable: true },
      hasFocus: { value: () => true, configurable: true }
    };

    // 需要清空/置空的事件处理器属性 (on-event handlers)
    const eventHandlersToNullifyDocument = [
      "onvisibilitychange",
      "onblur",
      "onfocus",
      "onmouseleave",
      "onmouseout",
      // "onfocusout",
      // "onfocusin",
      "onpagehide",
      "onfreeze",
      "onresume"
    ];

    const eventHandlersToNullifyWindow = [
      "onblur",
      "onfocus",
      "onpagehide",
      "onpageshow", // 有些检测可能通过 pageshow 结合 persisted 属性判断
      "onfreeze",
      "onresume",
      "onmouseleave", // window 也有 onmouseleave
      "onmouseout"
    ];

    const isDebug = false; // 设置为 true 以启用调试日志
    const scriptPrefix = "[通用阻止切屏检测]";
    const log = console.log.bind(console, `%c${scriptPrefix}`, 'color: #4CAF50; font-weight: bold;');
    const warn = console.warn.bind(console, `%c${scriptPrefix}`, 'color: #FFC107; font-weight: bold;');
    const error = console.error.bind(console, `%c${scriptPrefix}`, 'color: #F44336; font-weight: bold;');
    const debug = isDebug ? log : () => { };

    /**
   * 伪装函数的 toString 方法,使其看起来像原始函数。
   * @param {Function} modifiedFunction 被修改的函数
   * @param {Function} originalFunction 原始函数
   */
    function patchToString(modifiedFunction, originalFunction) {
      if (typeof modifiedFunction !== 'function' || typeof originalFunction !== 'function') {
            warn("patchToString: 传入的参数不是函数。", modifiedFunction, originalFunction);
            return;
      }
      try {
            const originalToStringSource = Function.prototype.toString.call(originalFunction);
            modifiedFunction.toString = () => originalToStringSource;

            // 进一步伪装 toString.toString
            const originalToStringToStringSource = Function.prototype.toString.call(originalFunction.toString);
            Object.defineProperty(modifiedFunction.toString, 'toString', {
                value: () => originalToStringToStringSource,
                enumerable: false,
                configurable: true, // 保持可配置,以防万一
                writable: false
            });
            debug(`patchToString applied for: ${originalFunction.name || 'anonymous function'}`);
      } catch (e) {
            error("patchToString failed:", e, "for function:", originalFunction.name);
      }
    }


    /**
   * 劫持并修改对象的 addEventListener 方法。
   * @param {EventTarget} targetObject 要劫持的对象 (window, document, Element)
   * @param {string} objectName 用于日志记录的对象名称
   */
    function patchAddEventListener(targetObject, objectName) {
      if (!targetObject || typeof targetObject.addEventListener !== 'function') {
            warn(`Cannot patch addEventListener for invalid target: ${objectName}`);
            return;
      }
      const originalAddEventListener = targetObject.addEventListener;

      targetObject.addEventListener = function (type, listener, optionsOrCapture) {
            if (blackListedEvents.has(type.toLowerCase())) {
                log(`BLOCKED ${objectName}.addEventListener: ${type}`);
                return undefined; // 阻止添加黑名单中的事件监听器
            }
            debug(`ALLOWED ${objectName}.addEventListener: ${type}`, listener, optionsOrCapture);
            return originalAddEventListener.call(this, type, listener, optionsOrCapture);
      };

      patchToString(targetObject.addEventListener, originalAddEventListener);
      log(`${objectName}.addEventListener patched.`);
    }

    /**
   * 劫持并修改对象的 removeEventListener 方法 (可选,但建议一起修改)。
   * @param {EventTarget} targetObject 要劫持的对象
   * @param {string} objectName 用于日志记录的对象名称
   */
    function patchRemoveEventListener(targetObject, objectName) {
      if (!targetObject || typeof targetObject.removeEventListener !== 'function') {
            warn(`Cannot patch removeEventListener for invalid target: ${objectName}`);
            return;
      }
      const originalRemoveEventListener = targetObject.removeEventListener;

      targetObject.removeEventListener = function (type, listener, optionsOrCapture) {
            if (blackListedEvents.has(type.toLowerCase())) {
                log(`Original call to ${objectName}.removeEventListener for blacklisted event '${type}' would have been ignored by our addEventListener patch anyway. Allowing native call if needed.`);
                // 即使我们阻止了 addEventListener,原始的 removeEventListener 仍然应该能安全调用
                // 因为如果监听器从未被添加,调用 remove 也无害。
            }
            debug(`PASSTHROUGH ${objectName}.removeEventListener: ${type}`, listener, optionsOrCapture);
            return originalRemoveEventListener.call(this, type, listener, optionsOrCapture);
      };
      patchToString(targetObject.removeEventListener, originalRemoveEventListener);
      log(`${objectName}.removeEventListener patched.`);
    }


    /**
   * 修改对象上的属性,使其返回伪造的值。
   * @param {object} targetObject 目标对象 (e.g., document)
   * @param {object} propertiesToSpoof 属性描述对象
   * @param {string} objectName 对象名称
   */
    function spoofProperties(targetObject, propertiesToSpoof, objectName) {
      if (!targetObject) {
            warn(`Cannot spoof properties for invalid target: ${objectName}`);
            return;
      }
      for (const prop in propertiesToSpoof) {
            if (Object.prototype.hasOwnProperty.call(propertiesToSpoof, prop)) {
                try {
                  Object.defineProperty(targetObject, prop, propertiesToSpoof);
                  debug(`Spoofed ${objectName}.${prop}`);
                } catch (e) {
                  error(`Failed to spoof ${objectName}.${prop}:`, e);
                }
            }
      }
      log(`${objectName} properties spoofed.`);
    }

    /**
   * 清空或置空对象上的事件处理器属性。
   * @param {object} targetObject 目标对象
   * @param {string[]} eventHandlerNames 事件处理器名称数组
   * @param {string} objectName 对象名称
   */
    function nullifyEventHandlers(targetObject, eventHandlerNames, objectName) {
      if (!targetObject) {
            warn(`Cannot nullify event handlers for invalid target: ${objectName}`);
            return;
      }
      eventHandlerNames.forEach(handlerName => {
            try {
                Object.defineProperty(targetObject, handlerName, {
                  get: () => {
                        debug(`Access to ${objectName}.${handlerName} (get), returning undefined.`);
                        return undefined;
                  },
                  set: (newHandler) => {
                        log(`Attempt to set ${objectName}.${handlerName} blocked.`);
                        if (typeof newHandler === 'function') {
                           // 可以选择性地调用 newHandler,或者完全阻止
                           // debug(`(Blocked) Handler function was:`, newHandler);
                        }
                  },
                  configurable: true // 保持可配置,以便脚本可以多次运行或被其他脚本修改
                });
                debug(`Nullified ${objectName}.${handlerName}`);
            } catch (e) {
                error(`Failed to nullify ${objectName}.${handlerName}:`, e);
            }
      });
      log(`${objectName} on-event handlers nullified.`);
    }

    // --- 开始执行 ---

    log("Script starting...");

    // 1. 劫持 window 和 document 的 addEventListener/removeEventListener
    patchAddEventListener(window, "window");
    patchRemoveEventListener(window, "window"); // 也 patch removeEventListener 以保持一致性
    patchAddEventListener(document, "document");
    patchRemoveEventListener(document, "document");

    // 2. 修改 document 的属性
    spoofProperties(document, spoofedDocumentProperties, "document");

    // 3. 置空 document 和 window 上的事件处理器
    nullifyEventHandlers(document, eventHandlersToNullifyDocument, "document");
    nullifyEventHandlers(window, eventHandlersToNullifyWindow, "window");

    // 4. 对于 document.body,需要等待 DOMContentLoaded
    // 使用 MutationObserver 确保 body 存在时立即 patch,比 DOMContentLoaded 更早且更可靠
    const observer = new MutationObserver((mutations, obs) => {
      if (document.body) {
            patchAddEventListener(document.body, "document.body");
            patchRemoveEventListener(document.body, "document.body");
            // 对于 document.body,也可以考虑 nullify onmouseleave, onmouseout 等
            nullifyEventHandlers(document.body, ["onmouseleave", "onmouseout", "onblur", "onfocus"], "document.body");
            log("document.body patched via MutationObserver.");
            obs.disconnect(); // 完成任务后断开观察者
      }
    });

    if (document.body) { // 如果 body 已经存在 (不太可能在 document-start,但以防万一)
      patchAddEventListener(document.body, "document.body");
      patchRemoveEventListener(document.body, "document.body");
      nullifyEventHandlers(document.body, ["onmouseleave", "onmouseout", "onblur", "onfocus"], "document.body");
      log("document.body patched directly.");
    } else {
      observer.observe(document.documentElement || document, { childList: true, subtree: true });
    }


    // 5. 调试:劫持计时器 (如果 isDebug 为 true)
    if (isDebug) {
      const originalSetInterval = window.setInterval;
      window.setInterval = function(...args) {
            const id = originalSetInterval.apply(this, args);
            debug("calling window.setInterval", id, args);
            return id;
      };
      patchToString(window.setInterval, originalSetInterval);

      const originalSetTimeout = window.setTimeout;
      window.setTimeout = function(...args) {
            const id = originalSetTimeout.apply(this, args);
            debug("calling window.setTimeout", id, args);
            return id;
      };
      patchToString(window.setTimeout, originalSetTimeout);
      log("Timer functions (setInterval, setTimeout) wrapped for debugging.");
    }

    log("Script execution finished. Monitoring active.");

})();
```

## 第五步,开始做题和免费ai推荐

站里已经有大佬把实验题整理好了,我就不复述一遍了,我来推荐点AI,不建议截图问,太慢了,直接ocr

推荐 (https://forum.naixi.net/goto.php?url=https%3A%2F%2Fgithub.com%2Fhiroi-sora%2FUmi-OCR) ocr之后问ai比较快

[腾讯元宝 - 轻松工作 多点生活](https://forum.naixi.net/goto.php?url=https%3A%2F%2Fyuanbao.tencent.com%2Fchat%2FnaQivTmsDa) 开启联网搜索,R1或者V3都可以

(https://forum.naixi.net/goto.php?url=https%3A%2F%2Fwww.genspark.ai%2F) 注册应该是会送1000积分,差不多够了

华为云的AI,对自家产品还是比较了解的,有些题目是问华为云相关的,可以用它

!(https://img.meituan.net/csc/1bcf89e097513f4281b66ee9bbc096461571505.png)

### 题库和他人整理的实验:

实验考试 :[华为云云原生认证心得,含完整前5个微认证实验教程](https://www.nodeseek.com/post-345011-1)

实验考试题目:
`云原生基础设施之容器入门`:

```txt
本次实验主要包含3个实验:
前置要求:无
任务1:dockerfile构建容器镜像
得分点:能正确创建名为httpd:v1的镜像,并正常运行。
其中dockerfile的部分参数如下:
① 基础镜像:httpd
② 维护者:123@huawei.com
③ 端口:80
④ 运行命令:echo "dockerfile test"> /usr/local/apache2/htdocs/index.html
⑤ 以下为dockerfile模板,可根据此模板修改内容:
FROM centos:centos7
MAINTAINER Iris@huawei.com
EXPOSE 80
RUN yum install -y httpd vi && yum clean all
使用docker run以该镜像运行容器,并借助-p参数指定访问端口为80。在浏览器内输入http://EIP:80。出现dockerdile test文字则证明任务完成。
本任务中需注意以下内容:
(1)使用错误的命名不得分
(2)多或者少开放端口不得分
任务2:搭建私有镜像仓库
得分点:成功创建私有镜像仓库并且成功上传镜像.
1.搭建私有镜像仓库,私有镜像仓库服务监听端口为5000。修改容器httpd:v1的镜像名称后,将该容器上传至私有镜像仓库。
2.在终端输入curl -X GET http://localhost:5000/v2/httpd/tags/list命令查看仓库镜像信息。出现{"name":"httpd","tags":["v1"]}结果,任务完成。
本任务中需注意以下内容:
(1)使用错误的镜像仓库监听端口不得分
(2)使用错误的镜像名称不得分
注意:在此部分完成以上的时候可以多刷新几次浏览器,进行任务3的时候禁止刷新。
任务3:容器生命周期管理
得分点:成功完成生命周期管理任务。
对httpd:v1容器及镜像执行暂停、恢复、停止、重启、删除镜像、删除镜像的操作。
输入:docker rmi httpd:v1命令,出现:Untagged: httpd:v1则证明任务完成
本任务中需注意以下内容:
(1)输入至错误文件、输入非要求内容不得分
```

`云原生基础设施之容器进阶`:

```txt
2.3实验内容
本次实验主要包含3个实验:
前置要求:无
任务1:使用cgroup实现资源限制
得分点:能对容器实现CPU限制。
运行压力测试容器progrium/stress,限制CPU使用率为70%(可输入top命令验证结果)。
在终端/sys/fs/cgroup/cpu/docker/容器ID/文件夹下,输入命令cat cpu.cfs_quota_us。
显示70000则证明成功。
本任务中需注意以下内容:
(1)使用错误的限额比例不得分
(2)输入非cat cpu.cfs_quota_us的错误命令不得分
任务2:搭建容器bridge网络
得分点:成功搭建bridge网络并达成容器网络互通。
1.创建用户自定义网桥,指定子网为173.18.0.0/16,网关为173.18.0.1。
2.运行两个centos容器并挂载到自定义网桥。
3.进入任意一个容器,在容器内ping另一个容器的ip地址。出现以下结果,任务完成。
输入:ping 173.18.0.2命令(此命令可以多输几次),返回下图内容
本任务中需注意以下内容:
(1)建议提前拉取centos镜像
任务3:容器挂载存储卷
得分点:成功挂载volume并实现持久化存储。
使用docker managed volume挂载到容器,在容器内输入echo "this is page from docker managed volume. " > index.html。删除该容器。
在宿主机挂载原路径中通过cat index.html命令查看文件内容,出现“this is page from docker managed volume.”则任务完成。
本任务中需注意以下内容:
(1)可使用任意镜像完成该实验,如httpd、centos镜像等
```

amoy 发表于 2025-5-24 18:54:48

已经全考完了,不过这个防切屏检测和obs有点意思,收藏一下备用
页: [1]
查看完整版本: 薅华为云1000代金券攻略