modified: jdckup.sh
This commit is contained in:
@@ -1,8 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# jdckup.sh - 京东Cookie自动更新工具安装脚本
|
# jdckup.sh - 京东Cookie自动更新工具安装脚本
|
||||||
# 描述: 自动化安装和配置 AutoUpdateJdCookie 项目
|
|
||||||
|
|
||||||
set -euo pipefail # 严格模式:遇到错误立即退出,未定义变量报错,管道命令失败即退出
|
set -euo pipefail
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# 配置变量
|
# 配置变量
|
||||||
@@ -10,11 +9,9 @@ set -euo pipefail # 严格模式:遇到错误立即退出,未定义变量
|
|||||||
readonly SCRIPT_NAME="JdCkup Installer"
|
readonly SCRIPT_NAME="JdCkup Installer"
|
||||||
readonly REPO_URL="https://github.com/icepage/AutoUpdateJdCookie.git"
|
readonly REPO_URL="https://github.com/icepage/AutoUpdateJdCookie.git"
|
||||||
readonly PROJECT_DIR="AutoUpdateJdCookie"
|
readonly PROJECT_DIR="AutoUpdateJdCookie"
|
||||||
PYTHON_CMD="" # 动态检测的 Python 命令
|
PYTHON_CMD=""
|
||||||
LOG_FILE="jdckup_install_$(date +%Y%m%d_%H%M%S).log"
|
LOG_FILE="jdckup_install_$(date +%Y%m%d_%H%M%S).log"
|
||||||
readonly LOG_FILE
|
readonly LOG_FILE
|
||||||
|
|
||||||
# 颜色定义
|
|
||||||
readonly COLOR_RED='\033[0;31m'
|
readonly COLOR_RED='\033[0;31m'
|
||||||
readonly COLOR_GREEN='\033[0;32m'
|
readonly COLOR_GREEN='\033[0;32m'
|
||||||
readonly COLOR_YELLOW='\033[1;33m'
|
readonly COLOR_YELLOW='\033[1;33m'
|
||||||
@@ -25,7 +22,6 @@ readonly COLOR_RESET='\033[0m'
|
|||||||
# 工具函数
|
# 工具函数
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
# 日志函数
|
|
||||||
log_info() {
|
log_info() {
|
||||||
echo -e "${COLOR_BLUE}[INFO]${COLOR_RESET} $(date '+%Y-%m-%d %H:%M:%S') - $*" | tee -a "$LOG_FILE"
|
echo -e "${COLOR_BLUE}[INFO]${COLOR_RESET} $(date '+%Y-%m-%d %H:%M:%S') - $*" | tee -a "$LOG_FILE"
|
||||||
}
|
}
|
||||||
@@ -42,17 +38,14 @@ log_error() {
|
|||||||
echo -e "${COLOR_RED}[ERROR]${COLOR_RESET} $(date '+%Y-%m-%d %H:%M:%S') - $*" | tee -a "$LOG_FILE" >&2
|
echo -e "${COLOR_RED}[ERROR]${COLOR_RESET} $(date '+%Y-%m-%d %H:%M:%S') - $*" | tee -a "$LOG_FILE" >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
# 带进度条的后台执行
|
|
||||||
run_with_progress() {
|
run_with_progress() {
|
||||||
local description=$1
|
local description=$1
|
||||||
local command=$2
|
local command=$2
|
||||||
local log_file=$3
|
local log_file=$3
|
||||||
|
|
||||||
# 在后台执行命令
|
|
||||||
eval "$command" >> "$log_file" 2>&1 &
|
eval "$command" >> "$log_file" 2>&1 &
|
||||||
local pid=$!
|
local pid=$!
|
||||||
|
|
||||||
# 显示进度动画
|
|
||||||
local spin='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
|
local spin='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
|
||||||
local i=0
|
local i=0
|
||||||
|
|
||||||
@@ -63,11 +56,9 @@ run_with_progress() {
|
|||||||
sleep 0.1
|
sleep 0.1
|
||||||
done
|
done
|
||||||
|
|
||||||
# 等待进程完成
|
|
||||||
wait $pid
|
wait $pid
|
||||||
local exit_code=$?
|
local exit_code=$?
|
||||||
|
|
||||||
# 清除行并显示最终状态
|
|
||||||
if [ $exit_code -eq 0 ]; then
|
if [ $exit_code -eq 0 ]; then
|
||||||
printf "\r%s: %b✓%b 已完成 \n" "$description" "${COLOR_GREEN}" "${COLOR_RESET}"
|
printf "\r%s: %b✓%b 已完成 \n" "$description" "${COLOR_GREEN}" "${COLOR_RESET}"
|
||||||
else
|
else
|
||||||
@@ -77,12 +68,10 @@ run_with_progress() {
|
|||||||
return $exit_code
|
return $exit_code
|
||||||
}
|
}
|
||||||
|
|
||||||
# 检查命令是否存在
|
|
||||||
command_exists() {
|
command_exists() {
|
||||||
command -v "$1" >/dev/null 2>&1
|
command -v "$1" >/dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
# 检查上一个命令的执行结果
|
|
||||||
check_result() {
|
check_result() {
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
log_error "$1"
|
log_error "$1"
|
||||||
@@ -94,11 +83,9 @@ check_result() {
|
|||||||
# 安装函数
|
# 安装函数
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
# 检测可用的 Python 版本
|
|
||||||
detect_python_version() {
|
detect_python_version() {
|
||||||
log_info "检测系统 Python 版本..."
|
log_info "检测系统 Python 版本..."
|
||||||
|
|
||||||
# 按优先级检测 Python 版本
|
|
||||||
local python_candidates=("python3.13" "python3.12" "python3.11" "python3.10" "python3.9" "python3")
|
local python_candidates=("python3.13" "python3.12" "python3.11" "python3.10" "python3.9" "python3")
|
||||||
|
|
||||||
for py_cmd in "${python_candidates[@]}"; do
|
for py_cmd in "${python_candidates[@]}"; do
|
||||||
@@ -106,7 +93,6 @@ detect_python_version() {
|
|||||||
local py_version
|
local py_version
|
||||||
py_version=$($py_cmd --version 2>&1 | grep -oP '\d+\.\d+')
|
py_version=$($py_cmd --version 2>&1 | grep -oP '\d+\.\d+')
|
||||||
|
|
||||||
# Python 3.8+ 支持
|
|
||||||
if [[ $(echo "$py_version >= 3.8" | bc -l 2>/dev/null || echo "1") -eq 1 ]]; then
|
if [[ $(echo "$py_version >= 3.8" | bc -l 2>/dev/null || echo "1") -eq 1 ]]; then
|
||||||
PYTHON_CMD="$py_cmd"
|
PYTHON_CMD="$py_cmd"
|
||||||
log_success "检测到 Python: $py_cmd (版本 $py_version)"
|
log_success "检测到 Python: $py_cmd (版本 $py_version)"
|
||||||
@@ -119,17 +105,14 @@ detect_python_version() {
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# 检查系统依赖
|
|
||||||
check_system_dependencies() {
|
check_system_dependencies() {
|
||||||
log_info "检查系统依赖..."
|
log_info "检查系统依赖..."
|
||||||
|
|
||||||
# 检查必要的命令
|
|
||||||
if ! command_exists apt; then
|
if ! command_exists apt; then
|
||||||
log_error "此脚本仅支持基于 apt 的系统(Debian/Ubuntu)"
|
log_error "此脚本仅支持基于 apt 的系统(Debian/Ubuntu)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检查是否有 root 权限
|
|
||||||
if [ "$EUID" -ne 0 ]; then
|
if [ "$EUID" -ne 0 ]; then
|
||||||
log_warning "建议使用 root 权限运行此脚本"
|
log_warning "建议使用 root 权限运行此脚本"
|
||||||
read -p "是否继续?(y/n) " -n 1 -r
|
read -p "是否继续?(y/n) " -n 1 -r
|
||||||
@@ -142,24 +125,17 @@ check_system_dependencies() {
|
|||||||
log_success "系统依赖检查完成"
|
log_success "系统依赖检查完成"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 安装系统包
|
|
||||||
install_system_packages() {
|
install_system_packages() {
|
||||||
log_info "开始安装系统包..."
|
log_info "开始安装系统包..."
|
||||||
|
|
||||||
# 更新包列表
|
|
||||||
echo ""
|
echo ""
|
||||||
run_with_progress "📦 更新 APT 包列表" "apt update" "$LOG_FILE" || {
|
run_with_progress "📦 更新 APT 包列表" "apt update" "$LOG_FILE" || {
|
||||||
log_error "更新包列表失败"
|
log_error "更新包列表失败"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# 基础包列表(不包含 venv,按需安装)
|
local base_packages=("git" "python3-pip")
|
||||||
local base_packages=(
|
|
||||||
"git"
|
|
||||||
"python3-pip"
|
|
||||||
)
|
|
||||||
|
|
||||||
# 安装基础包
|
|
||||||
echo ""
|
echo ""
|
||||||
run_with_progress "📦 安装系统包 (${base_packages[*]})" "apt install -y ${base_packages[*]}" "$LOG_FILE"
|
run_with_progress "📦 安装系统包 (${base_packages[*]})" "apt install -y ${base_packages[*]}" "$LOG_FILE"
|
||||||
check_result "基础系统包安装失败"
|
check_result "基础系统包安装失败"
|
||||||
@@ -168,104 +144,104 @@ install_system_packages() {
|
|||||||
log_success "系统包安装完成"
|
log_success "系统包安装完成"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 克隆代码仓库
|
|
||||||
clone_repository() {
|
clone_repository() {
|
||||||
log_info "克隆代码仓库..."
|
log_info "开始克隆代码仓库..."
|
||||||
|
|
||||||
if [ -d "$PROJECT_DIR" ]; then
|
if [ -d "$PROJECT_DIR" ]; then
|
||||||
log_warning "目录 $PROJECT_DIR 已存在"
|
log_warning "项目目录 $PROJECT_DIR 已存在"
|
||||||
read -p "是否删除并重新克隆?(y/n) " -n 1 -r
|
read -r -p "是否删除并重新克隆?[y/N] " response
|
||||||
echo
|
case "$response" in
|
||||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
[yY][eE][sS]|[yY])
|
||||||
|
log_info "正在删除旧目录..."
|
||||||
rm -rf "$PROJECT_DIR"
|
rm -rf "$PROJECT_DIR"
|
||||||
log_info "已删除旧目录"
|
;;
|
||||||
else
|
*)
|
||||||
log_info "跳过克隆步骤"
|
log_warning "跳过克隆步骤,使用现有项目目录"
|
||||||
return 0
|
return 0
|
||||||
fi
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
run_with_progress "📥 克隆 GitHub 仓库" "git clone --depth=1 $REPO_URL" "$LOG_FILE"
|
run_with_progress "📥 克隆仓库" "git clone \"$REPO_URL\" \"$PROJECT_DIR\"" "$LOG_FILE"
|
||||||
check_result "克隆仓库失败"
|
check_result "克隆代码仓库"
|
||||||
|
|
||||||
echo ""
|
|
||||||
log_success "代码仓库克隆完成"
|
log_success "代码仓库克隆完成"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 安装 Python 依赖
|
|
||||||
install_python_dependencies() {
|
install_python_dependencies() {
|
||||||
log_info "安装 Python 依赖包..."
|
log_info "开始安装 Python 依赖..."
|
||||||
|
|
||||||
# 进入项目目录
|
|
||||||
cd "$PROJECT_DIR" || {
|
cd "$PROJECT_DIR" || {
|
||||||
log_error "无法进入目录 $PROJECT_DIR"
|
log_error "无法进入项目目录: $PROJECT_DIR"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# 系统级安装模式:使用 --break-system-packages
|
log_info "使用系统级安装模式"
|
||||||
local pip_args="--break-system-packages"
|
|
||||||
|
|
||||||
# 升级 pip
|
|
||||||
echo ""
|
echo ""
|
||||||
run_with_progress "📚 升级 pip" "pip install --upgrade pip $pip_args" "../$LOG_FILE"
|
run_with_progress "🔧 升级 pip" "$PYTHON_CMD -m pip install --upgrade pip --break-system-packages" "$LOG_FILE"
|
||||||
|
check_result "升级 pip"
|
||||||
|
|
||||||
# 安装项目依赖
|
if [ -f "requirements.txt" ]; then
|
||||||
if [ ! -f "requirements.txt" ]; then
|
echo ""
|
||||||
log_error "requirements.txt 文件不存在"
|
run_with_progress "📦 安装 Python 依赖" "$PYTHON_CMD -m pip install -r requirements.txt --break-system-packages" "$LOG_FILE"
|
||||||
exit 1
|
check_result "安装 Python 依赖"
|
||||||
|
else
|
||||||
|
log_warning "未找到 requirements.txt,跳过依赖安装"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
run_with_progress "📚 安装项目依赖" "pip install -r requirements.txt $pip_args" "../$LOG_FILE"
|
run_with_progress "🔧 安装 OpenCV" "$PYTHON_CMD -m pip install opencv-python --break-system-packages" "$LOG_FILE"
|
||||||
check_result "安装 Python 依赖失败"
|
check_result "安装 opencv-python"
|
||||||
|
|
||||||
# 安装 opencv-python
|
|
||||||
echo ""
|
|
||||||
run_with_progress "📚 安装 opencv-python" "pip install opencv-python $pip_args" "../$LOG_FILE"
|
|
||||||
check_result "安装 opencv-python 失败"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
log_success "Python 依赖安装完成"
|
log_success "Python 依赖安装完成"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 安装 Playwright 和浏览器
|
|
||||||
install_playwright() {
|
install_playwright() {
|
||||||
log_info "安装 Playwright 浏览器..."
|
log_info "开始安装 Playwright 和浏览器..."
|
||||||
|
|
||||||
# 安装浏览器依赖
|
|
||||||
echo ""
|
echo ""
|
||||||
run_with_progress "🌐 安装 Playwright 系统依赖" "playwright install-deps" "../$LOG_FILE"
|
run_with_progress "🌐 安装 Playwright 系统依赖" "playwright install-deps" "../$LOG_FILE"
|
||||||
check_result "安装 Playwright 系统依赖失败"
|
check_result "安装 Playwright 系统依赖"
|
||||||
|
|
||||||
# 安装 Chromium 浏览器
|
|
||||||
echo ""
|
echo ""
|
||||||
run_with_progress "🌐 安装 Chromium 浏览器" "playwright install chromium" "../$LOG_FILE"
|
run_with_progress "🌐 安装 Chromium 浏览器" "playwright install chromium" "../$LOG_FILE"
|
||||||
check_result "安装 Chromium 浏览器失败"
|
check_result "安装 Chromium 浏览器"
|
||||||
|
|
||||||
echo ""
|
|
||||||
log_success "Playwright 安装完成"
|
log_success "Playwright 安装完成"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 生成配置文件
|
|
||||||
generate_config() {
|
generate_config() {
|
||||||
log_info "生成配置文件..."
|
log_info "开始生成配置文件..."
|
||||||
|
|
||||||
if [ ! -f "make_config.py" ]; then
|
if [ ! -f "make_config.py" ]; then
|
||||||
log_error "make_config.py 文件不存在"
|
log_error "make_config.py 文件不存在"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -f "config.py" ]; then
|
||||||
|
log_warning "配置文件 config.py 已存在"
|
||||||
|
read -r -p "是否重新生成配置?[y/N] " response
|
||||||
|
case "$response" in
|
||||||
|
[yY][eE][sS]|[yY])
|
||||||
|
log_info "将重新生成配置文件"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_warning "跳过配置生成步骤"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "============================================"
|
echo "============================================"
|
||||||
echo "⚙️ 开始配置向导(需要交互式输入)"
|
echo "⚙️ 开始配置向导(需要交互式输入)"
|
||||||
echo "============================================"
|
echo "============================================"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# 交互式运行配置脚本(前台执行)
|
|
||||||
python make_config.py 2>&1 | tee -a "../$LOG_FILE"
|
python make_config.py 2>&1 | tee -a "../$LOG_FILE"
|
||||||
|
|
||||||
if [ ${PIPESTATUS[0]} -eq 0 ]; then
|
if [ "${PIPESTATUS[0]}" -eq 0 ]; then
|
||||||
echo ""
|
echo ""
|
||||||
log_success "配置文件生成完成"
|
log_success "配置文件生成完成"
|
||||||
else
|
else
|
||||||
@@ -275,7 +251,6 @@ generate_config() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# 显示安装后信息
|
|
||||||
show_post_install_info() {
|
show_post_install_info() {
|
||||||
echo ""
|
echo ""
|
||||||
echo "============================================"
|
echo "============================================"
|
||||||
@@ -288,10 +263,9 @@ show_post_install_info() {
|
|||||||
echo ""
|
echo ""
|
||||||
echo "使用说明:"
|
echo "使用说明:"
|
||||||
echo "1. 进入项目目录: cd $PROJECT_DIR"
|
echo "1. 进入项目目录: cd $PROJECT_DIR"
|
||||||
echo "2. 直接运行程序: python main.py"
|
echo "2. 单次运行: python main.py"
|
||||||
|
echo "3. 常驻进程: python schedule_main.py"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Crontab 定时任务示例:"
|
|
||||||
echo "0 3,4 * * * cd $(pwd) && $PYTHON_CMD main.py --mode cron"
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "============================================"
|
echo "============================================"
|
||||||
}
|
}
|
||||||
@@ -303,7 +277,6 @@ main() {
|
|||||||
log_info "开始执行 $SCRIPT_NAME..."
|
log_info "开始执行 $SCRIPT_NAME..."
|
||||||
log_info "日志文件: $LOG_FILE"
|
log_info "日志文件: $LOG_FILE"
|
||||||
|
|
||||||
# 执行安装步骤
|
|
||||||
check_system_dependencies
|
check_system_dependencies
|
||||||
detect_python_version
|
detect_python_version
|
||||||
install_system_packages
|
install_system_packages
|
||||||
@@ -316,5 +289,4 @@ main() {
|
|||||||
log_success "所有安装步骤完成!"
|
log_success "所有安装步骤完成!"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 执行主函数
|
|
||||||
main "$@"
|
main "$@"
|
||||||
|
|||||||
Reference in New Issue
Block a user