+
+ 📊 用量查询配置(v3.9+,可选)
+
+
+ 配置用量查询脚本,可自动查询 API 余额
+
+
+
+
+
+
+
+
+
+
+
+ 用量查询接口的基础地址,必须与脚本中的请求 URL 同源
+
+
+
+
+
+
+
+
+
+
+
+
+ 支持模板变量:{{baseUrl}}、{{apiKey}}、{{accessToken}}、{{userId}}
+
+
+
+
+
+
+
+ 0 表示禁用自动查询
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2014,7 +1327,18 @@ requires_openai_auth = true`;
// 添加参数
if (homepage) params.append('homepage', homepage);
- params.append('endpoint', endpoint);
+
+ // 合并主端点和备用端点
+ const extraEndpoints = document.getElementById('extraEndpoints').value.trim();
+ let fullEndpoint = endpoint;
+ if (extraEndpoints) {
+ const extras = extraEndpoints.split(',').map(e => e.trim()).filter(e => e);
+ if (extras.length > 0) {
+ fullEndpoint = endpoint + ',' + extras.join(',');
+ }
+ }
+ params.append('endpoint', fullEndpoint);
+
params.append('apiKey', apiKey);
if (model) params.append('model', model);
if (icon) params.append('icon', icon);
@@ -2115,6 +1439,30 @@ requires_openai_auth = true`;
}
}
+ // 添加用量查询参数 (v3.9+)
+ const usageEnabled = document.getElementById('usageEnabled').value;
+ const usageBaseUrl = document.getElementById('usageBaseUrl').value.trim();
+ const usageApiKey = document.getElementById('usageApiKey').value.trim();
+ const usageScript = document.getElementById('usageScript').value.trim();
+ const usageAutoInterval = document.getElementById('usageAutoInterval').value.trim();
+ const usageAccessToken = document.getElementById('usageAccessToken').value.trim();
+ const usageUserId = document.getElementById('usageUserId').value.trim();
+
+ if (usageEnabled) params.append('usageEnabled', usageEnabled);
+ if (usageBaseUrl) params.append('usageBaseUrl', usageBaseUrl);
+ if (usageApiKey) params.append('usageApiKey', usageApiKey);
+ if (usageScript) {
+ // URL-safe Base64 编码
+ const scriptB64 = utf8_to_b64(usageScript)
+ .replace(/\+/g, '-')
+ .replace(/\//g, '_')
+ .replace(/=+$/, '');
+ params.append('usageScript', scriptB64);
+ }
+ if (usageAutoInterval) params.append('usageAutoInterval', usageAutoInterval);
+ if (usageAccessToken) params.append('usageAccessToken', usageAccessToken);
+ if (usageUserId) params.append('usageUserId', usageUserId);
+
const deepLink = `ccswitch://v1/import?${params.toString()}`;
// 显示结果
@@ -2221,8 +1569,8 @@ requires_openai_auth = true`;
`;
- // 常规参数
- const regularParams = ['homepage', 'endpoint', 'apiKey', 'model', 'notes'];
+ // 常规参数(排除 endpoint,单独处理)
+ const regularParams = ['homepage', 'apiKey', 'model', 'notes'];
regularParams.forEach(key => {
if (paramsObj[key]) {
let displayValue = paramsObj[key];
@@ -2237,6 +1585,38 @@ requires_openai_auth = true`;
}
});
+ // 单独处理 endpoint(支持多端点)
+ if (paramsObj.endpoint) {
+ const endpoints = paramsObj.endpoint.split(',').map(e => e.trim()).filter(e => e);
+ if (endpoints.length === 1) {
+ // 单个端点
+ urlParamsHtml += `
+
endpoint:
+
${endpoints[0]}
+ `;
+ } else {
+ // 多个端点
+ urlParamsHtml += `
+
endpoints:
+
+ `;
+ endpoints.forEach((ep, idx) => {
+ const label = idx === 0 ? '🔹 主端点' : `└ 备用 ${idx}`;
+ urlParamsHtml += `
+
+ ${label}: ${ep}
+
+ `;
+ });
+ urlParamsHtml += `
+
+ 💡 共 ${endpoints.length} 个端点,第一个为主端点,其余为备用端点
+
+
+ `;
+ }
+ }
+
// Claude 专用模型参数
const claudeModelParams = ['haikuModel', 'sonnetModel', 'opusModel'];
claudeModelParams.forEach(key => {
@@ -2349,10 +1729,93 @@ requires_openai_auth = true`;
}
}
+ // 用量查询配置解析 (v3.9+)
+ let usageHtml = '';
+ if (paramsObj.usageEnabled || paramsObj.usageScript || paramsObj.usageBaseUrl) {
+ usageHtml = `
+
+
📊 用量查询配置 (v3.9+)
+
+ `;
+
+ if (paramsObj.usageEnabled) {
+ usageHtml += `
+
启用状态:
+
${paramsObj.usageEnabled === 'true' ? '✅ 已启用' : '❌ 已禁用'}
+ `;
+ }
+
+ if (paramsObj.usageBaseUrl) {
+ usageHtml += `
+
Base URL:
+
${paramsObj.usageBaseUrl}
+ `;
+ }
+
+ if (paramsObj.usageApiKey) {
+ usageHtml += `
+
API Key:
+
${paramsObj.usageApiKey.substring(0, 10)}****
+ `;
+ }
+
+ if (paramsObj.usageAutoInterval) {
+ usageHtml += `
+
自动查询间隔:
+
${paramsObj.usageAutoInterval} 分钟
+ `;
+ }
+
+ if (paramsObj.usageAccessToken) {
+ usageHtml += `
+
Access Token:
+
${paramsObj.usageAccessToken.substring(0, 10)}****
+ `;
+ }
+
+ if (paramsObj.usageUserId) {
+ usageHtml += `
+
User ID:
+
${paramsObj.usageUserId}
+ `;
+ }
+
+ usageHtml += '
';
+
+ // 解析用量脚本
+ if (paramsObj.usageScript) {
+ try {
+ // URL-safe Base64 解码
+ let scriptB64 = paramsObj.usageScript
+ .replace(/-/g, '+')
+ .replace(/_/g, '/');
+ // 补齐 padding
+ while (scriptB64.length % 4) {
+ scriptB64 += '=';
+ }
+ const scriptContent = b64_to_utf8(scriptB64);
+ usageHtml += `
+
+
用量查询脚本:
+
${scriptContent}
+
+ `;
+ } catch (e) {
+ usageHtml += `
+
+ ⚠️ 脚本解码失败: ${e.message}
+
+ `;
+ }
+ }
+
+ usageHtml += '
';
+ }
+
// 显示结果
document.getElementById('parseBasicInfo').innerHTML = basicInfoHtml;
document.getElementById('parseUrlParams').innerHTML = urlParamsHtml;
- document.getElementById('parseConfigContent').innerHTML = configHtml;
+ document.getElementById('parseConfigContent').innerHTML = configHtml + usageHtml;
document.getElementById('parseResult').style.display = 'block';
// 滚动到结果
@@ -2712,4 +2175,4 @@ requires_openai_auth = true`;