V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wangguo1230
V2EX  ›  分享发现

华为云学堂集证有礼挑战!动动手领代金券新手速通教程

  •  
  •   wangguo1230 · 8 天前 · 601 次点击

    先说活动奖励

    🎁 积分兑换好礼一览(限量奖品先到先得)

    以下是活动奖励,大家跟着我的步骤做任务轻轻松松能得 16 分,也就是 800 云资源券。

    积分数 可兑换奖品( 2 选 1 ) 限量说明
    4 分 200 元云资源券 无限制
    8 分 400 元云资源券 无限制
    12 分 600 元云资源券
    400 元云资源券 + 开发者定制帆布包
    帆布包限量
    14 分 700 元云资源券
    1099 元工作级认证代金券
    代金券限量 50 张
    16 分 800 元云资源券
    600 元云资源券 + 云宝盲盒
    盲盒限量 100 个
    20 分 1000 元云资源券
    700 元云资源券 + 开发者定制双肩包
    双肩包限量 50 个
    50 分 1200 元云资源券
    900 元云资源券 + 开发者定制水杯
    水杯限量 50 个
    积分榜二(≥100 分) 1500 元云资源券
    1200 元云资源券 + 华为耳机 FreeBuds SE2
    限量
    积分榜一(≥200 分) 2000 元云资源券
    1500 元云资源券 + 华为手环 9
    限量

    积分说明:

    ( 1 )本人考证赢积分:自己微认证考证积分上限 18 分

    ( 2 )邀请好友赢积分:本人通过以上任意 1 门微认证后,邀请好友报名,好友通过以上微认证后,邀请人可获得 1 门/1 分。

    ( 3 )积分数据统计周期:仅统计8 月 25 日—9 月 25 日期间的考试数据(首次考取以上认证可参与积分,重复考取过往已通过认证不积分)

    ⚠️ 注意事项:

    • 所有奖品限量,必须积分足额后填写兑换问卷,否则兑换无效。
    • 限量奖品库存为 0 时,将自动替换为对应档位的云资源券。
    • 兑换问卷填写截止时间:2025 年 10 月 8 日 24:00

    📣 分享有礼奖励表(邀请好友报名即可领取云资源券)

    邀请人数 可领取云资源代金券
    5 人 ¥50 云资源券
    10 人 ¥100 云资源券
    20 人 ¥200 云资源券
    30 人 ¥300 云资源券
    50 人 ¥500 云资源券
    100 人 ¥1000 云资源券
    榜二(≥120 人) ¥1200 云资源券
    榜一(≥150 人) ¥1500 云资源券

    ✅ 查看邀请人数:点击活动页面右上角「分享有礼」按钮,即可查看已成功邀请报名的人数。 🎁 所有奖励将在活动结束后统一发放,按最终邀请人数对应档位发放云资源券。 ⚠️ 仅限个人实名账号参与,企业账号不计入统计。

    怎么去做任务

    由于这个活动入口不是特别好找,大家可以点击我的AFF 地址参与任务,这样我也有分享有礼,谢谢大家。

    第一步: 华为账号绑定邮箱,已经绑定朋友们可忽略,未绑定的一定要先绑定,因为这个活动的前提条件是绑定邮箱,并且邮箱有三天的审核期,也就是说三天后才会生效,我把绑定邮箱的地址给大家贴出来,大家可以直接点击去绑定邮箱。

    绑定华为云邮箱的地址:地址

    第二步: 活动报名,领取微认证代金券

    注意:链接点击一次只能领取一张代金券,两张需要点击链接两次,以此类推。

    第三步: 报名参加华为云微认证专场,这是我翻出来的可以和集证有礼一块做的任务,两个任务可以同时完成,已经做过的可以忽略。

    第四步: 进入考证入口,马上就完事了,大家再坚持一下。(小声嘀咕:其实是刚开始,哈哈哈)

    参与 1 元购🧠微认证(叠加上面领的优惠券后 1 元)获取积分,注意:免费激活的微认证不算积分,所以大家一定要选 1 元微认证,下面是微认证入口列表:

    序号 认证名称 积分 价格(元) 购买入口
    1 ModelArts 实现零售商客户分群 2 分 ¥28 点击进入
    2 实现图片压缩及水印添加 2 分 ¥28 点击进入
    3 基于鲲鹏搭建 Zabbix 分布式监控系统 2 分 ¥28 点击进入
    4 听歌识曲 - 抖音背景音乐识别 2 分 ¥28 点击进入
    5 华为云数据库服务实践 2 分 ¥28 点击进入
    6 华为云计算服务实践 2 分 ¥28 点击进入
    7 HCCDA 入门级开发者认证(除大数据) 4 分 ¥700 点击进入
    8 HCCDP 工作级开发者认证 4 分 ¥1100 点击进入
    9 点击了解更多认证(考取同样可以积分)—免费激活微认证不算积分 2 分 / /

    ✅ 微认证最多可获得 18 分(上限 9 门),开发者认证无积分上限
    ⚠️ 微认证考试通过后需手动点击“获取证书”按钮,成功生成证书 + 活动报名才可计入积分
    🎁 完成 4 门微认证后可申请 ¥699 开发者认证代金券(限量发放)

    坚持一下,马上就要完成了(#^.^#)

    注意:一定要等邮箱审核通过再进行微认证(新绑定的邮箱要三天才可以哈)。大家:为什么?因为官方说微认证证书需要发到邮箱里面。

    接下来以华为云计算服务实践为例:

    第一步:购买认证

    1. 点击购买认证按钮,跳转至购买页面

    Pasted image 20250825200215.png

    1. 点击立即购买按钮

    Pasted image 20250825200340.png

    1. 订单确认

    全勾上就行,这一步不选优惠券,在下一步。点击去支付按钮

    Pasted image 20250825200501.png

    1. 重要的来了,点击代金券 选择27的代金券,选完后就是1 元,然后大家支付就可以啦。

    Pasted image 20250825200614.png

    1. 查看已购买的服务(这步只是能看到自己买的服务,没有其他的作用 ̄へ ̄)

    地址给大家贴出来了,大家直接点击就可以看到自己购买的服务啦。

    第二步: 考试获取证书

    大家如果没有关闭之前微认证服务的可以直接使用之前的浏览器页签,这步主要是大家可以看到自己进行中的微认证列表。

    进入自己进行中的微认证页面,一定要点击我的微认证!!!,具体看图。

    Pasted image 20250825201949.png

    点击对应的微认证服务,就可以跳到微认证页面啦。

    Pasted image 20250825202242.png

    点击考试就可以考试啦,那大家不会怎么办,别慌,考试有妙招(#^.^#),看下方:

    其实这步是最简单的,在大模型百花齐放的时代,大家可以选择自己喜欢(我试过通义灵问可以),最好支持多模态(这样可以直接截图)的大模型进行考试就好啦。

    至此大家已经获取 2 积分,剩下的积分大家继续参考上面的 考证入口 ,继续购买考试就可以啦。

    码子不易,恳请大家给点个赞,谢谢 Thanks♪(・ω・)ノ

    其他:

    🧪 完成云实验任务(进度 100%)即可抽奖一次

    每人仅有一次抽奖机会,务必先完成任意实验进度 100%再抽奖。

    内心 Tips:反正我是没抽中,大家可以试试,抽中的可以发在评论区,哈哈哈哈。

    实验名称 实验入口
    华为云教你一键安装宝塔面板 点击进入
    Spring Boot 接入 DeepSeek 深度求索 点击进入
    轻松快速上手 Docker 点击进入
    完成上述任意云实验进度 100%可参与抽奖,点此抽奖(每人仅有一次抽奖机会,务必先完成任意实验进度 100%再抽奖,若先抽奖再完成实验则无法获得奖品)

    已完成实验查看入口:我的→我的学堂→我的实验

    四、空间案例抽奖

    **点此免费领取华为开发者空间**,然后完成下方任意 1 个案例实践后,在论坛贴评论区发布:案例名称+完成案例实践截图+心得,即可参与抽奖。

    指定空间案例(含实操入口)
    基于 DeepSeek 和 Dify 构建心理咨询师应用
    基于开发者空间搭建知识库构建儿科医生应用
    基于仓颉编程语言+DeepSeek 实现智能聊天助手开发秘籍
    基于 DeepSeek+Cherry Studio 构建模拟面试助手
    FastGPT 问答系统实战:知识库检索×联网搜索
    基于 DeepSeek+Dify 构建财务报表分析模型
    奖品 数量(个)
    开发者定制水杯 5
    开发者定制双肩包 5
    云宝盲盒 10
    定制雨伞 10
    开发者定制帆布袋 25

    不要再往下看啦,没啦

    7 条回复    2025-08-27 19:06:05 +08:00
    wangguo1230
        1
    wangguo1230  
    OP
       8 天前
    wangguo1230
    几秒前
    考试大家可以把手机打开,和大模型聊天来输入问题,获取到答案,或者可以用油猴脚本,我想把脚本放到这里面,但是放不开了
    wangguo1230
        2
    wangguo1230  
    OP
       8 天前
    // ==UserScript==
    // @name 华为云考试助手 (复制题目+防切屏)
    // @namespace http://tampermonkey.net/
    // @version 2.0
    // @description 在华为云微认证考试页面添加一个按钮,用于一键复制所有题目为 JSON 格式,并集成防切屏检测功能。
    // @author linuxdo
    // @match https://connect.huaweicloud.com/courses/exam*
    // @run-at document-start
    // @grant GM_addStyle
    // @grant GM_setClipboard
    // @grant unsafeWindow
    // @license MIT
    // ==/UserScript==

    (function() {
    'use strict';

    // =========================================================================
    // Part 1: 通用阻止切屏检测模块
    // Code from "通用阻止切屏检测" script to prevent focus/visibility tracking.
    // This part runs at document-start to patch browser APIs immediately.
    // =========================================================================
    const window = unsafeWindow; // 使用原始 window 对象

    // 黑名单事件,这些事件的监听器将被阻止
    const blackListedEvents = new Set([
    "visibilitychange", "blur", "focus", "pagehide", "freeze", "resume",
    "mouseleave", "mouseout"
    ]);

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

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

    const eventHandlersToNullifyWindow = [
    "onblur", "onfocus", "onpagehide", "onpageshow", "onfreeze", "onresume",
    "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 : () => {};

    function patchToString(modifiedFunction, originalFunction) {
    if (typeof modifiedFunction !== 'function' || typeof originalFunction !== 'function') return;
    try {
    modifiedFunction.toString = () => Function.prototype.toString.call(originalFunction);
    } catch (e) {
    error("patchToString failed:", e, "for function:", originalFunction.name);
    }
    }

    function patchAddEventListener(targetObject, objectName) {
    if (!targetObject || typeof targetObject.addEventListener !== 'function') return;
    const originalAddEventListener = targetObject.addEventListener;
    targetObject.addEventListener = function(type, listener, optionsOrCapture) {
    if (blackListedEvents.has(type.toLowerCase())) {
    log(`BLOCKED ${objectName}.addEventListener: ${type}`);
    return undefined;
    }
    return originalAddEventListener.call(this, type, listener, optionsOrCapture);
    };
    patchToString(targetObject.addEventListener, originalAddEventListener);
    }

    function patchRemoveEventListener(targetObject, objectName) {
    if (!targetObject || typeof targetObject.removeEventListener !== 'function') return;
    const originalRemoveEventListener = targetObject.removeEventListener;
    targetObject.removeEventListener = function(type, listener, optionsOrCapture) {
    return originalRemoveEventListener.call(this, type, listener, optionsOrCapture);
    };
    patchToString(targetObject.removeEventListener, originalRemoveEventListener);
    }

    function spoofProperties(targetObject, propertiesToSpoof, objectName) {
    if (!targetObject) return;
    for (const prop in propertiesToSpoof) {
    if (Object.prototype.hasOwnProperty.call(propertiesToSpoof, prop)) {
    try {
    Object.defineProperty(targetObject, prop, propertiesToSpoof[prop]);
    } catch (e) {
    error(`Failed to spoof ${objectName}.${prop}:`, e);
    }
    }
    }
    }

    function nullifyEventHandlers(targetObject, eventHandlerNames, objectName) {
    if (!targetObject) return;
    eventHandlerNames.forEach(handlerName => {
    try {
    Object.defineProperty(targetObject, handlerName, {
    get: () => undefined,
    set: () => { log(`Attempt to set ${objectName}.${handlerName} blocked.`); },
    configurable: true
    });
    } catch (e) {
    error(`Failed to nullify ${objectName}.${handlerName}:`, e);
    }
    });
    }
    wangguo1230
        3
    wangguo1230  
    OP
       8 天前
    // --- 开始执行防切屏 ---
    log("Anti screen-switch script starting...");
    patchAddEventListener(window, "window");
    patchRemoveEventListener(window, "window");
    patchAddEventListener(document, "document");
    patchRemoveEventListener(document, "document");
    spoofProperties(document, spoofedDocumentProperties, "document");
    nullifyEventHandlers(document, eventHandlersToNullifyDocument, "document");
    nullifyEventHandlers(window, eventHandlersToNullifyWindow, "window");
    const observer = new MutationObserver((mutations, obs) => {
    if (document.body) {
    patchAddEventListener(document.body, "document.body");
    patchRemoveEventListener(document.body, "document.body");
    nullifyEventHandlers(document.body, ["onmouseleave", "onmouseout", "onblur", "onfocus"], "document.body");
    obs.disconnect();
    }
    });
    if (document.body) {
    patchAddEventListener(document.body, "document.body");
    patchRemoveEventListener(document.body, "document.body");
    nullifyEventHandlers(document.body, ["onmouseleave", "onmouseout", "onblur", "onfocus"], "document.body");
    } else {
    observer.observe(document.documentElement || document, { childList: true, subtree: true });
    }
    log("Anti screen-switch script loaded. Monitoring active.");


    // =========================================================================
    // Part 2: 华为云考试题目复制器模块
    // Code from "华为云考试题目复制器" script.
    // It waits for the page to load the necessary elements and then adds the button.
    // =========================================================================

    /**
    * 创建并添加“复制题目”按钮到页面上
    */
    function addCopyButton() {
    const headerRight = document.querySelector('.header .right');
    if (headerRight && !document.getElementById('copy-questions-btn')) {
    const button = document.createElement('button');
    button.innerHTML = '📋 复制题目 (JSON)';
    button.id = 'copy-questions-btn';

    button.className = 'red'; // 使用一个现有 class 以匹配基本风格
    button.style.backgroundColor = '#007d40';
    button.style.borderColor = '#007d40';
    button.style.marginRight = '10px';
    button.style.color = 'white';
    button.style.padding = '0 15px'; // 调整内边距以匹配其他按钮
    button.style.lineHeight = '30px'; // 调整行高
    button.style.height = '32px'; // 调整高度

    button.addEventListener('click', extractAndCopyQuestions);

    headerRight.insertBefore(button, headerRight.firstChild);
    console.log('[题目复制器]: 按钮已添加。');
    }
    }

    /**
    * 提取页面所有题目信息并复制到剪贴板
    */
    function extractAndCopyQuestions() {
    console.log("[题目复制器]: 开始提取题目...");
    const allQuestions = [];
    const questionElements = document.querySelectorAll('.exam .exam-content');

    if (questionElements.length === 0) {
    alert('未找到任何题目。请确保考试页面已完全加载。');
    return;
    }

    questionElements.forEach((el, index) => {
    const questionObj = {
    number: index + 1,
    type: 'Unknown',
    question: '',
    points: 0,
    options: []
    };

    const questionTextEl = el.querySelector('.the-exam-page-html');
    if (!questionTextEl) return;

    let fullText = questionTextEl.textContent.trim();
    const pointMatch = fullText.match(/\((\d+)分\)|((\d+)分)/);
    if (pointMatch) {
    questionObj.points = parseInt(pointMatch[1] || pointMatch[2], 10);
    fullText = fullText.replace(pointMatch[0], '').trim();
    }
    questionObj.question = fullText;

    const radioGroup = el.querySelector('.el-radio-group');
    const checkboxGroup = el.querySelector('.el-checkbox-group');

    if (radioGroup) {
    const options = Array.from(radioGroup.querySelectorAll('.el-radio__label > div')).map(div => div.textContent.trim());
    questionObj.options = options;
    if (options.length === 2 && (options.includes('正确') && options.includes('错误') || options.includes('true') && options.includes('false'))) {
    questionObj.type = 'True/False';
    } else {
    questionObj.type = 'Single Choice';
    }
    } else if (checkboxGroup) {
    const options = Array.from(checkboxGroup.querySelectorAll('.el-checkbox__label > div')).map(div => div.textContent.trim());
    questionObj.options = options;
    questionObj.type = 'Multiple Choice';
    }

    allQuestions.push(questionObj);
    });

    if (allQuestions.length > 0) {
    const jsonOutput = JSON.stringify(allQuestions, null, 2);
    GM_setClipboard(jsonOutput, 'text');

    const btn = document.getElementById('copy-questions-btn');
    if (btn) {
    btn.textContent = `✅ 已复制 ${allQuestions.length} 题`;
    setTimeout(() => {
    btn.textContent = '📋 复制题目 (JSON)';
    }, 3000);
    }
    } else {
    alert('提取题目失败,未找到有效题目内容。');
    }
    }

    // 由于脚本在 document-start 运行,DOM 此时尚未构建完成。
    // 我们必须等待 DOM 加载完毕后才能查找按钮容器。
    // 使用定时器轮询是可靠的方法。
    const checkInterval = setInterval(() => {
    const headerRight = document.querySelector('.header .right');
    if (headerRight) {
    clearInterval(checkInterval);
    addCopyButton();
    }
    }, 500);

    })();
    wangguo1230
        4
    wangguo1230  
    OP
       8 天前
    大家可以自己拼起来
    NotAProgrammer
        5
    NotAProgrammer  
       8 天前
    不能放个在线文档地址嘛
    wangguo1230
        6
    wangguo1230  
    OP
       8 天前
    @NotAProgrammer 不好意思,你是说的华为云的文档地址吗,还是这个脚本的
    wangguo1230
        7
    wangguo1230  
    OP
       6 天前
    第三步: 报名参加华为云微认证专场,这是我翻出来的可以和集证有礼一块做的任务,两个任务可以同时完成,已经做过的可以忽略。 这一步大家先忽略,任务奖励有冲突
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3614 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:30 · PVG 12:30 · LAX 21:30 · JFK 00:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.