MoreRSS

site iconlklog | 龙鲲修改

马拉松爱好者,喜欢捣腾新鲜的事物。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

lklog | 龙鲲的 RSS 预览

利用AI智能体+Cloudflare给任意网页制作即时RSS

2026-09-05 15:26:02

本文于 2026年9月5日 3:37 更新,注意查看最新内容

前言

最近在使用RSS的过程中遇到即时性的问题,发现很多不提供RSS的网站使用公共解决方案时,RSS内容更新都不够及时,对于想要把RSS作为主要获取信息来源的我来说非常的不方便,中间也尝试过一些方案,RSSHub就不用说了,虽然功能强大,但对于我这种不想要深度了解的人来说,始终满足不了我想要的效果,一键制作RSS的工具也使用过,例如RssEverything等,不是收费太贵,就是没法对非公开页面进行一键处理,直到最近看到篇帖子,于是来了灵感,按照帖子的思路举一反三,便有了本文的方案。

原理

利用AI智能体抓取已登录的Edge浏览器会话,然后将网页内容转换成RSS内容,再部署到Cloudflare Pages。

准备

一台Windows服务器/云电脑/24小时开机的电脑/云龙虾(MiMo Claw、Kimi Claw等)。

一个Cloudflare账号。

一个域名(可选)。

教程

1.设备安装AI智能体软件,这里推荐WorkBuddy,轻量不花钱也能用。

2.登录Cloudflare账号,获取帐户API令牌。

路径:管理账户-创建令牌-搜索权限组“Cloudflare Pages”-勾选Read和Edit权限-审核令牌即可。

3.将下列代码发给AI智能体学习后,告知其需要制作RSS的真实网页,并一起发送上方的API令牌。

"""
论坛 RSS 生成器 — 纯案例文件(已脱敏)
========================================
通过浏览器 CDP 协议复用已登录会话,自动化抓取论坛帖子列表,
生成标准 RSS 2.0 XML,并通过 CLI 工具部署到 Pages 服务。

适用场景:
  - 任意 Discuz! 系论坛版块的 RSS 订阅生成
  - 需登录才能访问的内容RSS化
  - 静态 Pages 托管 + CDP 抓取 的轻量方案

使用前请替换所有 <<PLACEHOLDER>> 为实际值。
"""

import asyncio
import json
import os
import sys
import urllib.request
import time
import subprocess
import tempfile
import shutil
from datetime import datetime
from email.utils import format_datetime


# ═══════════════════════════════════════════════════════════════════════
# 配置区 — 按需修改
# ═══════════════════════════════════════════════════════════════════════

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
LOG_FILE = os.path.join(SCRIPT_DIR, "rss_log.txt")

# Pages 服务配置
PAGES_API_TOKEN = "<<YOUR_PAGES_API_TOKEN>>"          # API 令牌
PAGES_ACCOUNT_ID = "<<YOUR_ACCOUNT_ID>>"               # 账户 ID
PAGES_PROJECT_NAME = "<<YOUR_PAGES_PROJECT_NAME>>"     # Pages 项目名称
PAGES_DOMAIN = "<<YOUR_PROJECT.pages.dev>>"  # Pages 域名

# 文件路径(使用随机字符串防止猜测)
SUBDIR_L1 = "<<RANDOM_PATH_LEVEL1>>"      # 第一层随机目录
SUBDIR_L2 = "<<RANDOM_PATH_LEVEL2>>"      # 第二层随机目录
RSS_FILENAME = "<<RANDOM_FILENAME>>.xml"  # 随机文件名
RSS_DEPLOY_URL = f"https://{PAGES_DOMAIN}/{SUBDIR_L1}/{SUBDIR_L2}/{RSS_FILENAME}"

