From dafa8b266e103ad83230fc62dfe6c8a12a8d758e Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Tue, 2 Dec 2025 10:42:05 +0800 Subject: [PATCH] Update README.md --- .github/README.md | 165 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/.github/README.md b/.github/README.md index 68f33a1ea..f60a17845 100644 --- a/.github/README.md +++ b/.github/README.md @@ -326,6 +326,171 @@ curl -sSL https://install.lifebus.top/pre_app_uninstall.sh | bash curl -sSL https://install.lifebus.top/local_app_uninstall.sh | bash ``` +## 1Panel v2 (自动同步) +由于官方不支持自动同步本地应用,每次都需要用户手动去点击同步按钮。我们多次提交过意见,奈何没有得到官方重视。因此出了这个折中方案。 +### 前置条件 +1. API 密钥 +请前往 `面板设置` >> `API 接口` 中生成 `接口密钥` 有效期填写 `0` 长期有效,白名单可以填写 `127.0.0.1` +### 创建计划任务 +请将 `API_KEY` `PANEL_PORT` 填写为正确的值即可 + +```bash +#!/bin/bash + +############################################# +# 用户需填写的变量 +############################################# + +API_KEY="面板API密钥" +PANEL_HOST="127.0.0.1" +PANEL_PORT="面板访问端口" + +# 两个接口地址(不用动) +API_SYNC_LOCAL="/api/v2/apps/sync/local" +API_READ_FILE="/api/v2/files/read" + +############################################# +# 工具函数 +############################################# + +# 生成 UUID(Linux 通用方法) +gen_uuid() { + cat /proc/sys/kernel/random/uuid +} + +# 生成 token +gen_token() { + local ts=$(date +%s) + local tk=$(echo -n "1panel${API_KEY}${ts}" | md5sum | awk '{print $1}') + echo "${tk},${ts}" +} + +# 判断系统是否有 jq +HAS_JQ=0 +if command -v jq >/dev/null 2>&1; then + HAS_JQ=1 +fi + +############################################# +# 主逻辑开始 +############################################# + +TASK_ID=$(gen_uuid) +echo "📌 生成 Task ID: ${TASK_ID}" +echo "" + +TOKEN_INFO=$(gen_token) +TOKEN=$(echo "$TOKEN_INFO" | cut -d',' -f1) +TIMESTAMP=$(echo "$TOKEN_INFO" | cut -d',' -f2) + +echo "📌 时间戳: $TIMESTAMP" +echo "📌 Token: $TOKEN" +echo "" + +################################################# +# STEP 1 — 触发同步任务 +################################################# +echo "🚀 STEP 1: 调用接口 1 开始同步任务..." +echo "POST http://${PANEL_HOST}:${PANEL_PORT}${API_SYNC_LOCAL}" + +RESP1=$(curl -s -X POST "http://${PANEL_HOST}:${PANEL_PORT}${API_SYNC_LOCAL}" \ + -H "1Panel-Token: ${TOKEN}" \ + -H "1Panel-Timestamp: ${TIMESTAMP}" \ + -H "Content-Type: application/json" \ + -d "{\"taskID\":\"${TASK_ID}\"}") + +echo "返回内容:$RESP1" +echo "" + +CODE1=$(echo "$RESP1" | grep -o '"code":[0-9]*' | cut -d: -f2) +if [ "$CODE1" != "200" ]; then + echo "❌ 启动任务失败,停止执行!" + exit 1 +fi + +echo "✅ 任务启动成功!" +echo "" + +################################################# +# STEP 2 — 轮询任务日志接口(含 jq / 无 jq 双模式) +################################################# +echo "🚀 STEP 2: 查询任务执行状态..." +echo "POST http://${PANEL_HOST}:${PANEL_PORT}${API_READ_FILE}" +echo "" + +LAST_LINE_COUNT=0 + +while true; do + TOKEN_INFO=$(gen_token) + TOKEN=$(echo "$TOKEN_INFO" | cut -d',' -f1) + TIMESTAMP=$(echo "$TOKEN_INFO" | cut -d',' -f2) + + RESP2=$(curl -s -X POST "http://${PANEL_HOST}:${PANEL_PORT}${API_READ_FILE}" \ + -H "1Panel-Token: ${TOKEN}" \ + -H "1Panel-Timestamp: ${TIMESTAMP}" \ + -H "Content-Type: application/json" \ + -d "{\"id\":0,\"type\":\"task\",\"name\":\"\",\"page\":1,\"pageSize\":500,\"latest\":true,\"taskID\":\"${TASK_ID}\",\"taskType\":\"\",\"taskOperate\":\"\",\"resourceID\":0}") + + ############################################# + # 有 jq:强力 JSON 解析模式 + ############################################# + if [ $HAS_JQ -eq 1 ]; then + + mapfile -t LINES < <(echo "$RESP2" | jq -r '.data.lines[]') + + TOTAL_LINES=${#LINES[@]} + if [ $TOTAL_LINES -gt $LAST_LINE_COUNT ]; then + for ((i=LAST_LINE_COUNT; i/dev/null; then + STATUS=$(echo "$RESP2" | jq -r '.data.taskStatus') + echo "" + echo "🎉🎉🎉 任务已结束!检测到 [TASK-END]" + echo "执行状态:$STATUS" + echo "" + exit 0 + fi + + ############################################# + # 无 jq:兼容模式(grep + sed + awk) + ############################################# + else + LINES_BLOCK=$(echo "$RESP2" | sed -n '/"lines": \[/,/\]/p' | sed '1d;$d') + + mapfile -t LINES < <( + echo "$LINES_BLOCK" | + sed 's/^[[:space:]]*"//;s/"[[:space:]]*,\?$//' + ) + + TOTAL_LINES=${#LINES[@]} + + if [ $TOTAL_LINES -gt $LAST_LINE_COUNT ]; then + for ((i=LAST_LINE_COUNT; i 温馨提示: