Add region-based CDN selection and IP check

Introduces an IS_CN flag and logic to select Steam CDN endpoints based on region in constants.py. Adds an IP check in OnekeyApp to set the region flag at runtime. Also removes a commercial use warning from about.html and applies minor formatting changes to index.html.
This commit is contained in:
ikun0014
2025-09-19 22:46:53 +08:00
parent eefff08159
commit 15b3caddcf
5 changed files with 163 additions and 169 deletions

View File

@@ -3,18 +3,30 @@
from pathlib import Path
LOG_DIR = Path("logs")
IS_CN = False
CONFIG_FILE = Path("config.json")
STEAM_API_BASE = "https://steam.ikunshare.com/api"
STEAM_CACHE_CDN_LIST = [
"https://cache1-hkg1.steamcontent.com",
"https://cache2-hkg1.steamcontent.com",
"https://cache3-hkg1.steamcontent.com",
"https://cache4-hkg1.steamcontent.com",
"https://cache5-hkg1.steamcontent.com",
"https://cache6-hkg1.steamcontent.com",
"https://cache7-hkg1.steamcontent.com",
"https://cache8-hkg1.steamcontent.com",
"https://cache9-hkg1.steamcontent.com",
"https://cache10-hkg1.steamcontent.com",
]
STEAM_CACHE_CDN_LIST = (
[
"http://alibaba.cdn.steampipe.steamcontent.com",
"http://steampipe.steamcontent.tnkjmec.com",
]
if IS_CN
else [
"http://fastly.cdn.steampipe.steamcontent.com",
"http://akamai.cdn.steampipe.steamcontent.com",
"http://telus.cdn.steampipe.steamcontent.com",
"https://cache1-hkg1.steamcontent.com",
"https://cache2-hkg1.steamcontent.com",
"https://cache3-hkg1.steamcontent.com",
"https://cache4-hkg1.steamcontent.com",
"https://cache5-hkg1.steamcontent.com",
"https://cache6-hkg1.steamcontent.com",
"https://cache7-hkg1.steamcontent.com",
"https://cache8-hkg1.steamcontent.com",
"https://cache9-hkg1.steamcontent.com",
"https://cache10-hkg1.steamcontent.com",
]
)

View File

