mirror of
https://git.axenov.dev/mirrors/cursor-free-vip.git
synced 2025-12-28 14:40:39 +03:00
Compare commits
13 Commits
v1.0
...
ManualRese
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f3dff7c39 | ||
|
|
4415ab92b0 | ||
|
|
0f18aebcfb | ||
|
|
79097bec71 | ||
|
|
5673200533 | ||
|
|
a46be781a5 | ||
|
|
7289b55408 | ||
|
|
777d090bc8 | ||
|
|
cfca57583a | ||
|
|
62a35ed699 | ||
|
|
980c755343 | ||
|
|
0a946d4e4e | ||
|
|
196060cb1b |
39
README.md
39
README.md
@@ -19,9 +19,48 @@ This is a tool to automatically bypass Cursor's membership check, automatically
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="./images/pro_2025-01-11_00-51-07.png" alt="Cursor Pro Logo" width="400"/><br>
|
<img src="./images/pro_2025-01-11_00-51-07.png" alt="Cursor Pro Logo" width="400"/><br>
|
||||||
</p>
|
</p>
|
||||||
|
<p align="center">
|
||||||
|
<img src="./images/pro_2025-01-11_22-33-09.gif" alt="Cursor Pro Logo" width="600"/><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<p align="center">
|
||||||
|
|
||||||
|
### If this start with Pro Trial, you can use it, don't hurry to upgrade to Pro, unless you can't use Pro, because Pro sometimes will be slow mode
|
||||||
|
|
||||||
|
### 如果啟動後是 Pro Trial 會員,可以使用就使用,不用著急升級到Pro 會員,除非不能使用Pro會員,因為Pro 會員有時候會 慢速模式
|
||||||
|
|
||||||
|
##### If Using Pro Membership, if it is slow mode, please switch to gpt-4o-mini /cursor-slow /cursor-fast mode
|
||||||
|
|
||||||
|
##### 如果使用Pro會員,是慢速模式的話,請切換到gpt-4o-mini /cursor-slow /cursor-fast 模式
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
## 🔄 更新日志
|
## 🔄 更新日志
|
||||||
|
<details>
|
||||||
|
<summary>v1.0.2</summary>
|
||||||
|
|
||||||
|
1. Fix: Some known issues | 修復了一些已知問題
|
||||||
|
2. Add cloud control device code | 增加雲端控制設備碼
|
||||||
|
3. Cloud reset device code | 雲端重置設備碼
|
||||||
|
4. Remove official WatchDog monitoring | 移除官方WatchDog監控
|
||||||
|
5. Remove Proxy official prompt | 移除Proxy 官方提示
|
||||||
|
6. Fix: Too Many Computer | 修復Too Many Computer 問題
|
||||||
|
7. Fix Billing Issue | 修復計費問題
|
||||||
|
8. Fix: Cursor's configuration | 修復Cursor的配置問題
|
||||||
|
9. Fix cursor-slow mode | 修復cursor-slow模式
|
||||||
|
</details>
|
||||||
|
<details>
|
||||||
|
<summary>v1.0.1</summary>
|
||||||
|
|
||||||
|
1. Fix: Reset machine ID | 修復了重置機器ID的問題
|
||||||
|
2. Fix: Bypass membership check | 修復了 繞過會員檢查的問題
|
||||||
|
3. Fix: Auto upgrade to "pro" membership | 修復了 自動升級為pro會員的問題
|
||||||
|
4. Fix: Real-time send Token request | 修復了 實時發送Token請求的問題
|
||||||
|
5. Fix: Reset Cursor's configuration | 修復了 重置Cursor的配置的問題
|
||||||
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>v1.0</summary>
|
<summary>v1.0</summary>
|
||||||
1. Preview Image | 預覽圖<br>
|
1. Preview Image | 預覽圖<br>
|
||||||
|
|||||||
BIN
images/pro_2025-01-11_22-33-09.gif
Normal file
BIN
images/pro_2025-01-11_22-33-09.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 555 KiB |
@@ -1,192 +1,222 @@
|
|||||||
# Check for admin rights and handle elevation
|
# 檢查是否是通過權限提升啟動的
|
||||||
|
param(
|
||||||
|
[switch]$Elevated
|
||||||
|
)
|
||||||
|
|
||||||
|
# 設置顏色主題
|
||||||
|
$Theme = @{
|
||||||
|
Primary = 'Cyan'
|
||||||
|
Success = 'Green'
|
||||||
|
Warning = 'Yellow'
|
||||||
|
Error = 'Red'
|
||||||
|
Info = 'White'
|
||||||
|
}
|
||||||
|
|
||||||
|
# ASCII Logo
|
||||||
|
$Logo = @"
|
||||||
|
██████╗██╗ ██╗██████╗ ███████╗ ██████╗ ██████╗ ██████╗ ██████╗ ██████╗
|
||||||
|
██╔════╝██║ ██║██╔══██╗██╔════╝██╔═══██╗██╔══██╗ ██╔══██╗██╔══██╗██╔═══██╗
|
||||||
|
██║ ██║ ██║██████╔╝███████╗██║ ██║██████╔╝ ██████╔╝██████╔╝██║ ██║
|
||||||
|
██║ ██║ ██║██╔══██╗╚════██║██║ ██║██╔══██╗ ██╔═══╝ ██╔══██╗██║ ██║
|
||||||
|
╚██████╗╚██████╔╝██║ ██║███████║╚██████╔╝██║ ██║ ██║ ██║ ██║╚██████╔╝
|
||||||
|
╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝
|
||||||
|
"@
|
||||||
|
|
||||||
|
# 進度條函數
|
||||||
|
function Write-ProgressBar {
|
||||||
|
param (
|
||||||
|
[int]$Percent,
|
||||||
|
[string]$Activity
|
||||||
|
)
|
||||||
|
$width = $Host.UI.RawUI.WindowSize.Width - 20
|
||||||
|
$completed = [math]::Floor($width * ($Percent / 100))
|
||||||
|
$remaining = $width - $completed
|
||||||
|
$progressBar = "[" + ("█" * $completed) + ("-" * $remaining) + "]"
|
||||||
|
Write-Host "`r$Activity $progressBar $Percent%" -NoNewline
|
||||||
|
}
|
||||||
|
|
||||||
|
# 美化輸出函數
|
||||||
|
function Write-Styled {
|
||||||
|
param (
|
||||||
|
[string]$Message,
|
||||||
|
[string]$Color = $Theme.Info,
|
||||||
|
[string]$Prefix = "",
|
||||||
|
[switch]$NoNewline
|
||||||
|
)
|
||||||
|
$emoji = switch ($Color) {
|
||||||
|
$Theme.Success { "✅" }
|
||||||
|
$Theme.Error { "❌" }
|
||||||
|
$Theme.Warning { "⚠️" }
|
||||||
|
default { "ℹ️" }
|
||||||
|
}
|
||||||
|
|
||||||
|
$output = if ($Prefix) { "$emoji $Prefix :: $Message" } else { "$emoji $Message" }
|
||||||
|
if ($NoNewline) {
|
||||||
|
Write-Host $output -ForegroundColor $Color -NoNewline
|
||||||
|
} else {
|
||||||
|
Write-Host $output -ForegroundColor $Color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 檢查管理員權限
|
||||||
$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
|
$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
|
||||||
if (-NOT $isAdmin) {
|
if (-NOT $isAdmin) {
|
||||||
# Detect PowerShell version and path
|
Write-Styled "需要管理員權限來安裝" -Color $Theme.Warning -Prefix "權限"
|
||||||
|
Write-Styled "正在請求管理員權限..." -Color $Theme.Primary -Prefix "提升"
|
||||||
|
|
||||||
|
# 顯示操作選項
|
||||||
|
Write-Host "`n選擇操作:" -ForegroundColor $Theme.Primary
|
||||||
|
Write-Host "1. 請求管理員權限" -ForegroundColor $Theme.Info
|
||||||
|
Write-Host "2. 退出程序" -ForegroundColor $Theme.Info
|
||||||
|
|
||||||
|
$choice = Read-Host "`n請輸入選項 (1-2)"
|
||||||
|
|
||||||
|
if ($choice -ne "1") {
|
||||||
|
Write-Styled "安裝已取消" -Color $Theme.Warning -Prefix "取消"
|
||||||
|
Write-Host "`n按任意鍵退出..." -ForegroundColor $Theme.Info
|
||||||
|
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
$pwshPath = if (Get-Command "pwsh" -ErrorAction SilentlyContinue) {
|
$pwshPath = if (Get-Command "pwsh" -ErrorAction SilentlyContinue) {
|
||||||
(Get-Command "pwsh").Source # PowerShell 7+
|
(Get-Command "pwsh").Source
|
||||||
} elseif (Test-Path "$env:ProgramFiles\PowerShell\7\pwsh.exe") {
|
} elseif (Test-Path "$env:ProgramFiles\PowerShell\7\pwsh.exe") {
|
||||||
"$env:ProgramFiles\PowerShell\7\pwsh.exe"
|
"$env:ProgramFiles\PowerShell\7\pwsh.exe"
|
||||||
} else {
|
} else {
|
||||||
"powershell.exe" # Windows PowerShell
|
"powershell.exe"
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Write-Host "`nRequesting administrator privileges..." -ForegroundColor Cyan
|
$arguments = "-NoProfile -ExecutionPolicy Bypass -File `"$($MyInvocation.MyCommand.Path)`" -Elevated -WindowStyle Normal"
|
||||||
$scriptPath = $MyInvocation.MyCommand.Path
|
Start-Process -FilePath $pwshPath -Verb RunAs -ArgumentList $arguments
|
||||||
$argList = "-NoProfile -ExecutionPolicy Bypass -File `"$scriptPath`""
|
Write-Host "`n請在新開啟的管理員權限視窗中繼續操作..." -ForegroundColor $Theme.Primary
|
||||||
Start-Process -FilePath $pwshPath -Verb RunAs -ArgumentList $argList -Wait
|
|
||||||
|
# 等待用戶確認
|
||||||
|
Write-Host "`n按任意鍵退出此窗口..." -ForegroundColor $Theme.Info
|
||||||
|
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
Write-Host "`nError: Administrator privileges required" -ForegroundColor Red
|
Write-Styled "無法獲取管理員權限" -Color $Theme.Error -Prefix "錯誤"
|
||||||
Write-Host "Please run this script from an Administrator PowerShell window" -ForegroundColor Yellow
|
Write-Styled "請以管理員身份運行 PowerShell 後重試" -Color $Theme.Warning -Prefix "提示"
|
||||||
Write-Host "`nTo do this:" -ForegroundColor Cyan
|
Write-Styled "您可以:" -Color $Theme.Info
|
||||||
Write-Host "1. Press Win + X" -ForegroundColor White
|
Write-Host "1. 右鍵點擊 PowerShell,選擇「以系統管理員身分執行」" -ForegroundColor $Theme.Info
|
||||||
Write-Host "2. Click 'Windows Terminal (Admin)' or 'PowerShell (Admin)'" -ForegroundColor White
|
Write-Host "2. 然後重新運行此安裝程序" -ForegroundColor $Theme.Info
|
||||||
Write-Host "3. Run the installation command again" -ForegroundColor White
|
Write-Host "`n按任意鍵退出..." -ForegroundColor $Theme.Info
|
||||||
Write-Host "`nPress enter to exit..."
|
|
||||||
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Set TLS to 1.2
|
# 如果是提升權限後的窗口,等待一下確保窗口可見
|
||||||
|
if ($Elevated) {
|
||||||
|
Start-Sleep -Seconds 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# 獲取版本號函數
|
||||||
|
function Get-LatestVersion {
|
||||||
|
try {
|
||||||
|
$latestRelease = Invoke-RestMethod -Uri "https://api.github.com/repos/yeongpin/cursor-free-vip/releases/latest"
|
||||||
|
return @{
|
||||||
|
Version = $latestRelease.tag_name.TrimStart('v')
|
||||||
|
Assets = $latestRelease.assets
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
Write-Styled $_.Exception.Message -Color $Theme.Error -Prefix "錯誤"
|
||||||
|
throw "無法獲取最新版本信息"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 顯示 Logo
|
||||||
|
Write-Host $Logo -ForegroundColor $Theme.Primary
|
||||||
|
$releaseInfo = Get-LatestVersion
|
||||||
|
$version = $releaseInfo.Version
|
||||||
|
Write-Host "Version $version" -ForegroundColor $Theme.Info
|
||||||
|
Write-Host "Created by YeongPin`n" -ForegroundColor $Theme.Info
|
||||||
|
|
||||||
|
# 設置 TLS 1.2
|
||||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||||
|
|
||||||
# Create temporary directory
|
# 創建臨時目錄
|
||||||
$TmpDir = Join-Path $env:TEMP ([System.Guid]::NewGuid().ToString())
|
$TmpDir = Join-Path $env:TEMP ([System.Guid]::NewGuid().ToString())
|
||||||
New-Item -ItemType Directory -Path $TmpDir | Out-Null
|
New-Item -ItemType Directory -Path $TmpDir -Force | Out-Null
|
||||||
|
|
||||||
# Cleanup function
|
# 清理函數
|
||||||
function Cleanup {
|
function Cleanup {
|
||||||
if (Test-Path $TmpDir) {
|
if (Test-Path $TmpDir) {
|
||||||
Remove-Item -Recurse -Force $TmpDir
|
Remove-Item -Recurse -Force $TmpDir -ErrorAction SilentlyContinue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Error handler
|
# 主安裝函數
|
||||||
trap {
|
function Install-CursorFreeVIP {
|
||||||
Write-Host "Error: $_" -ForegroundColor Red
|
Write-Styled "開始安裝 Cursor Free VIP" -Color $Theme.Primary -Prefix "安裝"
|
||||||
Cleanup
|
|
||||||
Write-Host "Press enter to exit..."
|
# 設置安裝目錄
|
||||||
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
$InstallDir = "$env:ProgramFiles\CursorFreeVIP"
|
||||||
exit 1
|
if (!(Test-Path $InstallDir)) {
|
||||||
}
|
New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null
|
||||||
|
|
||||||
# Detect system architecture
|
|
||||||
function Get-SystemArch {
|
|
||||||
if ([Environment]::Is64BitOperatingSystem) {
|
|
||||||
return "x86_64"
|
|
||||||
} else {
|
|
||||||
return "i386"
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
# Download with progress
|
|
||||||
function Get-FileWithProgress {
|
|
||||||
param (
|
|
||||||
[string]$Url,
|
|
||||||
[string]$OutputFile
|
|
||||||
)
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
# 獲取最新版本
|
||||||
|
Write-Styled "正在檢查最新版本..." -Color $Theme.Primary -Prefix "更新"
|
||||||
|
$releaseInfo = Get-LatestVersion
|
||||||
|
$version = $releaseInfo.Version
|
||||||
|
Write-Styled "找到最新版本: $version" -Color $Theme.Success -Prefix "版本"
|
||||||
|
|
||||||
|
# 查找對應的資源
|
||||||
|
$asset = $releaseInfo.Assets | Where-Object { $_.name -eq "CursorFreeVIP_${version}_windows.exe" }
|
||||||
|
if (!$asset) {
|
||||||
|
Write-Styled "找不到檔案: CursorFreeVIP_${version}_windows.exe" -Color $Theme.Error -Prefix "錯誤"
|
||||||
|
Write-Styled "可用的檔案:" -Color $Theme.Warning -Prefix "資訊"
|
||||||
|
$releaseInfo.Assets | ForEach-Object {
|
||||||
|
Write-Styled "- $($_.name)" -Color $Theme.Info
|
||||||
|
}
|
||||||
|
throw "找不到對應的安裝檔案"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 下載
|
||||||
|
Write-Styled "正在下載..." -Color $Theme.Primary -Prefix "下載"
|
||||||
$webClient = New-Object System.Net.WebClient
|
$webClient = New-Object System.Net.WebClient
|
||||||
$webClient.Headers.Add("User-Agent", "PowerShell Script")
|
$webClient.Headers.Add("User-Agent", "PowerShell Script")
|
||||||
|
|
||||||
$webClient.DownloadFile($Url, $OutputFile)
|
$downloadPath = Join-Path $TmpDir "CursorFreeVIP.exe"
|
||||||
return $true
|
$webClient.DownloadFile($asset.browser_download_url, $downloadPath)
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Host "Failed to download: $_" -ForegroundColor Red
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main installation function
|
|
||||||
function Install-CursorFreeVIP {
|
|
||||||
Write-Host "Starting installation..." -ForegroundColor Cyan
|
|
||||||
|
|
||||||
# Detect architecture
|
|
||||||
$arch = Get-SystemArch
|
|
||||||
Write-Host "Detected architecture: $arch" -ForegroundColor Green
|
|
||||||
|
|
||||||
# Set installation directory
|
|
||||||
$InstallDir = "$env:ProgramFiles\CursorFreeVIP"
|
|
||||||
if (!(Test-Path $InstallDir)) {
|
|
||||||
New-Item -ItemType Directory -Path $InstallDir | Out-Null
|
|
||||||
}
|
|
||||||
|
|
||||||
# Get latest release
|
|
||||||
try {
|
|
||||||
$latestRelease = Invoke-RestMethod -Uri "https://api.github.com/repos/yeongpin/cursor-free-vip/releases/latest"
|
|
||||||
Write-Host "Found latest release: $($latestRelease.tag_name)" -ForegroundColor Cyan
|
|
||||||
|
|
||||||
# Look for Windows binary with our architecture
|
# 安裝
|
||||||
$version = $latestRelease.tag_name.TrimStart('v')
|
Write-Styled "正在安裝到系統..." -Color $Theme.Primary -Prefix "安裝"
|
||||||
Write-Host "Version: $version" -ForegroundColor Cyan
|
Copy-Item -Path $downloadPath -Destination "$InstallDir\CursorFreeVIP.exe" -Force
|
||||||
$possibleNames = @(
|
|
||||||
"CursorFreeVIP_${version}_windows.exe"
|
|
||||||
)
|
|
||||||
|
|
||||||
$asset = $null
|
# 添加到 PATH
|
||||||
foreach ($name in $possibleNames) {
|
|
||||||
Write-Host "Checking for asset: $name" -ForegroundColor Cyan
|
|
||||||
$asset = $latestRelease.assets | Where-Object { $_.name -eq $name }
|
|
||||||
if ($asset) {
|
|
||||||
Write-Host "Found matching asset: $($asset.name)" -ForegroundColor Green
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$asset) {
|
|
||||||
Write-Host "`nAvailable assets:" -ForegroundColor Yellow
|
|
||||||
$latestRelease.assets | ForEach-Object { Write-Host "- $($_.name)" }
|
|
||||||
throw "Could not find appropriate Windows binary for $arch architecture"
|
|
||||||
}
|
|
||||||
|
|
||||||
$downloadUrl = $asset.browser_download_url
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Host "Failed to get latest release: $_" -ForegroundColor Red
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Download binary
|
|
||||||
Write-Host "`nDownloading latest release..." -ForegroundColor Cyan
|
|
||||||
$binaryPath = Join-Path $TmpDir "CursorFreeVIP.exe"
|
|
||||||
|
|
||||||
if (!(Get-FileWithProgress -Url $downloadUrl -OutputFile $binaryPath)) {
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Install binary
|
|
||||||
Write-Host "Installing..." -ForegroundColor Cyan
|
|
||||||
try {
|
|
||||||
Copy-Item -Path $binaryPath -Destination "$InstallDir\CursorFreeVIP.exe" -Force
|
|
||||||
|
|
||||||
# Add to PATH if not already present
|
|
||||||
$currentPath = [Environment]::GetEnvironmentVariable("Path", "Machine")
|
$currentPath = [Environment]::GetEnvironmentVariable("Path", "Machine")
|
||||||
if ($currentPath -notlike "*$InstallDir*") {
|
if ($currentPath -notlike "*$InstallDir*") {
|
||||||
[Environment]::SetEnvironmentVariable("Path", "$currentPath;$InstallDir", "Machine")
|
[Environment]::SetEnvironmentVariable("Path", "$currentPath;$InstallDir", "Machine")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Write-Styled "安裝完成!" -Color $Theme.Success -Prefix "完成"
|
||||||
|
Write-Styled "正在啟動程序..." -Color $Theme.Primary -Prefix "啟動"
|
||||||
|
|
||||||
|
# 運行程序
|
||||||
|
Start-Process "$InstallDir\CursorFreeVIP.exe"
|
||||||
|
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
Write-Host "Failed to install: $_" -ForegroundColor Red
|
Write-Styled $_.Exception.Message -Color $Theme.Error -Prefix "錯誤"
|
||||||
exit 1
|
throw
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "Installation completed successfully!" -ForegroundColor Green
|
|
||||||
Write-Host "Running cursor-free-vip..." -ForegroundColor Cyan
|
|
||||||
|
|
||||||
# Run the program
|
|
||||||
try {
|
|
||||||
& "$InstallDir\cursor-id-modifier.exe"
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
Write-Host "Failed to run cursor-free-vip" -ForegroundColor Red
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Host "Failed to run cursor-free-vip: $_" -ForegroundColor Red
|
|
||||||
exit 1
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Run installation
|
# 執行安裝
|
||||||
try {
|
try {
|
||||||
Install-CursorModifier
|
Install-CursorFreeVIP
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
Write-Host "Installation failed: $_" -ForegroundColor Red
|
Write-Styled "安裝失敗" -Color $Theme.Error -Prefix "錯誤"
|
||||||
Cleanup
|
Write-Styled $_.Exception.Message -Color $Theme.Error
|
||||||
Write-Host "Press enter to exit..."
|
|
||||||
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
||||||
exit 1
|
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
Cleanup
|
Cleanup
|
||||||
if ($LASTEXITCODE -ne 0) {
|
Write-Host "`n按任意鍵退出..." -ForegroundColor $Theme.Info
|
||||||
Write-Host "Press enter to exit..." -ForegroundColor Green
|
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
||||||
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
98
scripts/install.sh
Normal file
98
scripts/install.sh
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 顏色定義
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Logo
|
||||||
|
print_logo() {
|
||||||
|
echo -e "${CYAN}"
|
||||||
|
cat << "EOF"
|
||||||
|
██████╗██╗ ██╗██████╗ ███████╗ ██████╗ ██████╗ ██████╗ ██████╗ ██████╗
|
||||||
|
██╔════╝██║ ██║██╔══██╗██╔════╝██╔═══██╗██╔══██╗ ██╔══██╗██╔══██╗██╔═══██╗
|
||||||
|
██║ ██║ ██║██████╔╝███████╗██║ ██║██████╔╝ ██████╔╝██████╔╝██║ ██║
|
||||||
|
██║ ██║ ██║██╔══██╗╚════██║██║ ██║██╔══██╗ ██╔═══╝ ██╔══██╗██║ ██║
|
||||||
|
╚██████╗╚██████╔╝██║ ██║███████║╚██████╔╝██║ ██║ ██║ ██║ ██║╚██████╔╝
|
||||||
|
╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝
|
||||||
|
EOF
|
||||||
|
echo -e "${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 檢查是否為 root 用戶
|
||||||
|
check_root() {
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
echo -e "${RED}❌ 錯誤: 請使用 sudo 運行此腳本${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 獲取最新版本
|
||||||
|
get_latest_version() {
|
||||||
|
echo -e "${CYAN}ℹ️ 正在檢查最新版本...${NC}"
|
||||||
|
local latest_release
|
||||||
|
latest_release=$(curl -s https://api.github.com/repos/yeongpin/cursor-free-vip/releases/latest)
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo -e "${RED}❌ 無法獲取最新版本信息${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VERSION=$(echo "$latest_release" | grep -o '"tag_name": ".*"' | cut -d'"' -f4 | tr -d 'v')
|
||||||
|
echo -e "${GREEN}✅ 找到最新版本: ${VERSION}${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 檢測系統類型
|
||||||
|
detect_os() {
|
||||||
|
if [[ "$(uname)" == "Darwin" ]]; then
|
||||||
|
OS="mac"
|
||||||
|
else
|
||||||
|
OS="linux"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 創建臨時目錄
|
||||||
|
create_temp_dir() {
|
||||||
|
TMP_DIR=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$TMP_DIR"' EXIT
|
||||||
|
}
|
||||||
|
|
||||||
|
# 下載並安裝
|
||||||
|
install_cursor_free_vip() {
|
||||||
|
local install_dir="/usr/local/bin"
|
||||||
|
local binary_name="CursorFreeVIP_${VERSION}_${OS}"
|
||||||
|
local download_url="https://github.com/yeongpin/cursor-free-vip/releases/download/v${VERSION}/${binary_name}"
|
||||||
|
|
||||||
|
echo -e "${CYAN}ℹ️ 正在下載...${NC}"
|
||||||
|
if ! curl -L -o "${TMP_DIR}/${binary_name}" "$download_url"; then
|
||||||
|
echo -e "${RED}❌ 下載失敗${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${CYAN}ℹ️ 正在安裝...${NC}"
|
||||||
|
chmod +x "${TMP_DIR}/${binary_name}"
|
||||||
|
mv "${TMP_DIR}/${binary_name}" "${install_dir}/cursor-free-vip"
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo -e "${GREEN}✅ 安裝完成!${NC}"
|
||||||
|
echo -e "${CYAN}ℹ️ 您可以通過運行 'cursor-free-vip' 來啟動程序${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}❌ 安裝失敗${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主程序
|
||||||
|
main() {
|
||||||
|
print_logo
|
||||||
|
check_root
|
||||||
|
get_latest_version
|
||||||
|
detect_os
|
||||||
|
create_temp_dir
|
||||||
|
install_cursor_free_vip
|
||||||
|
}
|
||||||
|
|
||||||
|
# 運行主程序
|
||||||
|
main
|
||||||
Reference in New Issue
Block a user