<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>袁某人博客</title><description>一个偏生活类的个人博客网站，整体风格简洁克制，偏向长期积累型写作，用持续输出构建个人知识体系与数字足迹。字里行间，自有山海。用笔触捕捉时间，以阅读抵抗虚无。我是袁某人，这里是我的精神自留地。</description><link>https://jb18.cm/</link><language>zh-CN</language><item><title>给你的文章添加 AI 创作等级标识</title><link>https://jb18.cm/blog/2026-02-01-%E7%BB%99%E4%BD%A0%E7%9A%84%E6%96%87%E7%AB%A0%E6%B7%BB%E5%8A%A0-ai-%E5%88%9B%E4%BD%9C%E7%AD%89%E7%BA%A7%E6%A0%87%E8%AF%86/</link><guid isPermaLink="true">https://jb18.cm/blog/2026-02-01-%E7%BB%99%E4%BD%A0%E7%9A%84%E6%96%87%E7%AB%A0%E6%B7%BB%E5%8A%A0-ai-%E5%88%9B%E4%BD%9C%E7%AD%89%E7%BA%A7%E6%A0%87%E8%AF%86/</guid><description>给文章添加 AI 创作等级告知读者文章由 AI 介入的程度，0级表示纯原创，1级表示用 AI 获得灵感或校对，2级表示协助生成部分内容但由作者把控，3级表示 AI 生成主体作者小幅度修改或复合也或者整体由 AI 生成。</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这是今天下午维护《&lt;a href=&quot;https://zhblog.org/&quot;&gt;中文独立博客契约&lt;/a&gt;》时突然冒出来的一个想法，既然独立博客以真实和独立为根本，那么有必要告知访客正在读的内容是不是 AI 生成，AI 都参与了哪些部分？&lt;/p&gt;
&lt;p&gt;这不仅是独立博客自信的表现，也是对访客读者的尊重和负责。&lt;/p&gt;
&lt;p&gt;但是如果标注 AI 参与的部分会把页面搞得乱糟糟的，于是我想到把 AI 参与程度分为 0~3 共四个等级。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI 0&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;等级 0 为原创，每个字都是作者一个个敲出来的没有 AI 参与，可以标注原创或不声明。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;text-green-600&quot;&gt;AI 1&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;等级 1 表示用 AI 辅助，如检查错别字和语法、总结参考，主体内容和思想是作者的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;text-orange-300&quot;&gt;AI 2&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;等级 2 表示部分内容由 AI 生成，作者进行复核，主体和思想各一半，作者被 AI 引导或左右。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;text-orange-600&quot;&gt;AI 3&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个程度如果不是教程文章访客就没必要看了，主体大纲和主要内容由 AI 创作，作者负责复核和修改，或者思想被 AI 引导。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;总结一下&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;AI 帮我检查作业，告诉我错在哪？我来改。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这题我不会，AI 告诉我该怎么做。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AI 给我写作业，或我照抄。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;我是怎么做的？&lt;/h3&gt;
&lt;p&gt;看看我&lt;a href=&quot;/blog/2026-01-16-cloudflare-workers--ios-%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4%E6%89%93%E9%80%A0%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%AE%9E%E6%97%B6%E7%8A%B6%E6%80%81%E6%A0%8F/&quot;&gt;上一篇文章&lt;/a&gt;，日期旁边的标注。&lt;/p&gt;
&lt;p&gt;🧑‍🎓&lt;/p&gt;
&lt;h3&gt;小课堂&lt;/h3&gt;
&lt;p&gt;那么有同学要问了：博主，文章是我自己写的只是让 AI 检查一下，为啥要标注？&lt;/p&gt;
&lt;p&gt;抱歉，用了就是用了，没什么可狡辩的，自欺欺人罢了。&lt;/p&gt;
</content:encoded></item><item><title>Cloudflare Workers + iOS 快捷指令：打造个人博客实时状态</title><link>https://jb18.cm/blog/2026-01-16-cloudflare-workers--ios-%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4%E6%89%93%E9%80%A0%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%AE%9E%E6%97%B6%E7%8A%B6%E6%80%81%E6%A0%8F/</link><guid isPermaLink="true">https://jb18.cm/blog/2026-01-16-cloudflare-workers--ios-%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4%E6%89%93%E9%80%A0%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%AE%9E%E6%97%B6%E7%8A%B6%E6%80%81%E6%A0%8F/</guid><description>本文手把手教你用 Cloudflare Workers 结合快捷指令给网站加个实时状态和访问量统计</description><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这篇文章将教你利用 Cloudflare Workers 结合 iOS 快捷指令更新实时状态并在网站上显示，同时集成一个简易的访客统计量。&lt;/p&gt;
&lt;p&gt;文中用到的实例基于生产环境代码，截至 2026年01月16日 正常使用。&lt;/p&gt;
&lt;h2&gt;一、前言与准备&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;核心思路&lt;/strong&gt;：利用 Cloudflare Workers 作为后端，KV 储存数据。iOS 快捷指令通过带有密钥的特定 URL 触发更新，前端通过公开接口读取展示。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;域名要求&lt;/strong&gt;：必须绑定到 Cloudflare。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;功能路径&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;路由&lt;/th&gt;
&lt;th&gt;获取方式&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;获取当前状态，返回 JSON 数据，浏览量 +1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/status/{密钥}/{状态文本}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;使用密钥更新状态文本&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;二、后端部署：Cloudflare Workers 和配置&lt;/h2&gt;
&lt;h3&gt;(1) 创建 KV 储存&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;登录 Cloudflare 控制台，前往“存储和数据库 &amp;gt; Workers KV”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击“创建命名空间”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;命名空间名称填写：&lt;code&gt;BLOG_STATUS_KV&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;(2) 创建 Workers 程序&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;前往“计算和 AI &amp;gt; Workers 和 Pages”，点击“创建应用程序”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;随便起个名字（如 &lt;code&gt;blog-status&lt;/code&gt;），点击部署。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入该 Worker 的详情页，点击右上角“编辑代码”，清空原有内容，复制粘贴以下代码：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;export default {
    async fetch(request, env) {
        const url = new URL(request.url);
        const pathname = url.pathname;

        // KV 键名常量
        const STORAGE_KEY = &apos;status&apos;;

        // 辅助函数：统一返回 JSON
        const jsonResponse = (data, status = 200) =&amp;gt; {
            return new Response(JSON.stringify(data), {
                status,
                headers: {
                    &apos;Content-Type&apos;: &apos;application/json&apos;,
                    &apos;Access-Control-Allow-Origin&apos;: &apos;*&apos;, // 允许跨域
                    &apos;Cache-Control&apos;: &apos;no-store&apos;         // 确保获取最新数据
                }
            });
        };

        try {
        // ===== 接口 1: 获取状态 (同时浏览量 views + 1) =====
        if (pathname === &apos;/api/status&apos; &amp;amp;&amp;amp; request.method === &apos;GET&apos;) {
            let data = await env.BLOG_STATUS_KV.get(STORAGE_KEY, { type: &apos;json&apos; });

            if (!data) {
                data = { 
                    status: &amp;quot;👋 Hello&amp;quot;, 
                    views: 0, 
                    uppubDatedAt: new pubDate().toISOString() 
                };
            }

            // 浏览量自增
            data.views = (data.views || 0) + 1;
            await env.BLOG_STATUS_KV.put(STORAGE_KEY, JSON.stringify(data));

            return jsonResponse(data);
        }

        // ===== 接口 2: 更新状态 (/api/status/{key}/{status}) =====
        if (pathname.startsWith(&apos;/api/status/&apos;) &amp;amp;&amp;amp; request.method === &apos;GET&apos;) {
            const parts = pathname.split(&apos;/&apos;);

            if (parts.length &amp;lt; 5) {
                return jsonResponse({ code: 400, message: &apos;Missing parameters&apos; }, 400);
            }

            const inputKey = parts[3];
            const newStatusText = decodeURIComponent(parts[4]); // 解码 URL 编码的中文

            // 鉴权
            if (inputKey !== env.SECRET_KEY) {
                return jsonResponse({ code: 401, message: &apos;Unauthorized&apos; }, 401);
            }

            let data = await env.BLOG_STATUS_KV.get(STORAGE_KEY, { type: &apos;json&apos; }) || { views: 0 };
            
            data.status = newStatusText;
            data.uppubDatedAt = new pubDate().toISOString();

            await env.BLOG_STATUS_KV.put(STORAGE_KEY, JSON.stringify(data));

            return jsonResponse(data);
        }

        return jsonResponse({ code: 404, message: &apos;Not Found&apos; }, 404);

        } catch (error) {
            return jsonResponse({ code: 500, message: &apos;Error&apos;, error: error.message }, 500);
        }
    }
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;(3) 设置密钥与绑定路由&lt;/h3&gt;
&lt;p&gt;代码保存后，回到 Worker 详情页：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;添加密钥：&lt;/strong&gt; 在“设置 &amp;gt; 变量和机密”中添加名为 &lt;code&gt;SECRET_KEY&lt;/code&gt; 的变量，值填入一段随机字符串（这是你的更新密钥，不要泄露），密钥和文本类型无区别。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;绑定路由：&lt;/strong&gt; 在“设置 &amp;gt; 域和路由”中添加自定义域或路由，比如“jb18.cm/api/*”。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;(4) 绑定 KV 命名空间&lt;/h3&gt;
&lt;p&gt;在 Worker 详情页，点击上面菜单的绑定，点击添加绑定，在右边选择 KV 命名空间，点击添加绑定，在“KV 命名空间绑定”区域，变量名称为 &lt;code&gt;BLOG_STATUS_KV&lt;/code&gt;（需与代码中的 &lt;code&gt;env.BLOG_STATUS_KV&lt;/code&gt; 保持一致），然后选择你刚刚创建的命名空间。&lt;/p&gt;
&lt;h3&gt;(5) 设置速率限制器规则&lt;/h3&gt;
&lt;p&gt;在域名管理页面，在“安全性 &amp;gt; 安全规则”点击右上角创建规则（自定义规则）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;匹配：&lt;/strong&gt; 路径等于 /api/*。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;阈值：&lt;/strong&gt; 10 秒内请求超过 1 次（根据需求调整）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;动作：&lt;/strong&gt; 拦截。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好了，你现在可以在浏览器试试获取和更新数据。&lt;/p&gt;
&lt;h2&gt;三、前端：获取并展示数据&lt;/h2&gt;
&lt;p&gt;使用 sessionStorage 确保单次会话只请求一次接口，避免恶意刷新导致浏览量激增。&lt;/p&gt;
&lt;p&gt;接口被刷不要紧，有速率限制器和 Cloudflare CDN 防护。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;async function fetchStatus() {
    const cacheKey = &apos;status_data&apos;;
    const cachedData = sessionStorage.getItem(cacheKey);

    if (cachedData) {
        renderStatus(JSON.parse(cachedData));
    } else {
        try {
            const response = await fetch(&apos;/api/status&apos;);
            const data = await response.json();

            sessionStorage.setItem(cacheKey, JSON.stringify(data));
            renderStatus(data);
        } catch (error) {
            console.error(&apos;获取状态失败:&apos;, error);
        }
    }

    function renderStatus(data) {
        if (!data) return;
        
        // 在这里编写你的 DOM 处理逻辑
        // 例如：document.getElementById(&apos;status-box&apos;).innerText = data.status;
        console.log(&apos;当前实时状态：&apos;, data);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;四、iOS 快捷指令：实时更新&lt;/h2&gt;
&lt;p&gt;最后两个指令是“URL”和“获取URL内容”。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;URL：&lt;/strong&gt; 输入“https://{domain}/api/status/{key}/{status}”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获取 URL 内容：&lt;/strong&gt; 方法选 GET&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;进阶玩法：&lt;/strong&gt; 你可以在顶部添加 “获取我的快捷指令”，选择 “输入快捷指令的信息”，再将信息添加到变量，那么你就可以在自动化中调用这个统一接口，比如当手机连接到公司 Wi-Fi 时调用这个指令，自动触发接口将状态改为“💼 办公中”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2026/01/16/745b766ad51b9220bed52d8db49dd2a3.webp&quot; alt=&quot;快捷指令设置截图&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 请务必确认你的 SECRET_KEY 已经通过 Cloudflare 后台设置并部署，否则更新接口将无法通过验证。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;修改记录&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[2026-01-21]:&lt;/strong&gt; 调整文章格式，删除和添加空格&lt;/p&gt;
</content:encoded></item><item><title>不要用 Astro Image 组件加载图片</title><link>https://jb18.cm/blog/2025-10-12-%E4%B8%8D%E8%A6%81%E7%94%A8-astro-image-%E7%BB%84%E4%BB%B6%E5%8A%A0%E8%BD%BD%E5%9B%BE%E7%89%87/</link><guid isPermaLink="true">https://jb18.cm/blog/2025-10-12-%E4%B8%8D%E8%A6%81%E7%94%A8-astro-image-%E7%BB%84%E4%BB%B6%E5%8A%A0%E8%BD%BD%E5%9B%BE%E7%89%87/</guid><description>Astro &lt;Image&gt; 组件会自动转换图片到本地，导致 cdn 无效。</description><pubDate>Sun, 12 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Astro 的 &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; 组件会自动转换远程图片保存到本地，导致 CDN 无效。我今天禁用缓存才发现这个问题，之前一直用本地缓存没发现这个问题😓&lt;/p&gt;
&lt;p&gt;Cloudflare Page 在海外加载效果不错在大陆非常缓慢，但 R2 储存的速度还是可以的，在大陆尽量不要用 Page 加载本地包里的图片。&lt;/p&gt;
&lt;p&gt;不让 Astro 自动转换也很简单，在 &lt;code&gt;astro.config.js&lt;/code&gt; 删掉这个配置即可会显示原始图片不做任何处理，但有个弊端就是在本地调试时无法加载远程图片。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;   image: {
       domains: [&apos;res.jb18.cm&apos; ...],
   }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Astro 的 &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; 组件用来加载本地的背景图、图标等很不错，会自动转换格式压缩，但用来加载 CDN 图片非常鸡肋，一个是既然用 CDN 了就不在乎质量只要 CDN 的速度就行，再者转换会保存到本地导致包非常大。&lt;/p&gt;
</content:encoded></item><item><title>甘南之旅-扎尕那</title><link>https://jb18.cm/blog/2025-09-15-%E7%94%98%E5%8D%97%E4%B9%8B%E6%97%85-%E6%89%8E%E5%B0%95%E9%82%A3/</link><guid isPermaLink="true">https://jb18.cm/blog/2025-09-15-%E7%94%98%E5%8D%97%E4%B9%8B%E6%97%85-%E6%89%8E%E5%B0%95%E9%82%A3/</guid><description>2025年甘南之旅，途径的扎尕那风景区，最高海拔4020米。</description><pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/09/15/40b8541593b3ce892ae17fcd78763f80.png&quot; alt=&quot;洛克之路起点进入非铺装路&quot;&gt;
&lt;em&gt;洛克之路起点进入非铺装路&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/09/15/988395c4c9f76c20abed79d587951fce.png&quot; alt=&quot;开始拔高1&quot;&gt;
&lt;em&gt;开始拔高1&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/09/15/693598128d97300116b3de12c9dbefe9.png&quot; alt=&quot;开始拔高2&quot;&gt;
&lt;em&gt;开始拔高2&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/09/15/02c77250febb501142ab69c37594fa7b.png&quot; alt=&quot;拔高途中&quot;&gt;
&lt;em&gt;拔高途中&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/09/15/36f216620968eafe575b738b04f773fa.png&quot; alt=&quot;4000多米，问题不大打火机还能用&quot;&gt;
&lt;em&gt;问题不大，打火机还能打着火&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/09/15/f514519ef5fc3df8707a13f20064768f.png&quot; alt=&quot;扎尕那北门1&quot;&gt;
&lt;em&gt;扎尕那北门1&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/09/15/71778a77bedfde86e24a0d14900d54a7.png&quot; alt=&quot;扎尕那北门2&quot;&gt;
&lt;em&gt;扎尕那北门2&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/09/15/e66f46972317a10caa258735a4f5f6a0.png&quot; alt=&quot;扎尕那途径点&quot;&gt;
&lt;em&gt;途径点&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;9月2号早上出发 7号下午到家，总共6天行程，这次带了无人机、运动相机、单反相机，拍了不少照片和视频，但博客图床资源有限要省着用，保存几张好看的照片。&lt;/p&gt;
&lt;p&gt;这是第二天从岷县到达扎尕那的路上，途径的洛克之路到达扎尕那。&lt;/p&gt;
</content:encoded></item><item><title>PicGo上传图片到Cloudflare R2储存桶</title><link>https://jb18.cm/blog/2025-05-10-picgo%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87%E5%88%B0cloudflarer2%E5%82%A8%E5%AD%98%E6%A1%B6/</link><guid isPermaLink="true">https://jb18.cm/blog/2025-05-10-picgo%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87%E5%88%B0cloudflarer2%E5%82%A8%E5%AD%98%E6%A1%B6/</guid><description>用 PicGo 客户端上传图片到 Cloudflare R2 储存桶，作为免费图床使用。</description><pubDate>Sat, 10 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/Molunerfinn/PicGo&quot;&gt;PicGo&lt;/a&gt; 是一个用于快速上传图片并获取 URL 链接的工具，默认支持 七牛云、腾讯云、又拍云、阿里云 OSS 等，本文将用 PicGo 客户端上传图片到 Cloudflare R2 储存桶里，R2 储存免费套餐每月有 100w 免费读取次数，加上防火墙拒绝爬虫足够个人网站使用。&lt;/p&gt;
&lt;p&gt;本文使用的是 2.4.0-beta.9 windows 版本，前往 &lt;a href=&quot;https://github.com/Molunerfinn/PicGo/releases&quot;&gt;https://github.com/Molunerfinn/PicGo/releases&lt;/a&gt; 查看下载所有版本。&lt;/p&gt;
&lt;h2&gt;一、创建 R2 储存桶获取密钥&lt;/h2&gt;
&lt;p&gt;创建好储存桶后，获取 User API 令牌。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/05/11/f3e608be2fdea4e542fa3efdd7ec0464.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/05/10/59a9e700e7ebfd0f357b9e1f2fd91eb2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;名称自定义，选择对象读写并指定储存桶，点击创建。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/05/10/69515bd6958fa9561bcce54ccbfc81f4.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;注意！先不要关闭，密钥只显示这一次，任何时候都不要备份密钥，忘记只需要重新生成即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/05/10/4e19e249e8c539abade2d0cc2b45ac93.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;二、配置 PicGo 客户端&lt;/h2&gt;
&lt;p&gt;在插件设置里搜索安装 s3（可能较慢），打开图床设置的 Amazon S3，添加或修改默认的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/05/10/3e44b3f5b5a07624071ecaaae6e81132.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;开始写入配置&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图床配置名&lt;/strong&gt;：本地区分，随意填写。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用密钥 ID&lt;/strong&gt;：对应 R2 访问密钥 ID。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用密钥&lt;/strong&gt;：对应 R2 机密访问密钥。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;桶名&lt;/strong&gt;：对应 R2 储存桶名。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上传文件路径&lt;/strong&gt;：上传成功后域名后面的路径，变量名参考我将写在最后。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;地区&lt;/strong&gt;：填“auto”即可。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义节点&lt;/strong&gt;：对应 R2 最下面以 .r2.cloudflarestorage.com 结尾的链接。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义输出 URL 模板&lt;/strong&gt;：上传成功后自动复制的链接格式，填入 “https://域名/{path}” 即可，{path} 对应上面的 上传文件路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/05/11/be93a4780a96e07d1d112e21992d0663.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;确定，其他配置保持默认。&lt;/p&gt;
&lt;h2&gt;三、自定义域和安全&lt;/h2&gt;
&lt;p&gt;进入 R2 储存桶设置，先添加自定义域，测试完成再添加 CORS 策略。&lt;/p&gt;
&lt;p&gt;R2 储存桶默认不允许公开访问，需修改为允许公开访问。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/05/10/00881e5edeaeda39a930a465395c267e.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.jb18.cm/img/2025/05/10/9bbfcebd35a6c4e1702a51b5d2db5db9.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在上传图片用自定义域链接打开。&lt;/p&gt;
&lt;p&gt;最后，CORS 策略写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[
    {
        &amp;quot;AllowedOrigins&amp;quot;: [
            &amp;quot;https://jb18.cm&amp;quot;,
            &amp;quot;https://wo.jb18.cm&amp;quot;
        ],
        &amp;quot;AllowedMethods&amp;quot;: [
            &amp;quot;GET&amp;quot;
        ],
        &amp;quot;AllowedHeaders&amp;quot;: [
            &amp;quot;*&amp;quot;
        ],
        &amp;quot;MaxAgeSeconds&amp;quot;: 604800
    }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AllowedOrigins&lt;/strong&gt;：允许来源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MaxAgeSeconds&lt;/strong&gt;：写入浏览器的缓存时间&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;路径变量名：&lt;/p&gt;
&lt;p&gt;{year}	当前日期 - 年&lt;/p&gt;
&lt;p&gt;{month}	当前日期 - 月&lt;/p&gt;
&lt;p&gt;{day}	当前日期 - 日&lt;/p&gt;
&lt;p&gt;{hour}	当前日期 - 时&lt;/p&gt;
&lt;p&gt;{minute}	当前日期 - 分&lt;/p&gt;
&lt;p&gt;{second}	当前日期 - 秒&lt;/p&gt;
&lt;p&gt;{millisecond}	当前日期 - 毫秒&lt;/p&gt;
&lt;p&gt;{timestamp}	Unix 时间戳&lt;/p&gt;
&lt;p&gt;{timestampMS}	Unix 时间戳（毫秒）&lt;/p&gt;
&lt;p&gt;{fullName}	完整文件名（含扩展名）&lt;/p&gt;
&lt;p&gt;{fileName}	文件名（不含扩展名）&lt;/p&gt;
&lt;p&gt;{extName}	扩展名（不含.）&lt;/p&gt;
&lt;p&gt;{md5}	图片 MD5 计算值&lt;/p&gt;
&lt;p&gt;{sha1}	图片 SHA1 计算值&lt;/p&gt;
&lt;p&gt;{sha256}	图片 SHA256 计算值&lt;/p&gt;
</content:encoded></item><item><title>屏蔽 Windows 联网激活和系统更新并切换 Administrator 账户</title><link>https://jb18.cm/blog/2025-04-16-%E5%B1%8F%E8%94%BDwindows%E8%81%94%E7%BD%91%E6%BF%80%E6%B4%BB%E5%92%8C%E7%B3%BB%E7%BB%9F%E6%9B%B4%E6%96%B0%E5%B9%B6%E5%88%87%E6%8D%A2administrator%E8%B4%A6%E6%88%B7/</link><guid isPermaLink="true">https://jb18.cm/blog/2025-04-16-%E5%B1%8F%E8%94%BDwindows%E8%81%94%E7%BD%91%E6%BF%80%E6%B4%BB%E5%92%8C%E7%B3%BB%E7%BB%9F%E6%9B%B4%E6%96%B0%E5%B9%B6%E5%88%87%E6%8D%A2administrator%E8%B4%A6%E6%88%B7/</guid><description>1.用命令行方式跳过联网激活。 2.用注册表方式来延长 windows 暂停更新时间，并且无副作用。 3.切换到 Admin 用户并删除其他用户。</description><pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;昨天下载了一个开源磁力链接下载器，结果给我装了一堆软件还卸不掉只能格式化😡，Github 下载东西也要谨慎。以下是重装 Windows 三部曲，记录备忘。&lt;/p&gt;
&lt;h2&gt;跳过引导页联网激活&lt;/h2&gt;
&lt;p&gt;在安装前拔掉网线，在引导联网页按 &lt;kbd&gt;Shift + F10&lt;/kbd&gt; 打开命令行窗口输入下面命令自动重启，下一步按钮旁边会多一个 “没有英特网” 的选项。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;OOBE\BYPASSNRO
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;屏蔽（延长）系统更新&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;kbd&gt;Win + R&lt;/kbd&gt; 输入 “regedit” 打开注册表，依次打开 &lt;code&gt;\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUppubDate\UX\Settings&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;右键 &amp;gt; 新建 &amp;gt; DWORD（32位）值，命名为 &lt;code&gt;FlightSettingsMaxPauseDays&lt;/code&gt;， 双击打开。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基数改为十进制，数值为暂停的天数; 我改了 5000 暂停至2038年。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开 设置 &amp;gt; Windows更新 &amp;gt; 暂停更新， 拉到底选最大的，选完显示个位数是溢出了不要紧。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;切换 Administrator 账户并删除其他用户&lt;/h2&gt;
&lt;p&gt;以管理员身份运行 cmd （菜单栏搜索框搜索cmd，右键）， 运行命令启用 Administrator 账户。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net user administrator /active:yes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在开始栏注销当前用户并登录 Administrator 用户，在 “控制中心 &amp;gt; 用户账户” 里删除其他账户。&lt;/p&gt;
</content:encoded></item><item><title>Hello Astro</title><link>https://jb18.cm/blog/2024-11-01-helloastro/</link><guid isPermaLink="true">https://jb18.cm/blog/2024-11-01-helloastro/</guid><description>再叙，说说这次我用了哪些技术栈，以及一些想法和现有做法。</description><pubDate>Fri, 01 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;距离上次关闭博客快一年了吧，动态博客的维护真让人头大，还有每年服务器费用。&lt;/p&gt;
&lt;p&gt;在关站后我每天没事还是会看看各位的博客，Astro 是在无意间发现的，抱着好奇的态度看了下文档，比起 React 的繁琐和 VUE 乱糟糟的写法，我对这个框架一见钟情，关键他的文档对新手很友好。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Astro 是最适合构建像博客、营销网站、电子商务网站这样的以内容驱动的网站的 Web 框架。Astro 以开创了一种新的前端架构而闻名，与其他框架相比它减少了 JavaScript 的开销和复杂性。如果你需要一个加载速度快、具有良好 SEO 的网站，那么 Astro 就是你的选择。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是我第一次用前端框架部署完整的项目（确切来说是第二个，因为我还部署了一个主页），说实话作为一个小白来说有点暗暗自喜，不仅会独立部署项目，还学会了 Git 同步和合并分支还有解决冲突，还是有点成就感的吧。&lt;/p&gt;
&lt;h3&gt;聊聊我用了哪些技术栈吧&lt;/h3&gt;
&lt;p&gt;首先是 Astro 和 Tailwind CSS，用 VS Code 同步到 Github， 然后用 Cloudflare Page 自动部署， emmm... 是不是很简单。就这些 。&lt;/p&gt;
&lt;p&gt;这个字体是我找 小赵同学 要的，好看就是太大了要 2.5MB，所以我用了异步加载，我是个重度强迫症，这个字体包实在太大了虽然用了赛博菩萨，但首页才 0.05MB。&lt;/p&gt;
&lt;p&gt;不过话又说回来，我用的 34寸 2K 屏，不用字体包的话太糊了，为了我自己看着舒服还是妥协吧，至于国内访客随缘吧(bushi。&lt;/p&gt;
&lt;p&gt;对了，还有个 Giscus，这是一个基于 Github 讨论的评论组件，如文章下方所示（可能需要扶墙），可以访问我博客的朋友应该都能科学上网吧，不能也没关系，你也可以给我发送邮件。&lt;/p&gt;
&lt;h3&gt;就说这么多😪&lt;/h3&gt;
&lt;p&gt;就在刚刚准备同步关机的时候又发现了一个 BUG，比如点击 rss.xml 跳转再退回不能触发视图事件，导致遮罩无法关闭。不过小问题了，睡觉睡觉 狗命要紧。&lt;/p&gt;
</content:encoded></item></channel></rss>