一、脚本文件
#!/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
REPO="$REPO"
LOCAL_DIR="$LOCAL_DIR"
TAG="$TAG"
# ========= 工具函数 =========
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"
}
mkdir -p "$LOCAL_DIR"
# 获取本地版本
if [ -f "$LOCAL_DIR/version.txt" ]; then
LOCAL_VERSION=$(cat "$LOCAL_DIR/version.txt")
else
LOCAL_VERSION="v0.0.0"
fi
STATUS=""
UPDATED_FOLDERS=""
# ========= 获取最新版本 =========
if [ -n "$TAG" ]; then
LATEST_VERSION="$TAG"
STATUS+="使用指定的版本: $TAG%0A"
else
LATEST_VERSION=$(gh release list --repo "$REPO" --json tagName,isPrerelease,isDraft,publishedAt \
--jq '[.[] | select(.isPrerelease == false and .isDraft == false)] | sort_by(.publishedAt) | reverse | .[0].tagName')
if [ -z "$LATEST_VERSION" ]; then
# 若没有 Release,尝试获取 tags
LATEST_VERSION=$(gh api -H "Accept: application/vnd.github+json" /repos/$REPO/tags \
| jq -r '.[0].name')
STATUS+="未发现正式 Release,使用最新 tag: $LATEST_VERSION%0A"
else
STATUS+="使用最新 Release: $LATEST_VERSION%0A"
fi
fi
# ========= 判断版本是否需更新 =========
if [ "$LATEST_VERSION" != "$LOCAL_VERSION" ]; then
STATUS+="发现新版本: $LATEST_VERSION(当前: $LOCAL_VERSION)%0A开始下载...\n"
rm -rf "$LOCAL_DIR"/*
# 下载新版本
gh release download "$LATEST_VERSION" --repo "$REPO" --dir "$LOCAL_DIR" 2>/dev/null || {
# fallback:尝试直接下载 tag zip 包
curl -L -o "$LOCAL_DIR/$LATEST_VERSION.zip" "https://github.com/$REPO/archive/refs/tags/$LATEST_VERSION.zip"
unzip -q "$LOCAL_DIR/$LATEST_VERSION.zip" -d "$LOCAL_DIR"
rm "$LOCAL_DIR/$LATEST_VERSION.zip"
}
# 清理无用文件
find "$LOCAL_DIR" -type f \( -name "*.yml" -o -name "*.sha256" -o -name "*.json" \) -delete
# 更新版本号
echo "$LATEST_VERSION" > "$LOCAL_DIR/version.txt"
STATUS+="更新完成: $LATEST_VERSION%0A"
else
STATUS+="当前版本 $LOCAL_VERSION 已是最新,无需更新。%0A"
fi
# ========= 获取文件夹结构 =========
UPDATED_FOLDERS=$(find "$LOCAL_DIR" -type d | sed 's/^/📁 /')
# ========= 消息组合 =========
FINAL_MESSAGE="$REPO 更新状态:%0A$STATUS"
if [ -n "$UPDATED_FOLDERS" ]; then
FINAL_MESSAGE+="文件夹列表:%0A$UPDATED_FOLDERS"
fi
# ========= 推送 =========
send_telegram_message "$FINAL_MESSAGE"
二、定时任务实例
# 设置 GitHub 仓库的名称,格式为 'username/repository',这里需要根据实际情况修改
export REPO="MetaCubeX/ClashMetaForAndroid"
# 设置本地存储文件的文件夹路径,用于下载并存储最新的 release 文件
export LOCAL_DIR="/www/wwwroot/网站域名/存放文件夹"
# 执行脚本,传递环境变量给脚本使用
/bin/bash 脚本文件.sh