# 目标论坛配置
FORUM_URL = "<<TARGET_FORUM_URL>>"          # 目标版块URL
FORUM_TITLE = "<<FORUM_TITLE>>"             # RSS频道标题
FORUM_LINK = "<<FORUM_BASE_URL>>"           # 论坛主页链接
FORUM_DESC = "<<FORUM_DESCRIPTION>>"        # RSS频道描述
BASE_URL = "<<FORUM_BASE_URL>>"             # 论坛根URL


# ═══════════════════════════════════════════════════════════════════════
# 日志工具
# ═══════════════════════════════════════════════════════════════════════

def log(msg: str):
    """统一日志输出:终端 + 文件"""
    ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    line = f"[{ts}] {msg}"
    sys.stdout.buffer.write((line + "\n").encode("utf-8", errors="replace"))
    sys.stdout.buffer.flush()
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(line + "\n")


# ═══════════════════════════════════════════════════════════════════════
# 日期解析 — 适配 Discuz! 论坛日期格式
# ═══════════════════════════════════════════════════════════════════════

def parse_forum_date(date_str: str) -> str:
    """
    将论坛日期格式转为 RSS 标准 RFC 2822 格式
    输入: "2026-6-20 07:41" / "2026-06-20 07:41"
    输出: "Sat, 20 Jun 2026 07:41:00 +0800"
    """
    date_str = date_str.strip()
    for fmt in ["%Y-%m-%d %H:%M", "%Y-%m-%d"]:
        try:
            dt = datetime.strptime(date_str, fmt)
            return format_datetime(dt)
        except ValueError:
            continue
    log(f"[WARN] 无法解析日期: {date_str},使用当前时间")
    return format_datetime(datetime.now())


# ═══════════════════════════════════════════════════════════════════════
# 浏览器连接 — 通过 Chrome/Edge CDP 端口复用已登录会话
# ═══════════════════════════════════════════════════════════════════════

def ensure_browser_cdp(cdp_port: int = 9222) -> str:
    """
    确保浏览器以调试模式运行,返回 WebSocket CDP URL
    
    前置条件(手动操作一次即可,浏览器会保持登录状态):
      - 启动浏览器并添加参数: --remote-debugging-port=<cdp_port>
      - 在浏览器中手动登录目标论坛
    """
    try:
        data = urllib.request.urlopen(f"http://localhost:{cdp_port}/json/version", timeout=3)
        info = json.loads(data.read())
        log(f"浏览器已运行,CDP 已连接")
        return info["webSocketDebuggerUrl"]
    except Exception:
        log(f"[FAIL] 浏览器调试端口 {cdp_port} 未就绪。请先启动浏览器调试模式")
        sys.exit(1)


# ═══════════════════════════════════════════════════════════════════════
# XML 工具
# ═══════════════════════════════════════════════════════════════════════

def escape_xml(text: str) -> str:
    """转义 XML 五种特殊字符"""
    return (text
            .replace("&", "&amp;")
            .replace("<", "&lt;")
            .replace(">", "&gt;")
            .replace('"', "&quot;")
            .replace("'", "&apos;"))


# ═══════════════════════════════════════════════════════════════════════
# 自定义异常 — 登录状态检测
# ═══════════════════════════════════════════════════════════════════════

class LoginExpiredError(Exception):
    """检测到未登录状态时抛出,避免生成空RSS"""
    pass


# ═══════════════════════════════════════════════════════════════════════
# 核心抓取逻辑 — Playwright CDP 模式
# ═══════════════════════════════════════════════════════════════════════

