一、脚本文件
#!/bin/bash
# Telegram Bot 设置(写死在代码中)
TG_API_TOKEN="Bot API Token" # 替换为你创建的 Bot API Token
TG_USER_ID="Telegram 用户 ID" # 替换为你的 Telegram 用户 ID
# GitHub Token 设置(写死在代码中)
GH_TOKEN="GitHub API Token" # 替换为你的 GitHub API Token
# 将 GitHub Token 设置为环境变量,以便 gh CLI 使用
export GH_TOKEN
# 发送消息到 Telegram
send_telegram_message() {
local message="$1"
curl -s -X POST "https://api.telegram.org/bot$TG_API_TOKEN/sendMessage" \
-d chat_id="$TG_USER_ID" \
-d text="$message"
}
# 获取 GitHub 仓库、文件夹路径和排除模式的环境变量
REPO="$REPO" # GitHub 仓库,传递环境变量
LOCAL_DIR="$LOCAL_DIR" # 本地文件夹路径,传递环境变量
# 检查并创建本地目录
mkdir -p "$LOCAL_DIR" # 确保本地目录存在
# 获取最新版本号
LATEST_VERSION=$(gh release list --repo "$REPO" --limit 1 --json tagName --jq '.[0].tagName')
echo "Latest version: $LATEST_VERSION"
# 获取本地存储的版本
if [ -f "$LOCAL_DIR/version.txt" ]; then
LOCAL_VERSION=$(cat "$LOCAL_DIR/version.txt")
else
# 如果 version.txt 不存在,则初始化本地版本为一个初始值(如 v0.0.0)
LOCAL_VERSION="v0.0.0"
fi
# 检查本地文件夹中是否只有 version.txt
if [ "$(ls -A "$LOCAL_DIR" | wc -l)" -eq 1 ] && [ "$(ls -A "$LOCAL_DIR")" == "version.txt" ]; then
STATUS="$REPO本地文件夹只有 version.txt,直接开始下载更新文件..."\
# 删除本地文件夹中的所有文件(保留 version.txt)
rm -rf "$LOCAL_DIR"/*
# 下载所有文件
gh release download "$LATEST_VERSION" --repo "$REPO" --dir "$LOCAL_DIR"
# 删除不需要的文件类型
find "$LOCAL_DIR" -type f \( -name "*.yml" -o -name "*.sha256" -o -name "*.json" \) -delete
else
# 初始化状态
STATUS=""
UPDATED_FOLDERS=""
# 比较版本,如果不一致,则进行更新
if [ "$LATEST_VERSION" != "$LOCAL_VERSION" ]; then
STATUS="$REPO发现新版本: $LATEST_VERSION. 正在更新..."\
# 删除本地文件夹中的所有文件
rm -rf "$LOCAL_DIR"/*
# 下载所有文件
gh release download "$LATEST_VERSION" --repo "$REPO" --dir "$LOCAL_DIR"
# 删除不需要的文件类型
find "$LOCAL_DIR" -type f \( -name "*.yml" -o -name "*.sha256" \) -delete
else
STATUS="$REPO本地版本 ($LOCAL_VERSION) 已经是最新版本 ($LATEST_VERSION)。"
fi
fi
# 获取更新后的文件夹内容(列出所有文件夹)
UPDATED_FOLDERS=$(find "$LOCAL_DIR" -type d)
# 更新本地版本信息
echo "$LATEST_VERSION" > "$LOCAL_DIR/version.txt"
STATUS="$STATUS 更新完成: $LATEST_VERSION"
# 组合信息:推送更新的状态和文件夹列表
FINAL_MESSAGE="$STATUS"
if [ -n "$UPDATED_FOLDERS" ]; then
FINAL_MESSAGE="$FINAL_MESSAGE更新的文件夹:$UPDATED_FOLDERS"
fi
# 统一推送消息,推送更新状态和更新的文件夹
send_telegram_message "$FINAL_MESSAGE"
二、定时任务实例
# 设置 GitHub 仓库的名称,格式为 'username/repository',这里需要根据实际情况修改
export REPO="MetaCubeX/ClashMetaForAndroid"
# 设置本地存储文件的文件夹路径,用于下载并存储最新的 release 文件
export LOCAL_DIR="/www/wwwroot/网站域名/存放文件夹"
# 执行脚本,传递环境变量给脚本使用
/bin/bash 脚本文件.sh