<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
    <title>Owen的博客 - Cron</title>
    <subtitle>主要关注技术，读书，摘抄，杂谈，文章评论，工具分享，工作流，灵感，英文学习，注意力管理，深度工作等方向。</subtitle>
    <link rel="self" type="application/atom+xml" href="https://old.owenyoung.com/tags/cron/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://old.owenyoung.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2023-03-10T11:04:55+08:00</updated>
    <id>https://old.owenyoung.com/tags/cron/atom.xml</id>
    <entry xml:lang="zh">
        <title>在 Cloudflare Workers 部署一个带有 Dashboard 的 Cron 服务</title>
        <published>2023-03-10T11:04:55+08:00</published>
        <updated>2023-03-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Owen Young
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://old.owenyoung.com/blog/cronbin/"/>
        <id>https://old.owenyoung.com/blog/cronbin/</id>
        
        <summary type="html">&lt;p&gt;昨天在 Cloudflare 搭建了 &lt;a href=&quot;https:&#x2F;&#x2F;old.owenyoung.com&#x2F;blog&#x2F;jsonbin&#x2F;&quot;&gt;JSONBin&lt;&#x2F;a&gt; 服务，作为持久化存储的方案，今天又总结出了我的工作流似乎还需要一个重要的 Trigger，那就是 Cron 任务，如果把这个问题解决，那么百分之 90 的用例就都被覆盖了。&lt;&#x2F;p&gt;
&lt;p&gt;目前已解决的工作流问题：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Webhook Trigger: &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;deno.com&#x2F;deploy&quot;&gt;Deno Deploy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;持久化存储： &lt;a href=&quot;https:&#x2F;&#x2F;old.owenyoung.com&#x2F;blog&#x2F;jsonbin&#x2F;&quot;&gt;JSONBin&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</summary>
        
        <content type="html" xml:base="https://old.owenyoung.com/blog/cronbin/">&lt;p&gt;昨天在 Cloudflare 搭建了 &lt;a href=&quot;https:&#x2F;&#x2F;old.owenyoung.com&#x2F;blog&#x2F;jsonbin&#x2F;&quot;&gt;JSONBin&lt;&#x2F;a&gt; 服务，作为持久化存储的方案，今天又总结出了我的工作流似乎还需要一个重要的 Trigger，那就是 Cron 任务，如果把这个问题解决，那么百分之 90 的用例就都被覆盖了。&lt;&#x2F;p&gt;
&lt;p&gt;目前已解决的工作流问题：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Webhook Trigger: &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;deno.com&#x2F;deploy&quot;&gt;Deno Deploy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;持久化存储： &lt;a href=&quot;https:&#x2F;&#x2F;old.owenyoung.com&#x2F;blog&#x2F;jsonbin&#x2F;&quot;&gt;JSONBin&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;待解决的问题：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Cron 任务&lt;&#x2F;li&gt;
&lt;li&gt;需要 Oauth2.0 授权的第三方接口调用，比如推特等&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;今天用部署在 Cloudflare Workers 之上的几百行代码的单一 Javascript 文件，满足了我的 Cron 任务需求。最终效果如下：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;old.owenyoung.com&#x2F;blog&#x2F;cronbin&#x2F;.&#x2F;cronbin3.png&quot; alt=&quot;screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;该工具的功能很简单，就是定时对配置里的 URL 或者 curl 命令发出请求，并且记录每个 URL 最近 10 条的日志，方便定位问题。&lt;&#x2F;p&gt;
&lt;p&gt;最终源码都在这&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;blog&#x2F;blob&#x2F;main&#x2F;scripts&#x2F;cronbin&#x2F;main.js&quot;&gt;一个文件&lt;&#x2F;a&gt;里，可以很方便的部署在 Cloudflare Worker 之上。&lt;&#x2F;p&gt;
&lt;p&gt;HTML 文件也只有一个，增删改查都在一个页面进行。数据存储在一个 JSON 文件里，存储结构如下：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;tasks&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;1&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;url&amp;quot;: &amp;quot;https:&#x2F;&#x2F;test.com&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;interval&amp;quot;: 5,
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;note&amp;quot;:&amp;quot;Note&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;logs&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;        {
&lt;&#x2F;span&gt;&lt;span&gt;          &amp;quot;ok&amp;quot;: true,
&lt;&#x2F;span&gt;&lt;span&gt;          &amp;quot;message&amp;quot;: &amp;quot;success&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;          &amp;quot;run_at&amp;quot;: &amp;quot;2019-01-01 00:00:00&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;      ]
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;用户（我）首先在这个简单的 UI 里增删改查 Task，然后利用 Cloudflare Workers 的 &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;workers&#x2F;runtime-apis&#x2F;scheduled-event&#x2F;&quot;&gt;Schedule 事件&lt;&#x2F;a&gt;，每分钟运行一次&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;blog&#x2F;blob&#x2F;53afd7aaf518523544a1fc37cddbe00c6f2f3b4a&#x2F;scripts&#x2F;cronbin&#x2F;main.js#L348&quot;&gt;&lt;code&gt;CheckAndRunTasks&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;函数,该函数通过检查每个 Task 里&lt;code&gt;logs&lt;&#x2F;code&gt;字段里最近的&lt;code&gt;run_at&lt;&#x2F;code&gt;和任务本身的&lt;code&gt;interval&lt;&#x2F;code&gt;,来确定要不要运行该任务，随后计算出一个该次需要运行的 url&#x2F;curl 命令列表，如果是 curl 命令，则解析为 fetch options, 然后&lt;code&gt;Promise.allSettled&lt;&#x2F;code&gt;并行发出请求，最后，记录各 URL 执行的情况。如果有失败，则还会调用 dashborad 里配置的通知 curl 命令，及时的发送错误消息。&lt;&#x2F;p&gt;
&lt;p&gt;有了这个之后，我就可以执行一些定时的任务了，比如我刚把定时发送&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;HackerNewsZh&quot;&gt;Hacker News 中文精选&lt;&#x2F;a&gt;的推特 Bot 的&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;blog&#x2F;blob&#x2F;main&#x2F;scripts&#x2F;hackernewszh&#x2F;mod.js#L14&quot;&gt;服务&lt;&#x2F;a&gt;放在了 Deno Deploy 里，然后在这个 Cronbin 里添加一个每&lt;code&gt;60&lt;&#x2F;code&gt;分钟的定时请求： &lt;code&gt;https:&#x2F;&#x2F;task.owenyoung.com&#x2F;runHackernewszhTask?key=abc&lt;&#x2F;code&gt;，这样就搞定了这个 bot 的定时发布程序。&lt;&#x2F;p&gt;
&lt;p&gt;目前还有一个痛点，就是发布推文这个 API，要是只有一个账户还好，但是我同时有很多个 Bot，所以最好是有一个 UI 界面可以绑定多账户，然后提供一个简单的发布 API 出来。我目前是用 IFTTT 做这件事，If Webhook -&amp;gt; Then Post a Tweet. 目前 IFTTT 免费层级只能绑定一个账户。所以我新开了一个坑&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;simpleapi&quot;&gt;SimpleAPI&lt;&#x2F;a&gt;,准备用无服务器的方式提供任何接口的 SimpleAPI 版本，不知道能不能填上这个坑。&lt;&#x2F;p&gt;
&lt;p&gt;如果你想部署该服务，可以参考我写的这个&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;blog&#x2F;tree&#x2F;main&#x2F;scripts&#x2F;cronbin&quot;&gt;文档&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
    </entry>
</feed>