async def scrape_forum(cdp_port: int = 9222):
    """
    通过 CDP 连接浏览器,抓取论坛帖子列表
    
    返回: [{"tid", "title", "href", "category", "author", "pubDate"}, ...]
    登录失效时抛 LoginExpiredError
    
    适配: Discuz! 论坛模板 (tbody[id^='normalthread_'])
    """
    from playwright.async_api import async_playwright

    ws_url = ensure_browser_cdp(cdp_port)

    async with async_playwright() as pw:
        browser = await pw.chromium.connect_over_cdp(ws_url)
        log("已连接浏览器")

        ctx = browser.contexts[0]

        # 复用已有论坛标签页
        existing_page = None
        for p in ctx.pages:
            if "<<FORUM_DOMAIN_KEYWORD>>" in p.url:    # 替换为论坛域名关键词
                existing_page = p
                log(f"复用已有标签")
                break

        if existing_page:
            page = existing_page
        else:
            page = await ctx.new_page()
            log("创建新标签页")

        log(f"导航到 {FORUM_URL}")
        await page.goto(FORUM_URL, wait_until="domcontentloaded", timeout=20000)
        await asyncio.sleep(3)  # 等待 JS 渲染完毕

        # ── 登录状态检测 ──
        page_text = await page.inner_text("body")
        # 根据目标论坛的未登录特征调整检测条件
        if ("<<LOGIN_REQUIRED_TEXT1>>" in page_text or 
            "<<LOGIN_REQUIRED_TEXT2>>" in page_text):
            await browser.close()
            raise LoginExpiredError("检测到未登录状态")

        log(f"页面标题: {await page.title()}")

        # ── 解析帖子列表(Discuz! 通用 DOM 结构)──
        posts = await page.evaluate("""() => {
            const posts = [];
            const tbodies = document.querySelectorAll("tbody[id^='normalthread_']");

            tbodies.forEach(tbody => {
                try {
                    const th = tbody.querySelector("th.common, th.new");
                    if (!th) return;

                    // 标题和链接
                    const titleLink = th.querySelector("a.s.xst, a.xst");
                    if (!titleLink) return;
                    const title = titleLink.textContent.trim();
                    const href = titleLink.getAttribute("href");

                    // 分类标签
                    const catEl = th.querySelector("em a");
                    const category = catEl ? catEl.textContent.trim() : "";

                    // 作者和发布日期
                    const resTi = th.querySelector("p.res-ti");
                    let author = "";
                    let pubDate = "";
                    if (resTi) {
                        const authorLink = resTi.querySelector("a");
                        if (authorLink) author = authorLink.textContent.trim();
                        const text = resTi.textContent;
                        const parts = text.split("\u2022");  // • 分隔符
                        if (parts.length > 1) pubDate = parts[1].trim();
                    }

                    // fallback: 从 td.by 获取作者
                    if (!author) {
                        const byCite = tbody.querySelector("td.by cite a");
                        if (byCite) author = byCite.textContent.trim();
                    }

                    // fallback: 从 td.by em span 获取日期
                    if (!pubDate) {
                        const dateSpan = tbody.querySelector("td.by em span");
                        if (dateSpan) pubDate = dateSpan.textContent.trim();
                    }

                    // 从 tbody id 提取帖子ID
                    const tidMatch = tbody.id.match(/normalthread_(\\d+)/);
                    const tid = tidMatch ? tidMatch[1] : "";

                    posts.push({ tid, title, href, category, author, pubDate });
                } catch(e) {}
            });
            return posts;
        }""")

        log(f"抓取到 {len(posts)} 条帖子")

        if not existing_page:
            await page.close()
        await browser.close()

    return posts


# ═══════════════════════════════════════════════════════════════════════
# RSS 生成 — 标准 RSS 2.0 XML
# ═══════════════════════════════════════════════════════════════════════

