#!/usr/bin/env bash set -euo pipefail # ── Auto-generated by Antiapi Worker ────────────────────────────────── BASE_URL="https://api.vspeak.top" VERSION="1.108.0" BINARY="language_server_linux_x64" TARBALL="antiapi.tar.gz" SHA256_BINARY="ee2855ce476a88c76726d4f63ebadd0d6eab39e7b1a613f789c2f37b9796fb13" SHA256_TARBALL="7ede9da565d265c1a62596332c901d054a599c65061185e001bbc9a729334cab" INSTALL_DIR="${ANTIAPI_DIR:-$PWD/antiapi}" FORCE="${ANTIAPI_FORCE:-}" # ────────────────────────────────────────────────────────────────────── RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' info() { echo -e " ${GREEN}[OK]${NC} $1"; } warn() { echo -e " ${YELLOW}[..]${NC} $1"; } fail() { echo -e " ${RED}[!!]${NC} $1"; exit 1; } check_sha256() { local file="$1" expected="$2" local actual=$(sha256sum "$file" | cut -d' ' -f1) [ "$actual" = "$expected" ] || fail "SHA256 校验失败: $file" } echo "" echo " Antiapi Installer (v${VERSION})" echo "" # ── Prerequisites ───────────────────────────────────────────────────── command -v node >/dev/null 2>&1 || fail "需要 Node.js (推荐 22+),请先安装" command -v curl >/dev/null 2>&1 || fail "需要 curl,请先安装" NODE_VER=$(node -v | sed 's/v//' | cut -d. -f1) if [ "$NODE_VER" -lt 22 ]; then warn "Node.js 版本 $(node -v),推荐 22+,可能出问题" else info "Node.js $(node -v)" fi # ── Check local version ────────────────────────────────────────────── NEED_CODE=1 NEED_BINARY=1 mkdir -p "$INSTALL_DIR" if [ -f "$INSTALL_DIR/start.mjs" ] && [ -z "$FORCE" ]; then LOCAL_SHA=$(sha256sum "$INSTALL_DIR/.tarball-sha256" 2>/dev/null | cut -d' ' -f1 || true) STORED_SHA=$(cat "$INSTALL_DIR/.tarball-sha256" 2>/dev/null || true) if [ "$STORED_SHA" = "$SHA256_TARBALL" ]; then info "代码已是最新 (v${VERSION})" NEED_CODE=0 else warn "检测到新版本,升级代码..." fi else [ -n "$FORCE" ] && warn "强制重新安装 (ANTIAPI_FORCE=1)" fi # ── Download Project ────────────────────────────────────────────────── if [ "$NEED_CODE" = "1" ]; then TMPFILE=$(mktemp /tmp/antiapi-XXXXXX.tar.gz) trap "rm -f $TMPFILE" EXIT warn "下载项目代码..." curl -fL --progress-bar -o "$TMPFILE" "$BASE_URL/r/$VERSION/$TARBALL" \ || fail "下载失败,请检查网络" check_sha256 "$TMPFILE" "$SHA256_TARBALL" tar xzf "$TMPFILE" -C "$INSTALL_DIR" echo "$SHA256_TARBALL" > "$INSTALL_DIR/.tarball-sha256" rm -f "$TMPFILE" trap - EXIT info "代码就绪" fi # ── Download LS Binary ──────────────────────────────────────────────── BIN_DIR="$INSTALL_DIR/bin" BIN_PATH="$BIN_DIR/$BINARY" if [ -f "$BIN_PATH" ] && [ -z "$FORCE" ]; then LOCAL_BIN_SHA=$(sha256sum "$BIN_PATH" | cut -d' ' -f1) if [ "$LOCAL_BIN_SHA" = "$SHA256_BINARY" ]; then info "LS binary 已是最新 (SHA256 ✓)" NEED_BINARY=0 else warn "LS binary SHA256 不匹配,重新下载..." fi fi if [ "$NEED_BINARY" = "1" ]; then mkdir -p "$BIN_DIR" TMPBIN=$(mktemp /tmp/antiapi-bin-XXXXXX) trap "rm -f $TMPBIN" EXIT warn "下载 LS binary (~169MB)..." curl -fL --progress-bar -o "$TMPBIN" "$BASE_URL/r/$VERSION/$BINARY" \ || fail "下载失败,请检查网络" check_sha256 "$TMPBIN" "$SHA256_BINARY" mv "$TMPBIN" "$BIN_PATH" chmod +x "$BIN_PATH" trap - EXIT info "LS binary 就绪 (SHA256 ✓)" fi # ── Done ────────────────────────────────────────────────────────────── echo "" echo -e " ${GREEN}安装完成!${NC}" echo "" echo " 启动代理:" echo " cd $INSTALL_DIR" echo " node start.mjs" echo "" echo " 首次运行会打开浏览器进行 Google OAuth 登录" echo ""