---
layout: post
title: 使用CF Workers Cron触发器进行签到
tags: [Javascript, Cloudflare, cron, workers]
---

  Github Actions(×)，Cloudflare Workers(√)<!--more-->    

# 起因
  前几天，我的[云·原神签到脚本](https://github.com/Mabbs/MHYY-AutoCheckin)被Github Ban掉了，其实我非常能理解这种情况，实际上用Actions做签到确实太重了。毕竟启动一个Actions需要的资源还算比较多，相当于开一个Docker容器，然而实际上做的事情却是很简单的请求一个接口罢了。而专业的全自动签到者有更专业的选择，比如[QianDao](https://github.com/qiandao-today/qiandao)，可以挂很多签到脚本，而且操作非常简单，只是需要服务器……而我为了能保证优质的签到水平，用这种东西显然还是不够稳当，服务器还会到期呢，所以像这种简单的事情我觉得还是应该用Cloudflare Workers来做更好。   

# 使用Cloudflare Workers Cron触发器
  其实有一说一，我的Javascript并不怎么样，不过至少文档我还是能看懂的，Workers进行网络请求不需要用XHR这样奇怪的东西，我感觉它应该是基于Node.js的，看了一眼是用fetch函数去进行网络请求的 ~~（……又不是没用过，以前不还拿[Workers写反代](/2021/03/02/workers.html)嘛……）~~ 另外又看了看Cron触发器的文档，然后根据之前那个Python版，因为懒得分析哪些请求有用没用了，反正就三个都弄上吧……最终总算是知道怎么写了。于是代码如下：
```javascript
addEventListener('scheduled', event => {
  event.waitUntil(
    handleSchedule(event.scheduledTime)
  )
})

async function handleSchedule(scheduledDate) {
  const init = {
    headers: {
      'x-rpc-combo_token': '填入Token',
      'x-rpc-client_type': '2',
      'x-rpc-app_version': '3.4.0',
      'x-rpc-sys_version': '11',
      'x-rpc-channel': 'mihoyo',
      'x-rpc-device_id': '填入设备ID',
      'x-rpc-device_name': '填入手机名称',
      'x-rpc-device_model': '填入手机型号',
      'x-rpc-app_id': '1953439974',
      'Referer': 'https://app.mihoyo.com',
      'Host': 'api-cloudgame.mihoyo.com',
      'Connection': 'Keep-Alive',
      'Accept-Encoding': 'gzip',
      'User-Agent': 'okhttp/4.9.0'
    },
  };
  console.log(scheduledDate);
  console.log(await fetch("https://api-cloudgame.mihoyo.com/hk4e_cg_cn/wallet/wallet/get", init));
  console.log(await fetch("https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/getAnnouncementInfo", init));
  console.log(await fetch("https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/listNotifications?status=NotificationStatusUnread&type=NotificationTypePopup&is_sort=true", init));
}
```
  至于怎么获取Token之类的参数，用HttpCanary之类的抓包就好了，不过要先启动云·原神之后再抓包，不然程序貌似会检验SSL证书是不是合法的，然后就退出登录了……抓到之后随便点开一个请求里面就有上面的值了，根据情况填到上面就行了。   
  还有Workers的配置就很简单了，把代码粘到Workers里面之后在触发器里面的“Cron 触发器”中设定时间就行了，一般就一天一次，反正它能自动生成Cron表达式，也不用自己写，要不写“0 0 * * *”也行，然后就什么都不用做了。   

# 感想
  写完这个签到脚本之后，我觉得应该鼓励大家都去使用Workers这种方法去进行签到，Cloudflare可不会因为这种东西去Ban你的东西，至于Actions应该更多用于更需要计算资源的事情，比如编译代码啊，或者生成静态HTML还是日报之类的，签到啥的确实是太浪费了（而且还会Ban）。   
  还有就是云函数啥的……不过那个貌似本质来说还是Docker，它运行时是一个完整的环境，不像Workers那样应该是运行在一个更加轻量的沙箱里的，也许还更环保呢XD。