def build_rss_xml(posts: list) -> str:
    """根据帖子列表生成标准 RSS 2.0 XML"""
    now_rfc2822 = format_datetime(datetime.now())

    items_xml = []
    for post in posts:
        link = (post["href"] if post["href"].startswith("http")
                else BASE_URL.rstrip("/") + "/" + post["href"].lstrip("/"))

        pub_date = parse_forum_date(post["pubDate"]) if post["pubDate"] else now_rfc2822

        category_prefix = f"[{post['category']}] " if post["category"] else ""
        title_full = f"{category_prefix}{post['title']}"

        description = f"<p>{escape_xml(title_full)}</p>"
        if post["author"]:
            description += f"<p>作者: {escape_xml(post['author'])}</p>"
        description += f'<p><a href="{escape_xml(link)}">点击查看原文</a></p>'

        item = f"""    <item>
      <title><![CDATA[{escape_xml(title_full)}]]></title>
      <link>{escape_xml(link)}</link>
      <guid isPermaLink="true">{escape_xml(link)}</guid>
      <pubDate>{pub_date}</pubDate>
      <description><![CDATA[{description}]]></description>
    </item>"""
        items_xml.append(item)

    return f"""<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title><![CDATA[{escape_xml(FORUM_TITLE)}]]></title>
    <link>{escape_xml(FORUM_LINK)}</link>
    <description><![CDATA[{escape_xml(FORUM_DESC)}]]></description>
    <language>zh-CN</language>
    <lastBuildDate>{now_rfc2822}</lastBuildDate>
    <pubDate>{now_rfc2822}</pubDate>
    <generator>Forum RSS Generator (CDP)</generator>
    <atom:link href="{escape_xml(RSS_DEPLOY_URL)}" rel="self" type="application/rss+xml"/>
{chr(10).join(items_xml)}
  </channel>
</rss>"""


# ═══════════════════════════════════════════════════════════════════════
# 部署 — Pages 服务 CLI 部署
# ═══════════════════════════════════════════════════════════════════════

def deploy_to_pages(rss_content: str) -> bool:
    """
    将文件部署到 Pages 服务(如 Cloudflare Pages / Netlify)
    
    部署内容:
      - index.html:      空白首页(防目录列表暴露)
      - robots.txt:      全站禁止搜索引擎
      - _headers:        XML 文件 X-Robots-Tag: noindex
      - {SUBDIR_L1}/{SUBDIR_L2}/{RSS_FILENAME}: RSS文件
    """
    tmpdir = tempfile.mkdtemp(prefix="pages_deploy_")

    # 空白首页
    with open(os.path.join(tmpdir, "index.html"), "w", encoding="utf-8") as f:
        f.write("""<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"><title>RSS Service</title></head>
<body></body>
</html>""")

    # robots.txt — 全站禁止搜索引擎爬取
    with open(os.path.join(tmpdir, "robots.txt"), "w", encoding="utf-8") as f:
        f.write("User-agent: *\nDisallow: /\n")

    # _headers — XML 文件响应头防索引
    with open(os.path.join(tmpdir, "_headers"), "w", encoding="utf-8") as f:
        f.write(f"/{SUBDIR_L1}/{SUBDIR_L2}/{RSS_FILENAME}\n")
        f.write("  X-Robots-Tag: noindex\n")

    # 两层随机子目录 + RSS 文件
    subdir_path = os.path.join(tmpdir, SUBDIR_L1, SUBDIR_L2)
    os.makedirs(subdir_path, exist_ok=True)
    with open(os.path.join(subdir_path, RSS_FILENAME), "w", encoding="utf-8") as f:
        f.write(rss_content)

    # ── 调用 Pages CLI 部署 ──
    # 示例: Cloudflare Wrangler
    # 替换为实际 CLI 路径和命令
    log("通过 CLI 部署到 Pages 服务...")
    try:
        env = os.environ.copy()
        env["PAGES_API_TOKEN"] = PAGES_API_TOKEN
        env["PAGES_ACCOUNT_ID"] = PAGES_ACCOUNT_ID

        # -- 替换为实际 CLI 可执行文件路径 --
        node_path = "<<YOUR_NODE_PATH>>"
        cli_path = "<<YOUR_CLI_PATH>>"

        cmd = [
            node_path, cli_path,
            "pages", "deploy", tmpdir,
            "--project-name", PAGES_PROJECT_NAME,
            "--branch", "main"
        ]

        result = subprocess.run(
            cmd, env=env,
            capture_output=True, text=True, encoding="utf-8",
            errors="replace", timeout=120
        )
        output = (result.stdout or "") + (result.stderr or "")
        log(output.strip())

        if result.returncode != 0:
            log(f"[FAIL] 部署失败 (exit {result.returncode})")
            return False

        log(f"[OK] 部署成功!")
        log(f"[OK] RSS 地址: {RSS_DEPLOY_URL}")

    except subprocess.TimeoutExpired:
        log("[FAIL] 部署超时")
        return False
    except Exception as e:
        log(f"[FAIL] 部署失败: {e}")
        return False
    finally:
        shutil.rmtree(tmpdir, ignore_errors=True)

    return True


