腾讯云 38 元轻量服务器活动指南:4 核 4G 3M 配置与 Console 辅助脚本

腾讯云“AI 焕新·智启新局”活动中,部分新客账号可以参与 38 元轻量应用服务器限时抢购。本文整理目标配置、适用场景和购买注意事项,并附上只创建待支付订单的浏览器 Console 辅助脚本。

本文信息核对时间:2026 年 7 月 19 日。文中的腾讯云链接为推广入口,活动资格、库存、配置和最终价格以登录后的活动页面及订单为准。

最近腾讯云上线了“AI 焕新·智启新局”活动,其中比较受开发者关注的是 4 核 4G 服务器新客 38 元/年起

对于准备搭建个人博客、测试环境、小型 API 服务或者 Docker 学习环境的用户,这个档位有一定吸引力。不过,活动商品通常受到账号资格、场次和库存限制,并不是所有账号都能以相同价格购买。

腾讯云活动入口:

查看腾讯云“AI 焕新·智启新局”活动

建议进入页面后登录自己的腾讯云账号,直接查看当前账号显示的商品、价格和活动资格。

一、脚本当前识别的目标配置

我根据活动页面当前返回的商品数据,编写了一个浏览器 Console 辅助脚本。脚本识别的目标档位如下:

项目目标配置
产品类型腾讯云轻量应用服务器 Lighthouse
活动价格38 元/年
CPU4 核
内存4GB
公网带宽3Mbps
月流量300GB
当前检查地域广州、上海、北京
当前关注场次10:00、15:00

这些参数是脚本当前版本使用的匹配条件。腾讯云可能调整商品、场次、地域和活动规则,付款前必须重新核对订单页面。

二、4 核 4G 3M 适合哪些场景?

4 核 4GB 的计算和内存配置适合以下轻量场景:

  • 部署个人博客和内容网站
  • 运行 Django、Flask、FastAPI 或 Node.js 项目
  • 搭建开发、测试和演示环境
  • 运行少量 Docker 容器
  • 部署访问量不高的 API 服务
  • 学习 Linux、Nginx、数据库和服务器运维
  • 执行定时任务和个人自动化脚本

需要注意的是,3Mbps 公网带宽的理论传输速度约为 384KB/s,实际速度还会受到网络质量和协议开销影响。因此,它不适合大文件下载、视频分发、图床外链和高并发业务。

300GB 月流量对于普通博客和开发测试通常较宽裕,但仍应根据真实访问量设置监控,避免异常请求消耗流量。

三、为什么写这个 Console 辅助脚本?

限时商品常见的问题并不是找不到购买入口,而是需要在指定场次及时操作,同时不同地域的库存状态可能不同。

手动参与时可能遇到:

  • 本地时间与腾讯云服务器时间存在误差
  • 没有及时进入活动场次
  • 当前选择的地域暂时没有库存
  • 切换地域后已经错过下单时间
  • 不清楚订单是否已经创建
  • 页面展示活动商品,但账号并不符合资格

这个脚本在腾讯云活动页的浏览器 Console 中运行,复用已登录页面加载的请求模块,主要用于倒计时、地域检查和订单状态提示。

它不会增加商品库存,也不能绕过账号资格、实名认证、验证码或腾讯云风控,更不能保证创建订单成功。

四、脚本能够做什么?

当前版本包含以下功能:

  • 自动识别 38 元、4 核 4G 3M、300GB 月流量的目标商品
  • 使用腾讯云接口时间校准倒计时
  • 自动选择下一场 10:00 或 15:00 的活动
  • 默认按广州、上海、北京的顺序检查地域
  • 支持手动调整优先地域
  • 显示倒计时、运行状态、请求轮次和累计请求数
  • 创建订单成功后显示腾讯云支付页面入口
  • 支持随时停止倒计时和后续请求

脚本只尝试创建 待支付订单,不会自动付款。订单创建后,仍需在腾讯云支付页面人工核对价格、配置、地域和购买时长。

五、脚本使用方法

使用前请先阅读完整源码,不要在浏览器 Console 中执行来源不明的代码。

  1. 通过上面的活动入口打开腾讯云活动页面。
  2. 登录腾讯云账号,查看自己的活动资格和目标商品。
  3. 使用桌面版 Chrome、Edge 等 Chromium 浏览器。
  4. 打开浏览器开发者工具的 Console。
  5. 复制下方完整 JavaScript,检查后粘贴到 Console 并按回车。
  6. 脚本会显示悬浮面板,并自动选择下一场活动。
  7. 如有需要,在面板中调整广州、上海或北京的优先顺序。
  8. 创建订单成功后,打开腾讯云支付页面并人工核对订单。

开发者工具快捷键:

  • Windows/Linux:通常为 F12Ctrl + Shift + J
  • macOS:通常为 Command + Option + J

常用命令:

命令作用
TC38.status()查看状态、目标场次、地域顺序和服务器时差
TC38.dryRun()检查各地域的活动状态,不创建订单
TC38.cancel()停止倒计时和后续请求
TC38.start()重新选择下一场并开始监控
TC38.setPreferredRegion("上海")将上海调整为第一优先地域

脚本还提供 TC38.fireNow() 命令。它会立即开始发送真实的创建订单请求,不等待目标场次,因此不建议在不了解其行为时使用。

六、完整 Console 脚本

点击展开完整 JavaScript 源码
/*
 * 腾讯云 38 元轻量服务器 Console 脚本。
 *
 * 运行位置:已登录的活动页
 * https://curl.qcloud.com/REmjDl1z
 *
 * 粘贴完整脚本后会自动选择下一场并等待下单。
 * 脚本直接复用活动页官方请求模块,不需要再执行初始化命令。
 * TC38.fireNow() 会立即尝试创建待支付订单。
 */
(() => {
  "use strict";

  // 重复粘贴新版时先停止上一版,避免留下两个等待任务。
  try {
    window.TC38?.cancel?.();
  } catch {}
  document.querySelector("#tc38-monitor-panel")?.remove();
  document.querySelector("#tc38-payment-link")?.remove();

  const CFG = {
    expectedPriceFen: 3800,
    expectedSpec: "4核4G3M",
    retryRoundIntervalMs: 220,
    finalClockSyncLeadMs: 60_000,
    panelNormalRefreshMs: 1000,
    panelFastRefreshMs: 200,
    panelFastRefreshLeadMs: 10_000,
    regionPriority: [
      { id: 1, name: "广州" },
      { id: 4, name: "上海" },
      { id: 8, name: "北京" },
    ],
  };

  let dianshiApi = null;
  let runGeneration = 0;
  let scheduledFor = null;
  let monitorTimer = null;
  let monitorState = "idle";
  let monitorTargetMs = null;
  let monitorClockOffsetMs = 0;
  let monitorSession = null;
  let monitorMessage = "";
  let preferredRegionId = CFG.regionPriority[0].id;
  let orderRound = 0;
  let orderRequestCount = 0;
  let noStockRetryCount = 0;
  let noStockDetected = false;
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

  function readTarget() {
    const node = document.querySelector("#__NEXT_DATA__");
    if (!node?.textContent) {
      throw new Error("找不到 __NEXT_DATA__,请确认在活动页运行");
    }

    const root = JSON.parse(node.textContent);
    const activity = root?.props?.pageProps?.activityData;
    const flash = activity?.twoDaySeckillState?.flashResult || {};
    const sales = Object.values(flash)
      .flatMap((sessions) => (Array.isArray(sessions) ? sessions : []))
      .flatMap((session) => (Array.isArray(session?.sales) ? session.sales : []));

    const sale = sales.find((item) => {
      const sku = item?.seckill_act_extra?.skuList || [];
      return item?.priceData?.real_cost === CFG.expectedPriceFen
        && sku.includes(CFG.expectedSpec)
        && sku.includes("300GB 月流量")
        && String(item?.product_name || "").includes("lighthouse");
    });

    if (!sale) {
      throw new Error("未找到 38 元 4核4G3M / 300GB 商品,拒绝继续");
    }

    const goodsParam = structuredClone(
      sale.defaultOrderParam || sale.defaultGoodsParam || {},
    );
    const activityId = Number(
      sale.activityId || sale?.$goods?.activity_id || activity?.activityId,
    );
    const goodsActId = Number(
      sale.goodsId || sale.act_id || sale?.$goods?.big_goods_id,
    );

    if (!Number.isSafeInteger(activityId) || !Number.isSafeInteger(goodsActId)) {
      throw new Error("活动 ID 解析失败");
    }

    return {
      activityId,
      goodsActId,
      outerType: sale.productType || sale.product_name || sale?.$goods?.product_name,
      goodsType: goodsParam.type,
      goodsParam,
      title: sale.goods_name,
      priceFen: sale.priceData.real_cost,
    };
  }

  const target = readTarget();

  function chinaTimeText(timestamp) {
    return new Date(timestamp + 8 * 3_600_000)
      .toISOString()
      .replace("T", " ")
      .slice(0, 19);
  }

  function remainingText(milliseconds) {
    // 与活动页一样显示“完整剩余秒数”,避免向上取整多出 1 秒。
    const totalSeconds = Math.max(0, Math.floor(milliseconds / 1000));
    const days = Math.floor(totalSeconds / 86_400);
    const hours = Math.floor((totalSeconds % 86_400) / 3_600);
    const minutes = Math.floor((totalSeconds % 3_600) / 60);
    const seconds = totalSeconds % 60;
    const clock = [hours, minutes, seconds]
      .map((value) => String(value).padStart(2, "0"))
      .join(":");
    return days ? `${days}天 ${clock}` : clock;
  }

  function regionsInPriorityOrder() {
    const preferred = CFG.regionPriority.find(
      (region) => region.id === preferredRegionId,
    );
    if (!preferred) return [...CFG.regionPriority];
    return [
      preferred,
      ...CFG.regionPriority.filter((region) => region.id !== preferredRegionId),
    ];
  }

  function setPreferredRegion(regionValue) {
    const normalized = String(regionValue).trim();
    const region = CFG.regionPriority.find(
      (item) => String(item.id) === normalized || item.name === normalized,
    );
    if (!region) {
      throw new Error(`不支持的地域:${regionValue}`);
    }

    preferredRegionId = region.id;
    if (document.querySelector("#tc38-monitor-panel")) renderMonitorPanel();
    const order = regionsInPriorityOrder().map((item) => item.name);
    console.log(`[TC38] 优先地域已设为 ${region.name}`, order.join(" → "));
    return order;
  }

  function clearMonitorTimer() {
    if (monitorTimer !== null) {
      clearTimeout(monitorTimer);
      monitorTimer = null;
    }
  }

  function monitorRefreshDelay() {
    if (monitorTargetMs === null) return CFG.panelNormalRefreshMs;
    const left = monitorTargetMs - (Date.now() + monitorClockOffsetMs);
    return left <= CFG.panelFastRefreshLeadMs
      ? CFG.panelFastRefreshMs
      : CFG.panelNormalRefreshMs;
  }

  function scheduleMonitorRefresh() {
    clearMonitorTimer();
    const tick = () => {
      if (monitorState !== "monitoring") {
        monitorTimer = null;
        return;
      }
      renderMonitorPanel();
      monitorTimer = setTimeout(tick, monitorRefreshDelay());
    };
    monitorTimer = setTimeout(tick, monitorRefreshDelay());
  }

  function ensureMonitorPanel() {
    let panel = document.querySelector("#tc38-monitor-panel");
    if (panel) return panel;

    panel = document.createElement("div");
    panel.id = "tc38-monitor-panel";
    Object.assign(panel.style, {
      position: "fixed",
      zIndex: "2147483647",
      top: "20px",
      right: "20px",
      width: "340px",
      padding: "16px",
      border: "1px solid #2f6feb",
      borderRadius: "10px",
      background: "#101828",
      boxShadow: "0 8px 28px rgba(0, 0, 0, 0.3)",
      color: "#f8fafc",
      font: "14px/1.5 -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif",
    });
    panel.innerHTML = `
      <div style="display:flex;align-items:center;justify-content:space-between;gap:12px">
        <strong data-role="title" style="font-size:16px"></strong>
        <span data-role="state" style="color:#6ee7b7"></span>
      </div>
      <div data-role="countdown" style="margin:12px 0 8px;font:700 30px/1.2 ui-monospace,SFMono-Regular,Menlo,monospace;color:#7dd3fc"></div>
      <div data-role="target" style="color:#cbd5e1"></div>
      <div data-role="offset" style="color:#94a3b8"></div>
      <label style="display:flex;align-items:center;gap:8px;margin-top:8px;color:#cbd5e1">
        <span>优先地域:</span>
        <select data-role="preferred-region" style="flex:1;padding:5px 8px;border:1px solid #64748b;border-radius:5px;background:#1e293b;color:#f8fafc;cursor:pointer">
          ${CFG.regionPriority.map((region) => `<option value="${region.id}">${region.name}</option>`).join("")}
        </select>
      </label>
      <div data-role="regions" style="margin-top:6px;color:#94a3b8"></div>
      <div data-role="attempts" style="margin-top:4px;color:#94a3b8"></div>
      <div data-role="stock-retries" style="margin-top:4px;color:#94a3b8"></div>
      <div data-role="message" style="min-height:21px;margin-top:8px;color:#fbbf24"></div>
      <div style="margin-top:12px;display:flex;gap:8px">
        <button data-role="stop" type="button" style="padding:8px 13px;border:0;border-radius:6px;background:#ef4444;color:white;cursor:pointer">停止监控</button>
      </div>
    `;
    panel.querySelector('[data-role="stop"]').addEventListener("click", cancel);
    panel.querySelector('[data-role="preferred-region"]').addEventListener(
      "change",
      (event) => setPreferredRegion(event.currentTarget.value),
    );
    document.body.append(panel);
    return panel;
  }

  function renderMonitorPanel() {
    const panel = ensureMonitorPanel();
    const stateLabels = {
      monitoring: "持续监控中",
      submitting: "循环抢购中",
      stopped: "已停止",
      failed: "下单失败",
      success: "订单已创建",
    };
    const left = monitorTargetMs === null
      ? null
      : monitorTargetMs - (Date.now() + monitorClockOffsetMs);
    const stopButton = panel.querySelector('[data-role="stop"]');
    const preferredSelect = panel.querySelector('[data-role="preferred-region"]');
    const isStoppable = ["monitoring", "submitting"].includes(monitorState);

    panel.querySelector('[data-role="title"]').textContent = "腾讯云 38 元抢购";
    panel.querySelector('[data-role="state"]').textContent =
      stateLabels[monitorState] || monitorState;
    panel.querySelector('[data-role="countdown"]').textContent = left === null
      ? "--:--:--"
      : remainingText(left);
    panel.querySelector('[data-role="target"]').textContent = monitorTargetMs === null
      ? `场次:${monitorSession || "-"}`
      : `场次:${monitorSession}(${chinaTimeText(monitorTargetMs)})`;
    panel.querySelector('[data-role="offset"]').textContent =
      `服务器时差:${monitorClockOffsetMs >= 0 ? "+" : ""}${monitorClockOffsetMs} ms`;
    preferredSelect.value = String(preferredRegionId);
    panel.querySelector('[data-role="regions"]').textContent = `地域顺序:${regionsInPriorityOrder()
      .map((region) => region.name)
      .join(" → ")}`;
    panel.querySelector('[data-role="attempts"]').textContent = orderRequestCount
      ? `抢购进度:第 ${orderRound} 轮,累计 ${orderRequestCount} 次请求`
      : "抢购进度:等待开抢";
    panel.querySelector('[data-role="stock-retries"]').textContent = noStockDetected
      ? `无库存复查:${noStockRetryCount}/6 次`
      : "无库存复查:尚未触发";
    panel.querySelector('[data-role="message"]').textContent = monitorMessage;
    stopButton.disabled = !isStoppable;
    stopButton.textContent = monitorState === "monitoring"
      ? "停止监控"
      : monitorState === "submitting"
        ? "停止抢购"
        : "监控已停止";
    Object.assign(stopButton.style, {
      opacity: isStoppable ? "1" : "0.55",
      cursor: isStoppable ? "pointer" : "not-allowed",
    });
  }

  function beginMonitor(session, targetMs, offset) {
    clearMonitorTimer();
    monitorState = "monitoring";
    monitorTargetMs = targetMs;
    monitorClockOffsetMs = offset;
    monitorSession = session;
    orderRound = 0;
    orderRequestCount = 0;
    noStockRetryCount = 0;
    noStockDetected = false;
    monitorMessage = "保持登录且电脑不休眠;临近开抢请让本页保持前台";
    renderMonitorPanel();
    // 平时降低刷新频率,最后 10 秒再提高到 200ms。
    scheduleMonitorRefresh();
    console.log(
      `[TC38] 持续监控中,距离 ${session} 还有 ${remainingText(
        targetMs - (Date.now() + offset),
      )};点击右上角“停止监控”或执行 TC38.cancel() 可停止。`,
    );
  }

  function finishMonitor(state, message, removePanel = false) {
    clearMonitorTimer();
    monitorState = state;
    monitorMessage = message;
    if (removePanel) {
      document.querySelector("#tc38-monitor-panel")?.remove();
      return;
    }
    renderMonitorPanel();
  }

  function resolveDianshiApi() {
    const chunkQueue = window.webpackChunk_tencent_qcact_ssr;
    if (!Array.isArray(chunkQueue)) {
      throw new Error("腾讯云页面请求模块尚未加载,请刷新活动页后重试");
    }

    let webpackRequire;
    const chunkId = `tc38_${Date.now()}_${Math.random().toString(16).slice(2)}`;
    chunkQueue.push([
      [chunkId],
      {},
      (runtimeRequire) => {
        webpackRequire = runtimeRequire;
      },
    ]);
    if (typeof webpackRequire !== "function") {
      throw new Error("无法连接腾讯云页面请求模块");
    }

    const candidateIds = ["58357"];
    for (const [moduleId, factory] of Object.entries(webpackRequire.m || {})) {
      if (moduleId === "58357") continue;
      const source = Function.prototype.toString.call(factory);
      if (source.includes("check-available") && source.includes("do-goods")) {
        candidateIds.push(moduleId);
      }
    }

    for (const moduleId of candidateIds) {
      try {
        const module = webpackRequire(moduleId);
        const api = module?.api?.dianshi;
        if (
          typeof api?.checkAvailable?.request === "function"
          && typeof api?.doGoods?.request === "function"
          && typeof api?.getNow?.request === "function"
        ) {
          return api;
        }
      } catch {}
    }
    throw new Error("当前活动页版本中未找到腾讯云官方下单模块");
  }

  function normalizeApiError(error) {
    if (error?.response?.data && typeof error.response.data === "object") {
      return error.response.data;
    }
    if (error && typeof error === "object") {
      return {
        code: error.code ?? "API_ERROR",
        message: error.message || error.msg || JSON.stringify(error).slice(0, 300),
      };
    }
    return { code: "API_ERROR", message: String(error) };
  }

  async function callOfficialApi(request) {
    try {
      return { code: 0, data: await request() };
    } catch (error) {
      return normalizeApiError(error);
    }
  }

  function importCopiedFetch() {
    try {
      dianshiApi = resolveDianshiApi();
      console.log("已连接腾讯云页面的官方请求模块,无需粘贴请求或认证头", {
        activityId: target.activityId,
        goodsActId: target.goodsActId,
        regionPriority: regionsInPriorityOrder().map((region) => region.name),
      });
      const info = status();
      start().catch((error) => {
        console.error("自动抢购任务启动失败", error);
      });
      return info;
    } catch (error) {
      console.error("初始化失败", error);
      throw error;
    }
  }

  function assertApiReady() {
    if (!dianshiApi) {
      throw new Error("请先执行 TC38.importCopiedFetch()");
    }
  }

  function stockState(payload, regionId) {
    const text = JSON.stringify(payload).toLowerCase();
    if (/login|captcha|verify|risk|登录态|登陆态/.test(text)) return "manual";
    if (
      /sold.?out|抢光|售罄/.test(text)
      || [20001, 10002, 1100151].includes(Number(payload?.code))
    ) {
      return "sold-out";
    }
    if (![0, "0"].includes(payload?.code)) return "unavailable";

    const records = Array.isArray(payload?.data) ? payload.data : [payload?.data];
    for (const record of records) {
      const quota = record?.quota?.[String(regionId)]?.[target.goodsType];
      if (quota && "available" in quota) {
        return Number(quota.available) > 0 ? "available" : "unavailable";
      }
      for (const key of [
        "user_available",
        "userAvailable",
        "available",
        "canBuy",
        "enable",
      ]) {
        if (record && key in record) {
          return Boolean(record[key]) ? "available" : "unavailable";
        }
      }
    }
    return "unknown";
  }

  async function dryRun() {
    assertApiReady();
    const results = [];
    for (const region of regionsInPriorityOrder()) {
      const payload = await callOfficialApi(
        () => dianshiApi.checkAvailable.request({
          activityId: target.activityId,
          goods: [{ act_id: target.goodsActId, region_id: [region.id] }],
          isPreview: false,
        }),
      );
      results.push({
        region: region.name,
        code: payload?.code,
        state: stockState(payload, region.id),
        message: payload?.message || payload?.msg || "",
      });
    }
    console.table(results);
    return results;
  }

  function buildOrder(region) {
    const goodsParam = structuredClone(target.goodsParam);
    Object.assign(goodsParam, {
      area: 1,
      goodsNum: 1,
      regionId: region.id,
      type: target.goodsType,
    });
    const body = {
      activity_id: target.activityId,
      goods: [{
        act_id: target.goodsActId,
        type: target.outerType,
        goods_param: goodsParam,
        page_from: "act_buy",
      }],
      preview: 0,
      agent_channel: {
        fromChannel: "",
        fromSales: "",
        isAgentClient: false,
        fromUrl: location.href,
      },
    };
    return body;
  }

  function orderState(payload, text) {
    const lower = text.toLowerCase();
    const data = payload?.data;
    if (
      [0, "0"].includes(payload?.code)
      && data
      && (
        "deal_names" in data
        || "big_deal_no" in data
        || "seqId" in data
        || Object.values(data).some(
          (value) => typeof value === "string" && value.includes("order/check"),
        )
      )
    ) {
      return "pending-payment";
    }
    if (
      /sold.?out|抢光|售罄/.test(lower)
      || [20001, 10002, 1100151].includes(Number(payload?.code))
    ) {
      return "sold-out";
    }
    if (/not.?started|未开始/.test(lower)) return "not-started";
    if (/login|captcha|verify|risk|登录态|登陆态/.test(lower)) return "manual";
    if (
      /too many|rate.?limit|频率过快|访问频率/.test(lower)
      || [408, 429, 1100110].includes(Number(payload?.code))
    ) {
      return "rate-limited";
    }
    return "unknown";
  }

  function paymentUrlFromPayload(payload) {
    const fallback = "https://buy.cloud.tencent.com/order/check";
    const data = payload?.data;
    if (!data || typeof data !== "object") return fallback;

    const candidates = [
      data.url,
      data.redirectUrl,
      data.redirect_url,
      data.orderUrl,
      data.order_url,
    ];
    for (const candidate of candidates) {
      if (typeof candidate !== "string" || !candidate) continue;
      try {
        const url = new URL(candidate, fallback);
        if (
          url.hostname === "buy.cloud.tencent.com"
          && url.pathname.startsWith("/order/")
        ) {
          return url.href;
        }
      } catch {}
    }

    const url = new URL(fallback);
    const bigDealId = Array.isArray(data.big_deal_no)
      ? data.big_deal_no.join("|")
      : data.big_deal_no;
    const dealName = Array.isArray(data.deal_names)
      ? data.deal_names.join("|")
      : data.deal_names;
    if (bigDealId) url.searchParams.set("bigDealId", bigDealId);
    if (!bigDealId && dealName) url.searchParams.set("dealName", dealName);
    url.searchParams.set("s_url", location.href);
    url.searchParams.set("serviceFrom", "activity");
    return url.href;
  }

  function showPaymentLink(paymentUrl, regionName) {
    clearMonitorTimer();
    document.querySelector("#tc38-monitor-panel")?.remove();
    document.querySelector("#tc38-payment-link")?.remove();

    const panel = document.createElement("div");
    panel.id = "tc38-payment-link";
    Object.assign(panel.style, {
      position: "fixed",
      zIndex: "2147483647",
      top: "20px",
      right: "20px",
      width: "320px",
      padding: "18px",
      border: "1px solid #57a564",
      borderRadius: "10px",
      background: "#f2fff4",
      boxShadow: "0 8px 28px rgba(0, 0, 0, 0.22)",
      color: "#183b20",
      font: "14px/1.5 -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif",
    });

    const title = document.createElement("strong");
    title.textContent = `订单已创建(${regionName})`;
    title.style.display = "block";
    title.style.marginBottom = "12px";

    const link = document.createElement("a");
    link.href = paymentUrl;
    link.target = "_blank";
    link.rel = "noopener noreferrer";
    link.textContent = "打开订单支付页";
    Object.assign(link.style, {
      display: "inline-block",
      padding: "9px 16px",
      borderRadius: "6px",
      background: "#006eff",
      color: "#fff",
      fontWeight: "600",
      textDecoration: "none",
    });

    const close = document.createElement("button");
    close.type = "button";
    close.textContent = "关闭";
    close.addEventListener("click", () => panel.remove());
    Object.assign(close.style, {
      marginLeft: "10px",
      padding: "8px 12px",
      border: "1px solid #aab4c3",
      borderRadius: "6px",
      background: "#fff",
      cursor: "pointer",
    });

    panel.append(title, link, close);
    document.body.append(panel);
  }

  async function fire(generation = runGeneration) {
    assertApiReady();

    orderRound = 0;
    orderRequestCount = 0;
    noStockRetryCount = 0;
    noStockDetected = false;
    while (generation === runGeneration) {
      orderRound++;
      let allRegionsSoldOut = true;
      for (const region of regionsInPriorityOrder()) {
        if (generation !== runGeneration) return { state: "cancelled" };

        orderRequestCount++;
        monitorMessage = `第 ${orderRound} 轮:正在尝试 ${region.name}(累计 ${orderRequestCount} 次)`;
        if (document.querySelector("#tc38-monitor-panel")) renderMonitorPanel();

        const order = buildOrder(region);
        const payload = await callOfficialApi(
          () => dianshiApi.doGoods.request({
            activityId: order.activity_id,
            goods: order.goods,
            isPreview: false,
            agentChannel: order.agent_channel,
            business: order.business,
          }),
        );
        const text = JSON.stringify(payload);

        const state = orderState(payload, text);
        console.log("下单返回", {
          region: region.name,
          round: orderRound,
          requestCount: orderRequestCount,
          code: payload?.code,
          state,
          message: payload?.message || payload?.msg || "",
        });

        if (state === "pending-payment") {
          const paymentUrl = paymentUrlFromPayload(payload);
          showPaymentLink(paymentUrl, region.name);
          console.log("订单已创建,点击下面的 URL 打开支付页:");
          console.log(paymentUrl);
          return { state, region: region.name, paymentUrl };
        }
        if (generation !== runGeneration) return { state: "cancelled" };
        if (noStockDetected) {
          if (state === "sold-out") {
            noStockRetryCount++;
            if (noStockRetryCount >= 6) {
              monitorMessage = "所有地域均无库存,额外复查 6 次后结束当前场次";
              if (document.querySelector("#tc38-monitor-panel")) renderMonitorPanel();
              console.warn("[TC38] 所有地域均无库存,额外复查 6 次后结束当前场次");
              return {
                state: "sold-out",
                noStockRetryCount,
                requestCount: orderRequestCount,
              };
            }
          } else {
            noStockDetected = false;
            noStockRetryCount = 0;
          }
        }
        if (state !== "sold-out") {
          allRegionsSoldOut = false;
        }
        if (["manual", "rate-limited", "unknown"].includes(state)) {
          console.warn("本次未确认无库存,将继续下一地域和下一轮", {
            region: region.name,
            state,
            code: payload?.code,
            message: payload?.message || payload?.msg || "",
          });
        }
      }

      if (generation !== runGeneration) return { state: "cancelled" };
      if (allRegionsSoldOut && !noStockDetected) {
        noStockDetected = true;
        noStockRetryCount = 0;
        monitorMessage =
          `检测到所有地域无库存,${CFG.retryRoundIntervalMs}ms 后开始额外复查 6 次`;
      } else if (noStockDetected) {
        monitorMessage = `所有地域仍无库存,已复查 ${noStockRetryCount}/6 次`;
      } else {
        monitorMessage = `第 ${orderRound} 轮未创建订单,${CFG.retryRoundIntervalMs}ms 后继续`;
      }
      if (document.querySelector("#tc38-monitor-panel")) renderMonitorPanel();
      await sleep(CFG.retryRoundIntervalMs);
    }
    return { state: "cancelled" };
  }

  async function fireNow() {
    assertApiReady();
    const generation = ++runGeneration;
    scheduledFor = null;
    clearMonitorTimer();
    monitorState = "submitting";
    monitorTargetMs = null;
    monitorSession = "立即下单";
    monitorMessage = "正在立即循环尝试创建订单";
    renderMonitorPanel();

    const result = await fire(generation);
    if (result.state === "pending-payment") {
      finishMonitor("success", "订单已创建,请尽快支付", true);
    } else if (result.state !== "cancelled") {
      finishMonitor("failed", "抢购已停止,具体原因请查看 Console");
    }
    return result;
  }

  async function serverOffset() {
    assertApiReady();
    const offsets = [];
    for (let index = 0; index < 3; index++) {
      const before = Date.now();
      const nowData = await dianshiApi.getNow.request();
      const after = Date.now();
      let server = Number(nowData?.nowTime ?? nowData);
      if (server > 0 && server < 10_000_000_000) server *= 1000;
      if (Number.isFinite(server)) {
        offsets.push(server - Math.round((before + after) / 2));
      }
      if (index < 2) await sleep(80);
    }
    if (!offsets.length) throw new Error("服务器时间同步失败");
    offsets.sort((left, right) => left - right);
    return offsets[Math.floor(offsets.length / 2)];
  }

  function nextSessionChina(serverNowMs) {
    const china = new Date(serverNowMs + 8 * 3_600_000);
    const ten = Date.UTC(
      china.getUTCFullYear(),
      china.getUTCMonth(),
      china.getUTCDate(),
      10 - 8,
      0,
      0,
      0,
    );
    const fifteen = Date.UTC(
      china.getUTCFullYear(),
      china.getUTCMonth(),
      china.getUTCDate(),
      15 - 8,
      0,
      0,
      0,
    );

    if (serverNowMs <= ten) {
      return { targetMs: ten, label: "今天 10:00" };
    }
    if (serverNowMs <= fifteen) {
      return { targetMs: fifteen, label: "今天 15:00" };
    }
    return {
      targetMs: ten + 24 * 3_600_000,
      label: "明天 10:00",
    };
  }

  async function start() {
    assertApiReady();

    const generation = ++runGeneration;
    let offset = await serverOffset();
    if (generation !== runGeneration) return { state: "cancelled" };

    const nowServer = Date.now() + offset;
    const session = nextSessionChina(nowServer);
    const { targetMs } = session;
    const waitMs = targetMs - nowServer;
    let finalClockSyncPending = waitMs > CFG.finalClockSyncLeadMs;
    scheduledFor = session.label;

    beginMonitor(session.label, targetMs, offset);

    console.log(`已自动选择 ${session.label} 场,等待下单`, {
      targetChinaTime: chinaTimeText(targetMs),
      clockOffsetMs: offset,
      waitMs,
    });

    while (true) {
      if (generation !== runGeneration) return { state: "cancelled" };
      const left = targetMs - (Date.now() + offset);
      if (finalClockSyncPending && left <= CFG.finalClockSyncLeadMs) {
        finalClockSyncPending = false;
        try {
          const refreshedOffset = await serverOffset();
          if (generation !== runGeneration) return { state: "cancelled" };
          offset = refreshedOffset;
          monitorClockOffsetMs = refreshedOffset;
          monitorMessage = "开抢前 60 秒已重新同步腾讯云服务器时间";
          renderMonitorPanel();
          console.log("[TC38] 临场服务器时间同步完成", {
            clockOffsetMs: refreshedOffset,
          });
          continue;
        } catch (error) {
          monitorMessage = "临场校时失败,继续使用上次服务器时差";
          renderMonitorPanel();
          console.warn("[TC38] 临场服务器时间同步失败", error);
        }
      }
      if (left <= 20) break;
      await sleep(Math.min(200, Math.max(1, left - 10)));
    }
    while (Date.now() + offset < targetMs) {}
    if (generation !== runGeneration) return { state: "cancelled" };

    clearMonitorTimer();
    monitorState = "submitting";
    monitorMessage = "已到开抢时间,正在发送创建订单请求";
    renderMonitorPanel();

    const result = await fire(generation);
    scheduledFor = null;
    if (result.state === "pending-payment") {
      finishMonitor("success", "订单已创建,请尽快支付", true);
    } else if (result.state === "sold-out") {
      const finishedHour =
        new Date(targetMs + 8 * 3_600_000).getUTCHours();
      const nextSessionText = finishedHour === 10
        ? "今天 15:00"
        : "明天 10:00";
      monitorState = "monitoring";
      monitorMessage =
        `${finishedHour}:00 场已无库存,正在自动切换到 ${nextSessionText}`;
      renderMonitorPanel();
      console.log(
        `[TC38] ${finishedHour}:00 场已结束,自动继续监控 ${nextSessionText}`,
      );
      return start();
    } else if (result.state !== "cancelled") {
      finishMonitor("failed", "未创建订单,具体原因请查看 Console");
    }
    return result;
  }

  function cancel() {
    if (!["monitoring", "submitting"].includes(monitorState) && !scheduledFor) {
      console.log("[TC38] 当前没有正在等待的监控任务");
      return false;
    }

    const requestWasInFlight = monitorState === "submitting";
    runGeneration++;
    scheduledFor = null;
    clearMonitorTimer();
    monitorState = "stopped";
    monitorTargetMs = null;
    monitorMessage = requestWasInFlight
      ? "已停止后续重试;已发出的当前请求无法撤回"
      : "已停止,不会在开抢时间发送下单请求";
    renderMonitorPanel();
    console.log("[TC38] 已停止监控及后续重试");
    return true;
  }

  function status() {
    const remaining = monitorTargetMs === null || monitorState !== "monitoring"
      ? null
      : remainingText(
        monitorTargetMs - (Date.now() + monitorClockOffsetMs),
      );
    const info = {
      activityId: target.activityId,
      goodsActId: target.goodsActId,
      priceYuan: target.priceFen / 100,
      goodsType: target.goodsType,
      officialApiReady: Boolean(dianshiApi),
      scheduledFor,
      monitorState,
      remaining,
      orderRound,
      orderRequestCount,
      noStockDetected,
      noStockRetryCount,
      retryRoundIntervalMs: CFG.retryRoundIntervalMs,
      stopCommand: "TC38.cancel()",
      regions: regionsInPriorityOrder()
        .map((region) => `${region.name}(${region.id})`)
        .join(" → "),
    };
    return info;
  }

  window.TC38 = {
    importCopiedFetch,
    dryRun,
    start,
    fireNow,
    setPreferredRegion,
    cancel,
    status,
  };
  console.log("TC38 已加载,正在自动初始化并启动");
  queueMicrotask(() => {
    try {
      importCopiedFetch();
    } catch {}
  });
})();