@@ -5,6 +5,7 @@ from .logger import Logger
from .models import DepotInfo, ManifestInfo, SteamAppInfo, SteamAppManifestInfo
from .network.client import HttpClient
from .manifest_handler import ManifestHandler
from . import constants
class OnekeyApp:
@@ -19,6 +20,14 @@ class OnekeyApp:
)
self.client = HttpClient()
async def check_ip(self):
req = await self.client.get(
"https://mips.kugou.com/check/iscn",
)
req.raise_for_status()
body = req.json()
constants.IS_CN = bool(body["ip_flag"])
async def fetch_key(self):
trans = {
"week": "周卡",
@@ -156,6 +165,7 @@ class OnekeyApp:
self.logger.error("Steam路径未配置或无效无法继续")
return False
await self.check_ip()
await self.fetch_key()
manifests = []

View File

@@ -23,3 +23,4 @@ class HttpClient:
async def __aexit__(self, exc_type, exc_val, exc_tb):
await self.close()

View File

@@ -106,10 +106,6 @@
<h4>使用须知</h4>
</div>
<div class="notice-content">
<p>
<strong>⚠️ 重要提醒</strong> -
本工具完全免费,严禁任何形式的商业化使用或倒卖
</p>
<p>
<strong>🖥️ 系统要求</strong> - 请确保已安装Windows
10/11并正确配置Steam客户端

View File

@@ -1,175 +1,150 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Onekey - Home</title>
<!-- Material Design 3 -->
<link
href="https://cdn.jsdmirror.com/gh/ikun0014/font@main/style.css"
rel="stylesheet"
/>
<link
href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet"
/>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Onekey - Home</title>
<!-- 自定义样式 -->
<link rel="stylesheet" href="/static/css/style.css" />
</head>
<!-- Material Design 3 -->
<link href="https://cdn.jsdmirror.com/gh/ikun0014/font@main/style.css" rel="stylesheet" />
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" />
<body>
<div class="app-container">
<!-- 顶部应用栏 -->
<header class="app-bar">
<div class="app-bar-content">
<span class="material-icons app-icon">games</span>
<h1 class="app-title">Onekey</h1>
<button
type="button"
class="theme-toggle"
id="themeToggle"
title="切换主题"
>
<span class="material-icons">light_mode</span>
</button>
<a href="/settings" class="btn btn-text settings-link">
<span class="material-icons">settings</span>
<span class="settings-text">设置</span>
</a>
<a href="/about" class="btn btn-text about-link">
<span class="material-icons">info</span>
<span class="about-text">关于本项目</span>
</a>
<!-- 自定义样式 -->
<link rel="stylesheet" href="/static/css/style.css" />
</head>
<body>
<div class="app-container">
<!-- 顶部应用栏 -->
<header class="app-bar">
<div class="app-bar-content">
<span class="material-icons app-icon">games</span>
<h1 class="app-title">Onekey</h1>
<button type="button" class="theme-toggle" id="themeToggle" title="切换主题">
<span class="material-icons">light_mode</span>
</button>
<a href="/settings" class="btn btn-text settings-link">
<span class="material-icons">settings</span>
<span class="settings-text">设置</span>
</a>
<a href="/about" class="btn btn-text about-link">
<span class="material-icons">info</span>
<span class="about-text">关于本项目</span>
</a>
</div>
</header>
<!-- 主内容区域 -->
<main class="main-content">
<!-- 配置状态卡片 -->
<div class="card config-card">
<div class="card-header">
<span class="material-icons">settings</span>
<h2>配置状态</h2>
</div>
</header>
<!-- 主内容区域 -->
<main class="main-content">
<!-- 配置状态卡片 -->
<div class="card config-card">
<div class="card-header">
<span class="material-icons">settings</span>
<h2>配置状态</h2>
<div class="card-content">
<div class="config-status" id="configStatus">
<div class="loading">正在检查配置...</div>
</div>
<div class="card-content">
<div class="config-status" id="configStatus">
<div class="loading">正在检查配置...</div>
</div>
</div>
<!-- 游戏解锁卡片 -->
<div class="card unlock-card">
<div class="card-header">
<span class="material-icons">lock_open</span>
<h2>游戏解锁</h2>
</div>
<div class="card-content">
<form id="unlockForm" class="unlock-form">
<div class="input-group">
<label for="appId" class="input-label">Steam App ID</label>
<input type="text" id="appId" name="appId" class="text-field" placeholder="请输入游戏的App ID"
inputmode="numeric" autocomplete="off" autofocus required />
<div class="input-feedback" id="appIdFeedback"></div>
<div class="input-helper">例如: 730 (CS2), 570 (Dota 2)</div>
</div>
</div>
</div>
<!-- 游戏解锁卡片 -->
<div class="card unlock-card">
<div class="card-header">
<span class="material-icons">lock_open</span>
<h2>游戏解锁</h2>
</div>
<div class="card-content">
<form id="unlockForm" class="unlock-form">
<div class="input-group">
<label for="appId" class="input-label">Steam App ID</label>
<input
type="text"
id="appId"
name="appId"
class="text-field"
placeholder="请输入游戏的App ID"
inputmode="numeric"
autocomplete="off"
autofocus
required
/>
<div class="input-feedback" id="appIdFeedback"></div>
<div class="input-helper">例如: 730 (CS2), 570 (Dota 2)</div>
</div>
<div class="input-group">
<label class="input-label">解锁工具</label>
<div class="radio-group">
<label class="radio-item">
<input
type="radio"
name="toolType"
value="steamtools"
checked
/>
<span class="radio-button"></span>
<span class="radio-label"
>SteamTools(更新积极, 推荐使用)</span
>
</label>
<label class="radio-item">
<input type="radio" name="toolType" value="greenluma" />
<span class="radio-button"></span>
<span class="radio-label">GreenLuma(一年一更, 无GUI)</span>
</label>
</div>
</div>
<div class="input-group" id="+DLCGroup">
<label class="checkbox-item">
<input type="checkbox" id="+DLC" name="+DLC" />
<span class="checkbox-button"></span>
<span class="checkbox-label">检索并入库所有DLC</span>
<div class="input-group">
<label class="input-label">解锁工具</label>
<div class="radio-group">
<label class="radio-item">
<input type="radio" name="toolType" value="steamtools" checked />
<span class="radio-button"></span>
<span class="radio-label">SteamTools(更新积极, 推荐使用)</span>
</label>
<label class="radio-item">
<input type="radio" name="toolType" value="greenluma" />
<span class="radio-button"></span>
<span class="radio-label">GreenLuma(一年一更, 无GUI)</span>
</label>
<div class="input-helper">
需要注意: 有些DLC的Depot与游戏本体在一起, 不会分离
</div>
</div>
</div>
<div class="button-group">
<button type="submit" class="btn btn-primary" id="unlockBtn">
<span class="material-icons">play_arrow</span>
开始解锁
</button>
<button type="button" class="btn btn-secondary" id="resetBtn">
<span class="material-icons">refresh</span>
重置
</button>
<div class="input-group" id="+DLCGroup">
<label class="checkbox-item">
<input type="checkbox" id="+DLC" name="+DLC" />
<span class="checkbox-button"></span>
<span class="checkbox-label">检索并入库所有DLC</span>
</label>
<div class="input-helper">
需要注意: 有些DLC的Depot与游戏本体在一起, 不会分离
</div>
</form>
</div>
</div>
</div>
<!-- 进度日志卡片 -->
<div class="card progress-card">
<div class="card-header">
<span class="material-icons">timeline</span>
<h2>执行日志</h2>
<div class="card-actions">
<button class="btn btn-text" id="clearLogBtn">
<span class="material-icons">clear_all</span>
清空
<div class="button-group">
<button type="submit" class="btn btn-primary" id="unlockBtn">
<span class="material-icons">play_arrow</span>
开始解锁
</button>
<button type="button" class="btn btn-secondary" id="resetBtn">
<span class="material-icons">refresh</span>
重置
</button>
</div>
</form>
</div>
</div>
<!-- 进度日志卡片 -->
<div class="card progress-card">
<div class="card-header">
<span class="material-icons">timeline</span>
<h2>执行日志</h2>
<div class="card-actions">
<button class="btn btn-text" id="clearLogBtn">
<span class="material-icons">clear_all</span>
清空
</button>
</div>
<div class="card-content">
<div class="progress-container" id="progressContainer">
<div class="progress-placeholder">
<span class="material-icons">info</span>
<p>等待任务开始...</p>
</div>
</div>
<div class="card-content">
<div class="progress-container" id="progressContainer">
<div class="progress-placeholder">
<span class="material-icons">info</span>
<p>等待任务开始...</p>
</div>
</div>
</div>
</main>
</div>
<!-- 提示框 -->
<div id="snackbar" class="snackbar">
<div class="snackbar-content">
<span id="snackbarMessage"></span>
<button id="snackbarClose" class="snackbar-action">
<span class="material-icons">close</span>
</button>
</div>
</div>
</main>
</div>
<!-- 脚本 -->
<script src="{{ url_for('static', path='js/app.js') }}"></script>
<script src="{{ url_for('static', path='js/theme.js') }}"></script>
<script src="{{ url_for('static', path='js/project-info.js') }}"></script>
</body>
</html>
<!-- 提示框 -->
<div id="snackbar" class="snackbar">
<div class="snackbar-content">
<span id="snackbarMessage"></span>
<button id="snackbarClose" class="snackbar-action">
<span class="material-icons">close</span>
</button>
</div>
</div>
<!-- 脚本 -->
<script src="{{ url_for('static', path='js/app.js') }}"></script>
<script src="{{ url_for('static', path='js/theme.js') }}"></script>
<script src="{{ url_for('static', path='js/project-info.js') }}"></script>
</body>
</html>