# ═══════════════════════════════════════════════════════════════════════
# 入口 — 含重试与异常处理
# ═══════════════════════════════════════════════════════════════════════

def main():
    log("=" * 50)
    log("论坛 RSS 生成器启动 (CDP + Pages 部署)")
    log(f"目标: {RSS_DEPLOY_URL}")

    try:
        posts = None
        for attempt in range(2):
            try:
                posts = asyncio.run(scrape_forum())
                break
            except LoginExpiredError as le:
                if attempt == 0:
                    log(f"[WARN] 第1次抓取失败: {le},5秒后重试...")
                    time.sleep(5)
                else:
                    log(f"[FAIL] 第2次抓取仍失败: {le}")
                    log("[INFO] 登录状态失效,本次RSS更新已跳过")
                    sys.exit(0)

        if not posts:
            log("[FAIL] 未抓取到任何帖子")
            sys.exit(1)

        log(f"共抓取 {len(posts)} 条帖子,生成 RSS...")

        rss_content = build_rss_xml(posts)
        log(f"RSS 生成完毕,大小: {len(rss_content)} 字符")

        # 本地备份
        local_path = os.path.join(SCRIPT_DIR, RSS_FILENAME)
        with open(local_path, "w", encoding="utf-8") as f:
            f.write(rss_content)
        log(f"本地备份: {local_path}")

        # 部署
        ok = deploy_to_pages(rss_content)
        if ok:
            log(f"[OK] 全部完成! RSS 地址: {RSS_DEPLOY_URL}")
        else:
            log("[FAIL] 部署失败")
            sys.exit(1)

        # 预览
        log("\n--- 前5条帖子 ---")
        for p in posts[:5]:
            cat = f"[{p['category']}] " if p.get("category") else ""
            log(f"  {cat}{p['title']} | {p.get('author','?')} | {p.get('pubDate','?')}")

    except Exception as e:
        log(f"[FAIL] 脚本异常: {e}")
        import traceback
        with open(LOG_FILE, "a", encoding="utf-8") as f:
            f.write(traceback.format_exc())
        sys.exit(1)


if __name__ == "__main__":
    main()

注意

Cloudflare Pages默认域名可能无法直接访问,建议绑定自己的域名。

利用AI智能体+Cloudflare给任意网页制作即时RSS最先出现在龙鲲博客

免费领取豆包会员1个月(含Seedance 2.5视频模型)

2026-08-27 19:49:09

本文于 2026年8月29日 3:05 更新,注意查看最新内容

前言

前几天的时候看新闻,说TRAE、扣子并入豆包,当时还挺诧异的,毕竟TRAE和扣子的风格跟豆包还是有些差异的,面向的用户群体也不太一样,这条消息看完也就抛在了脑后。今天看到消息,说下载豆包工作免费领1个月标准版会员(原价68元),于是下载了一个,确实领到了会员,这里简单记录,以备日后查阅。

方法

1.打开豆包工作官网 https://www.doubao.com/work

2.点击下载豆包工作按钮,选择显示当前设备一行进行下载

3.下载好后进行安装,然后登录豆包账号,此时会员会自动到账(全端通用,包括网页端、手机端)。

玩法

1.豆包云电脑

这是我平常用得比较多的功能,但是受限于普通用户的额度,基本上没用几次就无法使用了,使用路径如下,可切换会员模型。