七、使用脚本前需要注意什么?

这个脚本不是腾讯云官方工具,也没有得到腾讯云官方背书。

使用前需要注意:

  1. 必须遵守腾讯云活动规则、服务条款和适用法律。
  2. 如果活动规则不允许自动化请求,请不要运行脚本。
  3. 循环请求可能触发访问频率限制、验证码或账号风控。
  4. 出现限流、验证或异常提示时,应立即执行 TC38.cancel()
  5. 腾讯云活动页或内部接口更新后,脚本可能失效。
  6. 浏览器休眠、后台节流和网络波动会影响执行时间。
  7. 脚本不能绕过账号资格、实名认证、库存或风控限制。
  8. 不要将账号密码、Cookie 或其他敏感信息交给陌生人。

脚本的定位是个人技术实验和操作辅助,不是“保证抢到”的工具。当天不再参与时,应主动停止脚本,不建议无人值守连续运行。

八、创建订单后先检查这些信息

即使脚本已经创建待支付订单,也不要直接付款,建议逐项检查:

  • 是否为自己的腾讯云账号
  • 最终价格是否符合预期
  • 购买时长是否为 1 年
  • CPU、内存、带宽和月流量是否正确
  • 地域是否适合自己的用户群体
  • 是否限制新客或产品首购资格
  • 活动商品是否支持退款
  • 第二年正常续费价格是多少

