GitHub 官方和社区一致建议:不要把关键/定时任务完全依赖内置 cron,改用外部触发器 + workflow_dispatch。
cron-job.org 是目前最简单、免费、可靠的外部触发 GitHub Actions workflow_dispatch 的方式之一(无需服务器、无需信用卡)。它确实需要注册一个免费账号(邮箱注册,很简单),服务完全免费,由捐赠维持,执行上限是每小时最多60次(够你一天两次用)。
下面是2026年当前最实操的完整步骤(基于官网和社区实际使用经验):
步骤 1: 先在 GitHub 准备好 PAT(Personal Access Token)
cron-job.org 要发 POST 请求触发你的 workflow,必须带上 GitHub 的认证 token。

去 GitHub → Settings(右上角头像) → Developer settings → Personal access tokens → Tokens (classic)
点击 Generate new token (classic)
勾选权限:repo(全选) + workflow(必须,用于 dispatch)
Expiration 选 "No expiration" 或长一点(比如1年)
生成后复制 token(只显示一次!),记下来叫它 ghp_你的token字符串
安全保存,别泄露

步骤 2: 确认你的 workflow 支持 workflow_dispatch
你的 YAML 必须有这个(你之前已经有了):
YAMLon:
schedule:

- cron: '0 1 * * *'
- cron: '0 10 * * *'

workflow_dispatch: # ← 必须保留这个

可选:如果你想区分外部触发和手动触发,可以加 event_type(但不必须):YAMLon:
workflow_dispatch:

# inputs: ... (如果有输入参数的话)

步骤 3: 注册并创建 cron job(在 cron-job.org)

打开 https://cron-job.org/ → 点击 Start now 或 Sign up(右上角)
用邮箱注册(随便填密码,验证邮箱后登录)
登录后 → 点击 Create cronjob(或类似“New job”按钮)

填写字段(关键部分):

Title:随便填,比如 "Auto Checkin 09:00 & 18:00"
URL:填这个(替换成你自己的仓库):https://api.github.com/repos/你的GitHub用户名/你的仓库名/actions/workflows/你的.yaml/dispatches
示例:https://api.github.com/repos/kooker/webhost/actions/workflows/login.yaml/dispatches
Request method:选 POST
Timeout:默认30秒够用(你的签到脚本应该很快)
Custom headers(很重要!加两个):
Header 1: Accept → 值:application/vnd.github.v3+json
Header 2: Authorization → 值:Bearer ghp_你的PAT token
(注意:Bearer 后面加空格,然后贴你的 token)

Body data(选 JSON 类型):

{
"ref": "main", // 或你的默认分支名,比如 master
"inputs": {} // 如果没 inputs,可以空对象
}

Schedule(调度时间):
选 Advanced 或自定义 cron
输入两个时间(UTC 时间,北京+8,所以 09:00 北京 = UTC 01:00;18:00 北京 = UTC 10:00)
第一行:0 1 * (每天 UTC 01:00)
第二行:0 10 * (每天 UTC 10:00)

或用他们的界面点选时间(记得选 UTC!)

其他选项:
Execution notification:可选开 Telegram/Email 通知(如果失败会提醒你)
保存后,先点 Test now 测试一次,看 GitHub Actions 标签页有没有触发运行

步骤 4: 测试 & 观察

测试成功后,Actions 页面会出现由 "workflow_dispatch" 触发的运行记录
等到下一个时间点(或手动等),确认是否准时跑
如果失败:看 cron-job.org 的执行日志(会显示 HTTP 响应码),常见问题是 token 错、URL 错、header 格式不对

注意事项 & 常见坑

Token 权限:必须有 workflow scope,否则返回 403
仓库名/用户名:大小写敏感,别写错
频率:你一天两次,完全在免费限额内(甚至可以加到每小时一次都没问题)
如果想更安全:cron-job.org 支持 IP 白名单(在账号设置里加你的 IP),但一般个人用不必要
备选:如果 cron-job.org 哪天不稳定了,再考虑 Google Cloud Scheduler(有免费额度)或 Cloudflare Workers Cron(也免费)

照这个步骤走,基本5-10分钟就能搞定,远比 GitHub 自带 schedule 靠谱。

cf-worker部署

项目地址:https://github.com/hunshcn/gh-proxy

简单修改,减少重复请求。

worker.zip

演示:raw.us.kg

这个也可,同时不限定网站,一些网站有问题
项目地址:https://github.com/EtherDream/jsproxy

index.zip

一个更全网站代理功能:https://github.com/netptop/siteproxy 不过我不用

2026更新

普通空间可用PHP版
kooker.jp.2026.zip
xrea空间演示:jp.raw.us.kg
webhostmost空间演示:www.kooker.jp

http://www.otokaze.cn/post/535.html
v2ex.png
PHP代码稍有修改几处
v2ex_sign.php

<?php
$loginUrl = 'https://www.v2ex.com/signin'; //登录入口 
$v2ex = new v2ex('username','password'); //你的账号密码,请符合v2ex的用户名规范 
if(!is_dir("cookie")){mkdir("cookie",0755);} //检查cookie目录是否存在 
if(!is_file($v2ex->CookiePath)){ //对已有登录状态cookie的账号,程序会自动跳过登陆 
file_put_contents($v2ex->CookiePath,''); 
$v2ex->getOnceAndSession($loginUrl); //获取初始状态的once值以及SESSIONID 
$v2ex->login(); 
} 
$v2ex->getOnce('https://www.v2ex.com',$v2ex->CookiePath); //获得最新Once值,用于签到 
$v2ex->sign('https://www.v2ex.com/mission/daily/redeem',$v2ex->CookiePath); //执行签到步骤 
$v2ex->update(); //更新过期cookie

function __autoload($className){  //自动引入类库
    include $className.'.class.php';
}

- 阅读剩余部分 -

shell判断文件,目录是否存在或者具有权限
#!/bin/sh

myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"

# 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -x "$myPath"]; then
mkdir "$myPath"
fi

# 这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPath"]; then
mkdir "$myPath"
fi

# 这里的-f参数判断$myFile是否存在
if [ ! -f "$myFile" ]; then
touch "$myFile"
fi

# 其他参数还有-n,-n是判断一个变量是否是否有值

- 阅读剩余部分 -

http://www.ingkee.com/s/?ctime=1459668248&uid=11366499&liveid=1459668248060711&share_uid=11366499
https://github.com/racaljk/hosts
https://raw.githubusercontent.com/racaljk/hosts/master/hosts

https://www.nginx.com/blog/thread-pools-boost-performance-9x/
http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html
http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html

server {

add_header Strict-Transport-Security max-age=31536000 always;

}
server {

ssl_session_cache        shared:SSL:10m;
ssl_session_timeout      60m;

ssl_session_tickets      on;
resolver                 8.8.4.4 8.8.8.8  valid=300s;
resolver_timeout         10s;
... ...

}