2.AI创作图片使用Seedream 5.0 Pro模型,AI创作视频可以使用Seedance 2.5模型。

3.AI生成的图片与视频去水印。具体步骤如下:

①先生成一个图片或视频。

②单击任意图片正中间(不要点击下载图标)。

③在打开的侧边窗口右上角点击三个点,

④开启去除“AI 生成”水印开关并保存,此时图片左上角不再显示AI水印。

核心的功能区别主要就是上述这几个,其他主要是额度的不一样,标准会员会比普通用户多几倍。

后话

部分用户有标准版1元连续包月,开通路径在额度状态-升级至标准套餐,具体自行验证,若仅需一个月会员,记得在开通后取消连续包月。

免费领取豆包会员1个月(含Seedance 2.5视频模型)最先出现在龙鲲博客

无限免费使用MiniMax M3 AI大模型的方法

2026-08-26 15:29:17

本文于 2026年8月26日 7:32 更新,注意查看最新内容

前言

自从进入AI时代,Token一词开始频频出现在人们的视野中,这个AI的计费单位也在以极快的速度消耗着大家的钱包。很多用AI的时候,用着用着就开始提示额度有些紧张,甚至无法继续使用,而本文则是介绍一个短期可以无限使用AI大模型的方法,以供大家参考。方法也很简单,但因为是无限使用,并且并发数极高,所以依旧是手慢无。

方法

MiniMax和GMI Cloud最近有个联名活动,活动大概的内容为将MiniMax M3、M2.7、Speech 2.8和Music 3.0免费使用十四天,时间是2026.08.24 – 2026.09.06,在此期间不限制使用额度,并发数实际测试下来也非常高(200以内不会报429),个人使用完全没问题,下面介绍具体方法:

注册GMI账号

1.打开GMI官网https://www.gmicloud.ai/ ,点击右上角黄色按钮SIGN IN。

2.在登录页面点击Sign in进入注册页面。

3.按照顺序依次输入注册邮箱、密码,并勾选服务条款,最后点击Sign up注册。

4.注册完成后(忘了是否会自动登录,若未登录,重复第1、2步进行登录),在下图同样位置找到Create API Key点击。

5.在弹窗的文本框输入任意文字后,点击Create Key创建密钥。

6.点击下图位置进行复制,并粘贴至记事本中,后续需要使用(该密钥只会显示1次,若遗失可重复第4、5步重新获取)。

至此,前期的准备工作已全部完成,下面介绍如何接入WorkBuddy中。

接入WorkBuddy

1.打开WorkBuddy,选择页面输入框右下角的Auto,点击配置自定义模型。

2.在弹出的窗口中选择供应商,滑到最下面,点击自定义/Custom。

3.此时会打开一个新窗口,按照如下信息填写,并勾选图片输入、推理模式,最后点击确定。

接口地址:https://api.gmi-serving.com/v1/chat/completions

API Key:注册GMI账号中复制粘贴的密钥

模型名称:MiniMaxAI/MiniMax-M3

4.回到WorkBuddy首页切换成自定义接入的M3模型,即可正常使用,此时也不再消耗内置积分。

后话

MiniMax-M3这个模型处理不了特别复杂的任务,但日常用来办公什么的还是绰绰有余,目前在WorkBuddy的内置模型中,消耗积分的速度甚至还超过了DeepSeek-V4-Flash,如果平常主要使用的就是M3模型,那该活动应该能替你省下不少的Token,另外免费的几款模型也有一定可玩性,可以接入相关的工具用来输出语音对话内容。

无限免费使用MiniMax M3 AI大模型的方法最先出现在龙鲲博客

全国联通1分钱领B站大会员月卡+15G B站定向流量

2026-08-15 15:53:47

本文于 2026年8月15日 4:42 更新,注意查看最新内容

前言

