blog / 2023 /02 /22 /cron.html
User Mayx
update
2026b8b
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- Begin Jekyll SEO tag v2.8.0 -->
<title>使用CF Workers Cron触发器进行签到 | Mayx的博客</title>
<meta name="generator" content="Jekyll v3.9.5" />
<meta property="og:title" content="使用CF Workers Cron触发器进行签到" />
<meta name="author" content="mayx" />
<meta property="og:locale" content="zh_CN" />
<meta name="description" content="Github Actions(×),Cloudflare Workers(√)" />
<meta property="og:description" content="Github Actions(×),Cloudflare Workers(√)" />
<meta property="og:site_name" content="Mayx的博客" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2023-02-22T00:00:00+08:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="使用CF Workers Cron触发器进行签到" />
<meta name="google-site-verification" content="huTYdEesm8NaFymixMNqflyCp6Jfvd615j5Wq1i2PHc" />
<meta name="msvalidate.01" content="0ADFCE64B3557DC4DC5F2DC224C5FDDD" />
<meta name="yandex-verification" content="fc0e535abed800be" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"mayx"},"dateModified":"2023-02-22T00:00:00+08:00","datePublished":"2023-02-22T00:00:00+08:00","description":"Github Actions(×),Cloudflare Workers(√)","headline":"使用CF Workers Cron触发器进行签到","mainEntityOfPage":{"@type":"WebPage","@id":"/2023/02/22/cron.html"},"publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://avatars0.githubusercontent.com/u/17966333"},"name":"mayx"},"url":"/2023/02/22/cron.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="canonical" href="https://mabbs.github.io/2023/02/22/cron.html" />
<link type="application/atom+xml" rel="alternate" href="/atom.xml" title="Mayx的博客" />
<link rel="alternate" type="application/rss+xml" title="Mayx的博客(RSS)" href="/rss.xml" />
<link rel="alternate" type="application/json" title="Mayx的博客(JSON Feed)" href="/feed.json" />
<link rel="stylesheet" href="/assets/css/style.css?v=1764518410" />
<!--[if !IE]> -->
<link rel="stylesheet" href="/Live2dHistoire/live2d/css/live2d.css" />
<!-- <![endif]-->
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="Mayx的博客" />
<link rel="webmention" href="https://webmention.io/mabbs.github.io/webmention" />
<link rel="pingback" href="https://webmention.io/mabbs.github.io/xmlrpc" />
<link rel="preconnect" href="https://summary.mayx.eu.org" crossorigin="anonymous" />
<link rel="prefetch" href="https://www.blogsclub.org/badge/mabbs.github.io" as="image" />
<link rel="blogroll" type="text/xml" href="/blogroll.opml" />
<link rel="me" href="https://github.com/Mabbs" />
<script src="/assets/js/jquery.min.js"></script>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<script>
var lastUpdated = new Date("Mon, 01 Dec 2025 00:00:10 +0800");
var BlogAPI = "https://summary.mayx.eu.org";
</script>
<script src="/assets/js/main.js"></script>
<!--[if !IE]> -->
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async="async" src="https://www.googletagmanager.com/gtag/js?id=UA-137710294-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-137710294-1');
</script>
<script src="/assets/js/instant.page.js" type="module"></script>
<!-- <![endif]-->
</head>
<body>
<!--[if !IE]> --><noscript><marquee style="top: -15px; position: relative;"><small>发现当前浏览器没有启用JavaScript,这不影响你的浏览,但可能会有一些功能无法使用……</small></marquee></noscript><!-- <![endif]-->
<!--[if IE]><marquee style="top: -15px; position: relative;"><small>发现当前浏览器为Internet Explorer,这不影响你的浏览,但可能会有一些功能无法使用……</small></marquee><![endif]-->
<div class="wrapper">
<header class="h-card">
<h1><a class="u-url u-uid p-name" rel="me" href="/">Mayx的博客</a></h1>
<img src="https://avatars0.githubusercontent.com/u/17966333" fetchpriority="high" class="u-photo" alt="Logo" style="width: 90%; max-width: 300px; max-height: 300px;" />
<p class="p-note">Mayx's Home Page</p>
<form action="/search.html">
<input type="text" name="keyword" id="search-input-all" placeholder="Search blog posts.." />&#160;<input type="submit" value="搜索" />
</form>
<br />
<p class="view"><a class="u-url" href="/Mabbs/">About me</a></p>
<ul class="downloads">
<li style="width: 270px; border-right: none;"><a href="/MayxBlog.tgz">Download <strong>TGZ File</strong></a></li>
</ul>
</header>
<section class="h-entry">
<small><time class="date dt-published" datetime="2023-02-22T00:00:00+08:00">22 February 2023</time> - 字数统计:1960 - 阅读大约需要7分钟 - Hits: <span id="/2023/02/22/cron.html" class="visitors">Loading...</span></small>
<h1 class="p-name">使用CF Workers Cron触发器进行签到</h1>
<p class="view">by <a class="p-author h-card" href="//github.com/Mabbs">mayx</a></p>
<div id="outdate" style="display:none;">
<hr /><p>
这是一篇创建于 <span id="outime"></span> 天前的文章,其中的信息可能已经有所发展或是发生改变。
</p>
</div>
<script>
daysold = Math.floor((new Date().getTime() - new Date("Wed, 22 Feb 2023 00:00:00 +0800").getTime()) / (24 * 60 * 60 * 1000));
if (daysold > 90) {
document.getElementById("outdate").style.display = "block";
document.getElementById("outime").innerHTML = daysold;
}
</script>
<hr />
<b>AI摘要</b>
<p id="ai-output">这篇文章讲述了作者在云原神签到脚本被Github Actions禁用后,选择使用Cloudflare Workers Cron触发器的原因。作者认为Workers更适合做这种简单的网络请求,因为它资源消耗较少,且不会像Actions那样遇到资源限制。作者分享了如何在Workers中编写签到脚本,包括设置headers和获取必要的参数。此外,作者建议将Cloudflare Workers用于日常签到等轻量级任务,而更适合计算密集型工作的是Github Actions。作者还提到,与云函数相比,Workers可能具有更好的轻量化和环保优势。</p>
<hr />
<ul><li><a href="#起因">起因</a></li><li><a href="#使用cloudflare-workers-cron触发器">使用Cloudflare Workers Cron触发器</a></li><li><a href="#感想">感想</a></li></ul>
<hr />
<main class="post-content e-content" role="main"><p>Github Actions(×),Cloudflare Workers(√)<!--more--></p>
<h1 id="起因">
<a href="#起因"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 起因
</h1>
<p>前几天,我的<a href="https://github.com/Mabbs/MHYY-AutoCheckin">云·原神签到脚本</a>被Github Ban掉了,其实我非常能理解这种情况,实际上用Actions做签到确实太重了。毕竟启动一个Actions需要的资源还算比较多,相当于开一个Docker容器,然而实际上做的事情却是很简单的请求一个接口罢了。而专业的全自动签到者有更专业的选择,比如<a href="https://github.com/qiandao-today/qiandao">QianDao</a>,可以挂很多签到脚本,而且操作非常简单,只是需要服务器……而我为了能保证优质的签到水平,用这种东西显然还是不够稳当,服务器还会到期呢,所以像这种简单的事情我觉得还是应该用Cloudflare Workers来做更好。</p>
<h1 id="使用cloudflare-workers-cron触发器">
<a href="#使用cloudflare-workers-cron触发器"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 使用Cloudflare Workers Cron触发器
</h1>
<p>其实有一说一,我的Javascript并不怎么样,不过至少文档我还是能看懂的,Workers进行网络请求不需要用XHR这样奇怪的东西,我感觉它应该是基于Node.js的,看了一眼是用fetch函数去进行网络请求的 <del>(……又不是没用过,以前不还拿<a href="/2021/03/02/workers.html">Workers写反代</a>嘛……)</del> 另外又看了看Cron触发器的文档,然后根据之前那个Python版,因为懒得分析哪些请求有用没用了,反正就三个都弄上吧……最终总算是知道怎么写了。于是代码如下:</p>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">scheduled</span><span class="dl">'</span><span class="p">,</span> <span class="nx">event</span> <span class="o">=&gt;</span> <span class="p">{</span>
<span class="nx">event</span><span class="p">.</span><span class="nx">waitUntil</span><span class="p">(</span>
<span class="nx">handleSchedule</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">scheduledTime</span><span class="p">)</span>
<span class="p">)</span>
<span class="p">})</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nx">handleSchedule</span><span class="p">(</span><span class="nx">scheduledDate</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">init</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">headers</span><span class="p">:</span> <span class="p">{</span>
<span class="dl">'</span><span class="s1">x-rpc-combo_token</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">填入Token</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">x-rpc-client_type</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">2</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">x-rpc-app_version</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">3.4.0</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">x-rpc-sys_version</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">11</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">x-rpc-channel</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">mihoyo</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">x-rpc-device_id</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">填入设备ID</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">x-rpc-device_name</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">填入手机名称</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">x-rpc-device_model</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">填入手机型号</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">x-rpc-app_id</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">1953439974</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">Referer</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">https://app.mihoyo.com</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">Host</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">api-cloudgame.mihoyo.com</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">Connection</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Keep-Alive</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">Accept-Encoding</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">gzip</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">User-Agent</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">okhttp/4.9.0</span><span class="dl">'</span>
<span class="p">},</span>
<span class="p">};</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">scheduledDate</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://api-cloudgame.mihoyo.com/hk4e_cg_cn/wallet/wallet/get</span><span class="dl">"</span><span class="p">,</span> <span class="nx">init</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/getAnnouncementInfo</span><span class="dl">"</span><span class="p">,</span> <span class="nx">init</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/listNotifications?status=NotificationStatusUnread&amp;type=NotificationTypePopup&amp;is_sort=true</span><span class="dl">"</span><span class="p">,</span> <span class="nx">init</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>
<p>至于怎么获取Token之类的参数,用HttpCanary之类的抓包就好了,不过要先启动云·原神之后再抓包,不然程序貌似会检验SSL证书是不是合法的,然后就退出登录了……抓到之后随便点开一个请求里面就有上面的值了,根据情况填到上面就行了。 </p><p>
还有Workers的配置就很简单了,把代码粘到Workers里面之后在触发器里面的“Cron 触发器”中设定时间就行了,一般就一天一次,反正它能自动生成Cron表达式,也不用自己写,要不写“0 0 * * *”也行,然后就什么都不用做了。</p>
<h1 id="感想">
<a href="#感想"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 感想
</h1>
<p>写完这个签到脚本之后,我觉得应该鼓励大家都去使用Workers这种方法去进行签到,Cloudflare可不会因为这种东西去Ban你的东西,至于Actions应该更多用于更需要计算资源的事情,比如编译代码啊,或者生成静态HTML还是日报之类的,签到啥的确实是太浪费了(而且还会Ban)。 </p><p>
还有就是云函数啥的……不过那个貌似本质来说还是Docker,它运行时是一个完整的环境,不像Workers那样应该是运行在一个更加轻量的沙箱里的,也许还更环保呢XD。</p></main>
<small style="display: block">tags: <a rel="category tag" class="p-category" href="/search.html?keyword=Javascript"><em>Javascript</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=Cloudflare"><em>Cloudflare</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=cron"><em>cron</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=workers"><em>workers</em></a> <span style="float: right;"><a href="https://gitlab.com/mayx/mayx.gitlab.io/tree/master/_posts/2023-02-22-cron.md">查看原始文件</a></span></small>
<h4 style="border-bottom: 1px solid #e5e5e5;margin: 2em 0 5px;">推荐文章</h4>
<p id="suggest-container">Loading...</p>
<script>
var suggest = $("#suggest-container");
$.get(BlogAPI + "/suggest?id=/2023/02/22/cron.html&update=" + lastUpdated.valueOf(), function (data) {
if (data.length) {
getSearchJSON(function (search) {
suggest.empty();
var searchMap = {};
for (var i = 0; i < search.length; i++) {
searchMap[search[i].url] = search[i];
}
var tooltip = $('<div class="content-tooltip"></div>').appendTo('body').hide();
for (var j = 0; j < data.length; j++) {
var item = searchMap[data[j].id];
if (item) {
var link = $('<a href="' + item.url + '">' + item.title + '</a>');
var contentPreview = item.content.substring(0, 100);
if (item.content.length > 100) {
contentPreview += "……";
}
link.hover(
function(e) {
tooltip.text($(this).data('content'))
.css({
top: e.pageY + 10,
left: e.pageX + 10
})
.show();
},
function() {
tooltip.hide();
}
).mousemove(function(e) {
tooltip.css({
top: e.pageY + 10,
left: e.pageX + 10
});
}).data('content', contentPreview);
suggest.append(link);
suggest.append(' - ' + item.date + '<br />');
}
}
});
} else {
suggest.html("暂无推荐文章……");
}
});
</script>
<br />
<div class="pagination">
<span class="prev">
<a href="/2023/02/03/mbp.html">
上一篇:MacBook Pro 2022 13寸使用体验
</a>
</span>
<br />
<span class="next">
<a href="/2023/03/12/php-async.html">
下一篇:PHP异步执行的探索
</a>
</span>
</div>
<!--[if !IE]> -->
<link rel="stylesheet" href="/assets/css/gitalk.css">
<script src="/assets/js/gitalk.min.js"></script>
<div id="gitalk-container"></div>
<script>
var gitalk = new Gitalk({
clientID: '36557aec4c3cb04f7ac6',
clientSecret: 'ac32993299751cb5a9ba81cf2b171cca65879cdb',
repo: 'mabbs.github.io',
owner: 'Mabbs',
admin: ['Mabbs'],
id: '/2023/02/22/cron', // Ensure uniqueness and length less than 50
distractionFreeMode: false, // Facebook-like distraction free mode
proxy: "https://cors-anywhere.mayx.eu.org/?https://github.com/login/oauth/access_token"
})
gitalk.render('gitalk-container')
</script>
<!-- <![endif]-->
</section>
<!--[if !IE]> -->
<div id="landlord" style="left:5px;bottom:0px;">
<div class="message" style="opacity:0"></div>
<canvas id="live2d" width="500" height="560" class="live2d"></canvas>
<div class="live_talk_input_body">
<form id="live_talk_input_form">
<div class="live_talk_input_name_body" >
<input type="checkbox" id="load_this" />
<input type="hidden" id="post_id" value="/2023/02/22/cron.html" />
<label for="load_this">
<span style="font-size: 11px; color: #fff;">&#160;想问这篇文章</span>
</label>
</div>
<div class="live_talk_input_text_body">
<input name="talk" type="text" class="live_talk_talk white_input" id="AIuserText" autocomplete="off" placeholder="要和我聊什么呀?" />
<button type="submit" class="live_talk_send_btn" id="talk_send">发送</button>
</div>
</form>
</div>
<input name="live_talk" id="live_talk" value="1" type="hidden" />
<div class="live_ico_box" style="display:none;">
<div class="live_ico_item type_info" id="showInfoBtn"></div>
<div class="live_ico_item type_talk" id="showTalkBtn"></div>
<div class="live_ico_item type_music" id="musicButton"></div>
<div class="live_ico_item type_youdu" id="youduButton"></div>
<div class="live_ico_item type_quit" id="hideButton"></div>
<input name="live_statu_val" id="live_statu_val" value="0" type="hidden" />
<audio src="" style="display:none;" id="live2d_bgm" data-bgm="0" preload="none"></audio>
<input id="duType" value="douqilai" type="hidden" />
</div>
</div>
<div id="open_live2d">召唤伊斯特瓦尔</div>
<!-- <![endif]-->
<footer>
<p>
<small>Made with ❤ by Mayx<br />Last updated at 2025-12-01 00:00:10<br /> 总字数:613841 - 文章数:177 - <a href="/atom.xml" >Atom</a> - <a href="/README.html" >About</a></small>
</p>
</footer>
</div>
<script src="/assets/js/scale.fix.js"></script>
<!--[if !IE]> -->
<script src="/assets/js/main_new.js"></script>
<script src="/Live2dHistoire/live2d/js/live2d.js"></script>
<script src="/Live2dHistoire/live2d/js/message.js"></script>
<!-- <![endif]-->
</body>
</html>