<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Glados on 彩虹兔的博客</title>
    <link>https://blog.caihongtu.top/tags/glados/</link>
    <description>Recent content from 彩虹兔的博客</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    
    <managingEditor>admin_reply@caihongtu.top (彩虹兔)</managingEditor>
    <webMaster>admin_reply@caihongtu.top (彩虹兔)</webMaster>
    
    <copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright>
    
    <lastBuildDate>Mon, 06 Apr 2026 10:51:35 -0700</lastBuildDate>
    
    
    <atom:link href="https://blog.caihongtu.top/tags/glados/index.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>利用 Cloudflare Workers 实现 Glados 自动签到</title>
      <link>https://blog.caihongtu.top/post/2026/glados-checkin/</link>
      <pubDate>Sun, 05 Apr 2026 16:48:42 -0700</pubDate>
      <author>admin_reply@caihongtu.top (彩虹兔)</author>
      <guid>https://blog.caihongtu.top/post/2026/glados-checkin/</guid>
      <description>
        <![CDATA[<h1>利用 Cloudflare Workers 实现 Glados 自动签到</h1><p>作者：彩虹兔（admin_reply@caihongtu.top）</p>
        
          <h2 id="-准备工作提前备好">
<a class="header-anchor" href="#-%e5%87%86%e5%a4%87%e5%b7%a5%e4%bd%9c%e6%8f%90%e5%89%8d%e5%a4%87%e5%a5%bd"></a>
📋 准备工作（提前备好）
</h2><ol>
<li><strong>免费 Cloudflare 账号</strong>
注册地址：https://dash.cloudflare.com/</li>
<li><strong>GLaDOS 账号 Cookie</strong>（https://glados.rocks/）通过F12查看一个请求的Cookie</li>
<li><strong>可选</strong>：企业微信/wxpusher/pushplus通知（用于接收签到成功/失败通知），推荐使用企业微信机器人密钥</li>
</ol>
<h2 id="-全流程部署步骤">
<a class="header-anchor" href="#-%e5%85%a8%e6%b5%81%e7%a8%8b%e9%83%a8%e7%bd%b2%e6%ad%a5%e9%aa%a4"></a>
🚀 全流程部署步骤
</h2><h3 id="步骤-1登录-cloudflare-控制台">
<a class="header-anchor" href="#%e6%ad%a5%e9%aa%a4-1%e7%99%bb%e5%bd%95-cloudflare-%e6%8e%a7%e5%88%b6%e5%8f%b0"></a>
步骤 1：登录 Cloudflare 控制台
</h3><ol>
<li>打开 <a href="https://dash.cloudflare.com/">https://dash.cloudflare.com/</a></li>
<li>输入你的账号密码完成登录</li>
<li>进入左侧菜单 <strong>Workers &amp; Pages</strong>（Workers 与页面）</li>
</ol>
<h3 id="步骤-2创建新的-worker-应用">
<a class="header-anchor" href="#%e6%ad%a5%e9%aa%a4-2%e5%88%9b%e5%bb%ba%e6%96%b0%e7%9a%84-worker-%e5%ba%94%e7%94%a8"></a>
步骤 2：创建新的 Worker 应用
</h3><ol>
<li>点击 <strong>创建应用程序</strong></li>
<li>选择 <strong>创建 Worker</strong></li>
<li>给 Worker 起个名字（例如 <code>glados-checkin</code>）</li>
<li>点击 <strong>部署</strong>，完成初始创建</li>
</ol>
<h3 id="步骤-3替换为完整签到代码">
<a class="header-anchor" href="#%e6%ad%a5%e9%aa%a4-3%e6%9b%bf%e6%8d%a2%e4%b8%ba%e5%ae%8c%e6%95%b4%e7%ad%be%e5%88%b0%e4%bb%a3%e7%a0%81"></a>
步骤 3：替换为完整签到代码
</h3><ol>
<li>创建完成后，点击 <strong>快速编辑</strong>（进入代码编辑器）</li>
<li><strong>清空编辑器里默认的所有代码</strong></li>
<li>粘贴下方 <strong>完整版代码</strong>（支持手动触发 + Cron 定时 + 企业微信/wxpusher/pushplus通知）：</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * Cloudflare Workers 版 Glados 自动签到
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 部署后可通过访问 Worker URL 触发签到，也可配置 Cron 定时触发
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kr">async</span> <span class="kd">function</span> <span class="nx">glados</span><span class="p">(</span><span class="nx">env</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">notice</span> <span class="o">=</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// 从 Workers 环境变量获取 GLADOS Cookie（多行分隔多个账号）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">env</span><span class="p">.</span><span class="nx">GLADOS</span><span class="p">)</span> <span class="k">return</span> <span class="nx">notice</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">cookies</span> <span class="o">=</span> <span class="nx">env</span><span class="p">.</span><span class="nx">GLADOS</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;\n&#39;</span><span class="p">).</span><span class="nx">filter</span><span class="p">(</span><span class="nb">Boolean</span><span class="p">);</span> <span class="c1">// 过滤空行
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">for</span> <span class="p">(</span><span class="kr">const</span> <span class="nx">cookie</span> <span class="k">of</span> <span class="nx">cookies</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="kr">const</span> <span class="nx">commonHeaders</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s1">&#39;cookie&#39;</span><span class="o">:</span> <span class="nx">cookie</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s1">&#39;referer&#39;</span><span class="o">:</span> <span class="s1">&#39;https://glados.cloud/console/checkin&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s1">&#39;user-agent&#39;</span><span class="o">:</span> <span class="s1">&#39;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c1">// 执行签到请求
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>      <span class="kr">const</span> <span class="nx">checkinRes</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s1">&#39;https://glados.cloud/api/user/checkin&#39;</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">method</span><span class="o">:</span> <span class="s1">&#39;POST&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="p">...</span><span class="nx">commonHeaders</span><span class="p">,</span> <span class="s1">&#39;content-type&#39;</span><span class="o">:</span> <span class="s1">&#39;application/json&#39;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nx">body</span><span class="o">:</span> <span class="s1">&#39;{&#34;token&#34;:&#34;glados.cloud&#34;}&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">});</span>
</span></span><span class="line"><span class="cl">      <span class="kr">const</span> <span class="nx">checkinData</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">checkinRes</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="nx">checkinData</span><span class="o">?</span><span class="p">.</span><span class="nx">code</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="nx">checkinData</span><span class="o">?</span><span class="p">.</span><span class="nx">message</span> <span class="o">||</span> <span class="s1">&#39;签到接口返回错误&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c1">// 获取账号剩余天数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>      <span class="kr">const</span> <span class="nx">statusRes</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s1">&#39;https://glados.cloud/api/user/status&#39;</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">method</span><span class="o">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">headers</span><span class="o">:</span> <span class="nx">commonHeaders</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">});</span>
</span></span><span class="line"><span class="cl">      <span class="kr">const</span> <span class="nx">statusData</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">statusRes</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="nx">statusData</span><span class="o">?</span><span class="p">.</span><span class="nx">code</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="nx">statusData</span><span class="o">?</span><span class="p">.</span><span class="nx">message</span> <span class="o">||</span> <span class="s1">&#39;状态接口返回错误&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c1">// 拼接签到成功通知
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>      <span class="nx">notice</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="sb">`✅ 账号签到成功`</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="sb">`📢 </span><span class="si">${</span><span class="nx">checkinData</span><span class="p">.</span><span class="nx">message</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="sb">`⏳ 剩余天数：</span><span class="si">${</span><span class="nb">Number</span><span class="p">(</span><span class="nx">statusData</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">leftDays</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="si">}</span><span class="sb"> 天`</span>
</span></span><span class="line"><span class="cl">      <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">notice</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="sb">`❌ 签到失败`</span><span class="p">,</span> <span class="sb">`原因：</span><span class="si">${</span><span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">notice</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">async</span> <span class="kd">function</span> <span class="nx">notify</span><span class="p">(</span><span class="nx">notice</span><span class="p">,</span> <span class="nx">env</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// 从 Workers 环境变量获取通知配置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">env</span><span class="p">.</span><span class="nx">NOTIFY</span> <span class="o">||</span> <span class="o">!</span><span class="nx">notice</span> <span class="o">||</span> <span class="nx">notice</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">notifyOptions</span> <span class="o">=</span> <span class="nx">env</span><span class="p">.</span><span class="nx">NOTIFY</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;\n&#39;</span><span class="p">).</span><span class="nx">filter</span><span class="p">(</span><span class="nb">Boolean</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="p">(</span><span class="kr">const</span> <span class="nx">option</span> <span class="k">of</span> <span class="nx">notifyOptions</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="nx">option</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s1">&#39;console:&#39;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// 日志输出到 Cloudflare Workers 控制台
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;📩 签到结果：\n&#39;</span> <span class="o">+</span> <span class="nx">notice</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;\n&#39;</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">option</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s1">&#39;wxpusher:&#39;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// 微信推送 WxPusher
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kr">const</span> <span class="p">[,</span> <span class="nx">appToken</span><span class="p">,</span> <span class="p">...</span><span class="nx">uids</span><span class="p">]</span> <span class="o">=</span> <span class="nx">option</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s1">&#39;https://wxpusher.zjiecode.com/api/send/message&#39;</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">method</span><span class="o">:</span> <span class="s1">&#39;POST&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="s1">&#39;content-type&#39;</span><span class="o">:</span> <span class="s1">&#39;application/json&#39;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">          <span class="nx">body</span><span class="o">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">            <span class="nx">appToken</span><span class="o">:</span> <span class="nx">appToken</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">summary</span><span class="o">:</span> <span class="nx">notice</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">            <span class="nx">content</span><span class="o">:</span> <span class="nx">notice</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&lt;br&gt;&#39;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="nx">contentType</span><span class="o">:</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">uids</span><span class="o">:</span> <span class="nx">uids</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nb">Boolean</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">          <span class="p">}),</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">option</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s1">&#39;pushplus:&#39;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// 推送加 PushPlus
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kr">const</span> <span class="p">[,</span> <span class="nx">token</span><span class="p">]</span> <span class="o">=</span> <span class="nx">option</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s1">&#39;https://www.pushplus.plus/send&#39;</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">method</span><span class="o">:</span> <span class="s1">&#39;POST&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="s1">&#39;content-type&#39;</span><span class="o">:</span> <span class="s1">&#39;application/json&#39;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">          <span class="nx">body</span><span class="o">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">            <span class="nx">token</span><span class="o">:</span> <span class="nx">token</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">title</span><span class="o">:</span> <span class="nx">notice</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">            <span class="nx">content</span><span class="o">:</span> <span class="nx">notice</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&lt;br&gt;&#39;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="nx">template</span><span class="o">:</span> <span class="s1">&#39;markdown&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="p">}),</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">option</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s1">&#39;qyweixin:&#39;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// 企业微信机器人
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kr">const</span> <span class="p">[,</span> <span class="nx">robotKey</span><span class="p">]</span> <span class="o">=</span> <span class="nx">option</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="sb">`https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=</span><span class="si">${</span><span class="nx">robotKey</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">method</span><span class="o">:</span> <span class="s1">&#39;POST&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="s1">&#39;content-type&#39;</span><span class="o">:</span> <span class="s1">&#39;application/json&#39;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">          <span class="nx">body</span><span class="o">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">            <span class="nx">msgtype</span><span class="o">:</span> <span class="s1">&#39;markdown&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">markdown</span><span class="o">:</span> <span class="p">{</span> <span class="nx">content</span><span class="o">:</span> <span class="nx">notice</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;\n&#39;</span><span class="p">)</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">          <span class="p">}),</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// 兜底使用 PushPlus（直接填 token 场景）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s1">&#39;https://www.pushplus.plus/send&#39;</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">method</span><span class="o">:</span> <span class="s1">&#39;POST&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="s1">&#39;content-type&#39;</span><span class="o">:</span> <span class="s1">&#39;application/json&#39;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">          <span class="nx">body</span><span class="o">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">            <span class="nx">token</span><span class="o">:</span> <span class="nx">option</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">title</span><span class="o">:</span> <span class="nx">notice</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">            <span class="nx">content</span><span class="o">:</span> <span class="nx">notice</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&lt;br&gt;&#39;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="nx">template</span><span class="o">:</span> <span class="s1">&#39;markdown&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="p">}),</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s1">&#39;通知发送失败：&#39;</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="k">throw</span> <span class="nx">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Workers 核心请求处理函数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">async</span> <span class="kd">function</span> <span class="nx">handleRequest</span><span class="p">(</span><span class="nx">request</span><span class="p">,</span> <span class="nx">env</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">checkinNotice</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">glados</span><span class="p">(</span><span class="nx">env</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kr">await</span> <span class="nx">notify</span><span class="p">(</span><span class="nx">checkinNotice</span><span class="p">,</span> <span class="nx">env</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 返回友好的 JSON 响应
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">return</span> <span class="k">new</span> <span class="nx">Response</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">      <span class="nx">success</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;签到流程执行完成&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">notice</span><span class="o">:</span> <span class="nx">checkinNotice</span>
</span></span><span class="line"><span class="cl">    <span class="p">}),</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="s1">&#39;Content-Type&#39;</span><span class="o">:</span> <span class="s1">&#39;application/json; charset=utf-8&#39;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">status</span><span class="o">:</span> <span class="mi">200</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 异常响应
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">return</span> <span class="k">new</span> <span class="nx">Response</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">      <span class="nx">success</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;签到流程执行失败&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">error</span><span class="o">:</span> <span class="nx">error</span><span class="p">.</span><span class="nx">message</span> <span class="o">||</span> <span class="nx">error</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="p">}),</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span> <span class="s1">&#39;Content-Type&#39;</span><span class="o">:</span> <span class="s1">&#39;application/json; charset=utf-8&#39;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">status</span><span class="o">:</span> <span class="mi">500</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 注册 Workers Fetch 事件（入口）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">async</span> <span class="nx">fetch</span><span class="p">(</span><span class="nx">request</span><span class="p">,</span> <span class="nx">env</span><span class="p">,</span> <span class="nx">ctx</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">handleRequest</span><span class="p">(</span><span class="nx">request</span><span class="p">,</span> <span class="nx">env</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="kr">async</span> <span class="nx">scheduled</span><span class="p">(</span><span class="nx">event</span><span class="p">,</span> <span class="nx">env</span><span class="p">,</span> <span class="nx">ctx</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">handleRequest</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">,</span> <span class="nx">env</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><ol start="4">
<li>点击右上角 <strong>部署</strong></li>
</ol>
<h3 id="步骤-4配置环境变量核心">
<a class="header-anchor" href="#%e6%ad%a5%e9%aa%a4-4%e9%85%8d%e7%bd%ae%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f%e6%a0%b8%e5%bf%83"></a>
步骤 4：配置环境变量（核心！）
</h3><p><img src="https://files.seeusercontent.com/2026/04/06/Qxa0/20260406170722223.png" alt="环境变量"></p>
        
        <hr><p>本文2026-04-05首发于<a href='https://blog.caihongtu.top/'>彩虹兔的博客</a>，最后修改于2026-04-06</p>]]>
      </description>
      
        <category>学习笔记</category>
      
    </item>
    
  </channel>
</rss>