很早之前因为看动漫没广告入坑了哔哩哔哩(B站),后来又用它来学东西,一直用到了今天,也算是手机必备软件之一。今天看到消息,说联通手机号可以1分钱领B站大会员,于是尝试了一下,确实是可以领取的,并且没有什么套路,这里简单记录,以备日后查阅。

原理

联通官方有个叫哔哩哔哩15G流量加月会员合约包的业务,业务内容为15G哔哩哔哩定向流量+哔哩哔哩大会员月卡。虽然叫合约包但是没有合约,首月订购只需要1分钱,我们只需要在订购后将业务包退订便可以1分钱领B站大会员月卡+15G B站定向流量,退订之后不影响已到账的月卡和定向流量。流程也非常的简单,全程线上操作即可。

方法

1.将B站绑定手机号更换为需要开通该业务包的联通号码(开通后,B站大会员月卡默认会自动充值到开通业务包的联通号码中),若不介意充值哪个B站号,则无需操作该步骤。

2.打开活动链接:https://operation.bol.wo.cn/a/#/e86e506acf4f ,输入联通手机号,进行开通(不放心的可以看一下活动细则)。

3.开通后打开B站大会员页面查看大会员是否已经到账 https://big.bilibili.com/pc/bigHistory

APP查看路径为:底部我的-大会员中心-右上角竖着的三个点-查看开通记录。

4.打开中国联通APP查看15G B站定向流量是否已经到账。

5.在中国联通APP中点击底部导航服务按钮,找到已订业务。

6.在已订业务页面点击哔哩哔哩15G流量加月会员合约包后方退订按钮进行退订。

退订流程为:获取验证码-输入验证码-选择退订原因-点击残忍退订按钮。

7.退订完成后查看是否收到退订成功短信。

注意

产品介绍中显示若用户订购本产品后6个自然月(含订购当月)内退订,则自退订之日起12个自然月内无法订购本产品。之所以在这里特别说明这一点,是因为在产品介绍中还有另一句话,对于非首次订购用户,若该用户本次订购本产品的生效日期与前次订购本产品的生效日期的时间间隔超过6个自然月,则本次订购可享受首月优惠价格(0.01元/月)。也就是说,明年这个业务包如果还没有下架的情况下,还可以以同样流程再次以1分钱进行订购。

全国联通1分钱领B站大会员月卡+15G B站定向流量最先出现在龙鲲博客

不自动关机:免费领取6个月华为云电脑

2026-08-12 15:25:59

本文于 2026年8月12日 6:55 更新,注意查看最新内容

前言

之前参加华为云的沃土计划,注册了华为云的开发者账号,后来发现华为云开发者每年会赠送800核时的云开发环境,可以免费使用开发桌面和虚拟机,也尝试了一下,感觉还挺不错的,但800核时算下来,用不了太长的时间,于是也就吃灰了。最近看到消息,说赠送的核时翻了10倍,于是就去看了一下,发现确实是的,感觉可玩性就变高了很多,这里简单记录一下,以备日后查阅。

领取

老用户(已经是华为云开发者):