首年活动价通常不等于后续续费价格。如果只是用于学习或短期项目,应在到期前做好数据备份和迁移准备。

九、常见问题

所有腾讯云账号都能买到 38 元服务器吗?

不一定。活动可能限制新用户、产品首购用户、实名认证主体或购买数量,以登录后的活动页面提示为准。

脚本会自动付款吗?

不会。脚本最多只创建待支付订单,付款仍然需要人工完成。

使用脚本一定能够抢到吗?

不能保证。结果仍然取决于库存、账号资格、活动规则、网络环境和腾讯云风控。

为什么脚本检查多个地域?

同一个商品在不同地域可能有不同的库存状态。脚本会按设定顺序检查广州、上海和北京,但服务器地域最终应根据访问用户的位置选择。

没有成功需要一直运行吗?

不建议无人值守连续运行。当天不再参与时,应执行 TC38.cancel()。准备参与下一场前,重新打开活动页、确认登录状态并加载最新版脚本。

十、总结

腾讯云此次活动中的 4 核 4G 服务器新客 38 元/年起,对个人开发者、博客站长和轻量项目有一定吸引力。

购买前不能只看 CPU 和内存,还要关注 3Mbps 公网带宽、300GB 月流量、可选地域、活动资格、退款规则和后续续费价格。

Console 脚本可以减少倒计时、切换地域和检查状态的重复操作,但它不能绕过活动规则,也不能保证创建订单成功。使用脚本前应阅读源码,出现限流或验证提示时及时停止。

如果还在比较不同厂商和配置,也可以继续查看本站整理的云服务器相关文章

准备购买前,可以先打开活动页,查看自己的账号是否显示目标商品和价格:

查看腾讯云 38 元轻量服务器活动

上一篇 GPT-5.6 Sol 会误删文件吗?官方风险说明与 Codex 安全设置清单
下一篇:暂无

相关推荐