1.在华为云开发者官网进行登录(https://developer.huaweicloud.com/)。

2.鼠标移动到官网顶部的开发按钮,在弹出的页面中选择开发者空间。

3.在左边侧边栏的开发平台中选择云开发环境。

4.这时你会发现已经自动到账了8000核时(图片不足8000核时是因为我测试用了一点)。

如果是新用户(未注册华为云开发者),需要先在华为云开发者官网进行注册(https://developer.huaweicloud.com/)。注册好之后,进行开发者实名认证,大概流程为:选择个人开发者类型,再进行实名认证,之后的领取流程则和上面老用户一样。

使用

云开发环境支持创建的方式有三种:容器、虚拟机、开发桌面,标题所说的云电脑为创建开发桌面。

具体步骤如下:

1.在云开发环境中点击开发桌面,选择创建。

2.鼠标点击立即进入按钮,选择进入桌面(该桌面的开机、关机、删除在点击更多按钮后显示)。

关于核时的计费:

账单按照小时维度进行更新,账单单位为核时。

假设用户创建了一个四核的容器开发环境,并在开机后一小时后关机,那么将会产生 4(核)* 1(小时)= 4(核时)的消耗。

8000核时如果只使用4核的容器可以用2000小时,如果只使用2核时的容器可以用4000个小时(差不多6个月)。

注意:建议使用完记得及时关机以节省核时。

参考

《费用账单》

不自动关机:免费领取6个月华为云电脑最先出现在龙鲲博客

手慢无:免费领取永久腾讯QQ VIP邮箱后缀

2026-08-04 17:49:58

本文于 2026年8月4日 7:29 更新,注意查看最新内容

前言

这两天看到一条热搜引起的讨论,叫“发现好多大学生不懂邮件礼仪”,大概是说现在即时通讯软件的流行,导致很多的大学生在毕业求职时使用邮件不遵守相关的礼仪。这一点我还颇为感慨,毕竟学校从来也没教过这个,但一到找工作的时候,很多的用人单位都习惯使用邮件进行接收简历,一开始也有些不适应。这个热点当时看过之后也就迅速的抛在了脑后,直到今天发现有相关的活动,可以免费领一个永久的腾讯QQ VIP邮箱,这里简单记录,以备日后查阅。

VIP邮箱的优势

因为腾讯QQ的VIP邮箱后缀一直是付费产品,所以使用的人没有那么多,很多短且好记的后缀都未被注册,可以极大几率注册自己喜欢的前缀或者与之匹配的规范前缀。其次就是使用的人没那么多,垃圾邮件自然也不会很多,个人感觉正常发送邮件不容易进垃圾箱(这里主要指给国外邮箱发送邮件)。

原理

早期的腾讯QQ VIP邮箱后缀是属于QQ会员和超级会员的权益,后来QQ邮箱上线了单独的邮箱会员,也把@vip.qq.com的邮箱后缀加在了付费的权益里,而之前QQ会员的权益仍然保留了下来,只是手机端似乎不再显示,官网仍有页面介绍,本文就是使用QQ会员的权益进行的正常领取,只不过全程免费罢了,所以如果你已经有QQ会员或者通过我之前的文章领到了会员,那么可以跳过方法中领取QQ会员的步骤,直接查看方法中第5步之后的如何领取VIP邮箱后缀。

方法

1.应用市场下载元宝APP,注册并登录。

2.打开底部菜单栏最右边的我们,并点击福利中心。

3.完成每日问元宝得积分、开启通知权限、参与体验优化计划这三个任务(预计完成时间不到1分钟,参与体验优化计划会使用你的数据脱敏给模型学习,介意的话可以换个任务,开启后想要关闭的入口为:首页-我们-设置-数据与隐私-数据使用与推荐-体验优化计划-关闭)。

PS:不清楚这任务是不是每个人都一样,但我看到下面还有很多通用任务,例如问元宝问题、使用写作能力等,集齐10000积分应该很容易。

4.集齐10000积分后点击任务列表的兑换商城,找到QQ超级会员1天卡进行兑换。

PS:兑换前需要绑定QQ号,建议使用常用QQ绑定,后续无法进行换绑。

5.打开QQ邮箱登录刚才兑换了QQ超级会员的QQ号(QQ邮箱官网:https://mail.qq.com/ )。

6.点击右上角头像,选择账号与安全。

7.在账号安全中的VIP邮箱一栏点击申请开通。

8.设置自己喜欢的邮箱前缀或者规范的邮箱前缀。

关于QQ会员过期是否可以继续使用VIP邮箱地址

按照官方的QQ邮箱帮助系统内的显示:vip邮箱地址不会受到QQ会员过期的影响。在会员过期后,vip地址依然可以正常收、发邮件,请放心使用(原文链接:https://service.mail.qq.com/detail/0/360)。

手慢无:免费领取永久腾讯QQ VIP邮箱后缀最先出现在龙鲲博客