mirror of
https://github.com/woodchen-ink/openai-billing-query.git
synced 2025-07-18 05:51:59 +08:00
Merge pull request #33 from woodchen-ink:woodchen-ink/issue32
修复,并改用mdui2
This commit is contained in:
commit
9c70af453a
106
get_sess.html
Normal file
106
get_sess.html
Normal file
@ -0,0 +1,106 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="mdui-theme-light" lang="zh-cmn-Hans">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>通过access_token来获取sess</title>
|
||||
<meta name="description" content="批量快速查询OPENAI的余额,支持可视化展现已用比例、额度、已用量、未用量、是否GPT-4、是否GPT4-32K、是否绑卡、绑卡信息、组织信息、是否有效">
|
||||
<link rel="stylesheet" href="./static/css-1.css" type="text/css" />
|
||||
<link rel="stylesheet" href="./static/mdui/mdui.css">
|
||||
<script src="./static/mdui/mdui.global.js"></script>
|
||||
|
||||
<script>mdui.setColorScheme('#0d2d44');</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<mdui-layout>
|
||||
<mdui-layout-main>
|
||||
<div class="mdui-main-container">
|
||||
<h2>查询结果</h2>
|
||||
<div class="mdui-table">
|
||||
<table id="result-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th>
|
||||
<th>Access_Token</th>
|
||||
<th>user id</th>
|
||||
<th>email</th>
|
||||
<th>name</th>
|
||||
<th>phone number</th>
|
||||
<th>注册时间</th>
|
||||
<th>sess id</th>
|
||||
<th>sess id生成时间</th>
|
||||
<th>org id</th>
|
||||
<th>IP Country</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- 表格内容 -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</mdui-layout-main>
|
||||
|
||||
<mdui-top-app-bar>
|
||||
<mdui-button-icon icon="menu" close-on-overlay-click id="toggle-button"
|
||||
style="color: white;"></mdui-button-icon>
|
||||
<mdui-top-app-bar-title
|
||||
style="text-align: center;color:white;">通过access_token来获取sess</mdui-top-app-bar-title>
|
||||
</mdui-top-app-bar>
|
||||
|
||||
<mdui-navigation-drawer open class="left-drawer" close-on-overlay-click>
|
||||
<div class="left-drawer-main">
|
||||
<h3>输入 API KEY</h3>
|
||||
<p>本站不保存 KEY 信息,查询后请自行保存</p>
|
||||
<mdui-text-field id="api-key-input" placeholder="请输入access_token,多个请换行" label="access_token"
|
||||
rows="6"></mdui-text-field>
|
||||
|
||||
<mdui-select id="api-url-select" icon="airline_stops" label="查询线路" value="https://api.openai.com"
|
||||
onchange="toggleCustomUrlInput()">
|
||||
<mdui-menu-item value="https://api.openai.com">[官网线路]api.openai.com</mdui-menu-item>
|
||||
<mdui-menu-item value="https://oapi.czl.net">[CZLoapi线路]oapi.czl.net</mdui-menu-item>
|
||||
<mdui-menu-item value="https://openai.996.lat">[群友CF反代]openai.996.lat</mdui-menu-item>
|
||||
<mdui-menu-item value="custom">[已前置https]自定义</mdui-menu-item>
|
||||
</mdui-select>
|
||||
|
||||
<mdui-text-field type="text" id="custom-url-input" placeholder="输入自定义API,填域名即可,无需https://"
|
||||
class="hidden"></mdui-text-field>
|
||||
|
||||
<div style="height:2rem"></div>
|
||||
|
||||
|
||||
<mdui-button full-width id="query-button" icon="search" onclick="sendRequest()">
|
||||
查询
|
||||
</mdui-button>
|
||||
|
||||
|
||||
<!-- 下半部分 -->
|
||||
<h4>页面列表</h4>
|
||||
<mdui-menu style="width:100%;margin-top:20px;">
|
||||
<mdui-menu-item icon="search" href="index.html">查API信息</mdui-menu-item>
|
||||
<mdui-menu-item icon="vpn_key" href="get_sess.html">通过access token获取sess</mdui-menu-item>
|
||||
<mdui-menu-item icon="build" href="https://woodchen.ink/1266.html"
|
||||
target="_blank">手动获取sess的方法</mdui-menu-item>
|
||||
<mdui-menu-item icon="account_tree" href="https://github.com/pandora-next/deploy"
|
||||
target="_blank">pandora无痛获取access</mdui-menu-item>
|
||||
</mdui-menu>
|
||||
|
||||
<div style="margin-top:20px;">
|
||||
<mdui-chip elevated icon="code"> 本网页由<a href="https://woodchen.ink"
|
||||
target="_blank">woodchen</a>开源于<a
|
||||
href="https://github.com/woodchen-ink/openai-billing-query" target="_blank">Github</a>
|
||||
</mdui-chip>
|
||||
</div>
|
||||
</div>
|
||||
</mdui-navigation-drawer>
|
||||
|
||||
|
||||
|
||||
</mdui-layout>
|
||||
<script src="./static/getsess.js"></script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
@ -1,69 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>通过access_token来获取sess</title>
|
||||
<meta name="description" content="批量快速查询OPENAI的余额,支持可视化展现已用比例、额度、已用量、未用量、是否GPT-4、是否GPT4-32K、是否绑卡、绑卡信息、组织信息、是否有效">
|
||||
<link rel="stylesheet" href="./static/css.css" type="text/css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<h1 class="text-3xl font-semibold text-center mb-8 text-gradient">通过access token来获取sess</h1>
|
||||
<p style="color:#FFF;text-align: center;">页面列表:<a href="index.html" style="color:#FFF;text-decoration: underline;">查API信息</a> <a href="get_sess1.html" style="color:#FFF;text-decoration: underline;">通过access token获取sess</a> </p>
|
||||
</header>
|
||||
|
||||
<div class="query">
|
||||
<div>
|
||||
<h2 style="display: inline-block;">输入 Access Token</h2>
|
||||
<p style="display: inline-block; font-size: smaller;">本站不保存 KEY 信息,查询后请自行保存</p>
|
||||
</div>
|
||||
<textarea id="api-key-input" placeholder="请输入 access_token,多个换行分开"></textarea></p>
|
||||
<!-- API链接选择框 -->
|
||||
<div class="api-url-container"></div>
|
||||
<!-- API链接选择 -->
|
||||
<div>
|
||||
<h2 style="display: inline-block;">选择查询线路</h2>
|
||||
<p style="display: inline-block; font-size: smaller;">支持自定义线路,官网线路需要魔法</p>
|
||||
</div>
|
||||
<select id="api-url-select" style="width:49%;">
|
||||
<option value="https://api.openai.com">【官网线路】api.openai.com</option>
|
||||
<option value="https://oapi.czl.net">【CZLoapi线路】oapi.czl.net</option>
|
||||
<option value="https://openai.996.lat">【群友提供公益CF反代,勿测重要key】openai.996.lat</option>
|
||||
<option value="custom">【已前置https】自定义 ...</option>
|
||||
</select>
|
||||
|
||||
<!-- 自定义API链接输入框 -->
|
||||
<input type="text" id="custom-url-input" placeholder="输入自定义API,填域名即可,无需https://" style="width:45%;" />
|
||||
</div>
|
||||
<button :class="{ loading }" :disabled="loading" onclick="sendRequest()">查询</button>
|
||||
</div>
|
||||
<h2 id="result-head" style="visibility:hidden">查询结果</h2>
|
||||
<table id="result-table" style="visibility:hidden">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:50px">序号</th>
|
||||
<th>Access_Token</th>
|
||||
<th >sess id</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
|
||||
<footer>
|
||||
<p>广告链接:
|
||||
<a href="https://chat.czl.net" target="_blank">CZLChat</a>
|
||||
<a href="https://oapi.czl.net" target="_blank">CZLOapi</a>
|
||||
<a href="https://store0.czl.net" target="_blank">CZL Store</a>
|
||||
<br>
|
||||
本网页由<a href="https://woodchen.ink" target="_blank">woodchen</a>开源于<a
|
||||
href="https://github.com/woodchen-ink/openai-billing-query" target="_blank">Github</a>,欢迎给个star
|
||||
</p>
|
||||
|
||||
</footer>
|
||||
<script src="./static/sess1.js"></script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
69
index.html
69
index.html
@ -14,55 +14,54 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<mdui-layout >
|
||||
<mdui-layout>
|
||||
<mdui-layout-main>
|
||||
<div class="mdui-main-container">
|
||||
<h2>查询结果</h2>
|
||||
<div class="mdui-table">
|
||||
<table id="result-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th>
|
||||
<th>API KEY</th>
|
||||
<th>总额度</th>
|
||||
<th>已使用</th>
|
||||
<th>剩余量</th>
|
||||
<th id="progressbar-header">已用比例</th>
|
||||
<th>到期时间</th>
|
||||
<th>模型[最高]</th>
|
||||
<th>绑卡</th>
|
||||
<th id="subinfo-header">绑卡信息</th>
|
||||
<th id="setid-header">组织信息</th>
|
||||
<th>速率[RPM,TPM]</th>
|
||||
<th>有效</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- 表格内容 -->
|
||||
</tbody>
|
||||
</table>
|
||||
<h2>查询结果</h2>
|
||||
<div class="mdui-table">
|
||||
<table id="result-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>序号</th>
|
||||
<th>API KEY</th>
|
||||
<th>总额度</th>
|
||||
<th>已使用</th>
|
||||
<th>剩余量</th>
|
||||
<th id="progressbar-header">已用比例</th>
|
||||
<th>到期时间</th>
|
||||
<th>模型[最高]</th>
|
||||
<th>绑卡</th>
|
||||
<th id="subinfo-header">绑卡信息</th>
|
||||
<th id="setid-header">组织信息</th>
|
||||
<th>速率[RPM,TPM-RPD]</th>
|
||||
<th>有效</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- 表格内容 -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</mdui-layout-main>
|
||||
|
||||
<mdui-top-app-bar >
|
||||
<mdui-top-app-bar>
|
||||
<mdui-button-icon icon="menu" close-on-overlay-click id="toggle-button" style="color: white;"></mdui-button-icon>
|
||||
<mdui-top-app-bar-title style="text-align: center;color:white;">OpenAI API 信息查询</mdui-top-app-bar-title>
|
||||
</mdui-top-app-bar>
|
||||
|
||||
<mdui-navigation-drawer open class="left-drawer" close-on-overlay-click >
|
||||
<mdui-navigation-drawer open class="left-drawer" close-on-overlay-click>
|
||||
<div class="left-drawer-main">
|
||||
<h3>输入 API KEY</h3>
|
||||
<p>本站不保存 KEY 信息,查询后请自行保存</p>
|
||||
<mdui-text-field id="api-key-input" placeholder="请输入 API-KEY或sessID,多个可直接粘贴"
|
||||
label="API-KEY或sessID" rows="6"></mdui-text-field>
|
||||
<mdui-text-field id="api-key-input" placeholder="请输入 API-KEY或sessID,多个可直接粘贴" label="API-KEY或sessID"
|
||||
rows="6"></mdui-text-field>
|
||||
|
||||
<mdui-select id="api-url-select" icon="airline_stops" label="查询线路" value="https://api.openai.com"
|
||||
onchange="toggleCustomUrlInput()">
|
||||
<mdui-menu-item value="https://api.openai.com">[官网线路]api.openai.com</mdui-menu-item>
|
||||
<mdui-menu-item value="https://oapi.czl.net">[CZLoapi线路]oapi.czl.net</mdui-menu-item>
|
||||
<mdui-menu-item value="https://openai.996.lat">[群友CF反代]openai.996.lat</mdui-menu-item>
|
||||
<mdui-menu-item value="http://localhost:3000">[本地]</mdui-menu-item>
|
||||
<mdui-menu-item value="custom">[已前置https]自定义</mdui-menu-item>
|
||||
</mdui-select>
|
||||
|
||||
@ -84,15 +83,17 @@
|
||||
<mdui-button full-width id="query-button" icon="search" onclick="sendRequest()">
|
||||
查询
|
||||
</mdui-button>
|
||||
|
||||
|
||||
|
||||
<!-- 下半部分 -->
|
||||
<h4>页面列表</h4>
|
||||
<mdui-menu dense style="width:100%;margin-top:20px;">
|
||||
<mdui-menu style="width:100%;margin-top:20px;">
|
||||
<mdui-menu-item icon="search" href="index.html">查API信息</mdui-menu-item>
|
||||
<mdui-menu-item icon="vpn_key" href="get_sess1.html">通过access token获取sess</mdui-menu-item>
|
||||
<mdui-menu-item icon="vpn_key" href="get_sess.html">通过access token获取sess</mdui-menu-item>
|
||||
<mdui-menu-item icon="build" href="https://woodchen.ink/1266.html"
|
||||
target="_blank">手动获取sess的方法</mdui-menu-item>
|
||||
<mdui-menu-item icon="account_tree" href="https://github.com/pandora-next/deploy"
|
||||
target="_blank">pandora无痛获取access</mdui-menu-item>
|
||||
</mdui-menu>
|
||||
|
||||
<div style="margin-top:20px;">
|
||||
|
212
static/getsess.js
Normal file
212
static/getsess.js
Normal file
@ -0,0 +1,212 @@
|
||||
let queriedApiKeys = [];
|
||||
let serialNumber = 1;
|
||||
|
||||
function toggleCustomUrlInput() {
|
||||
// 获取id为"api-url-select"的元素
|
||||
const selectElement = document.getElementById("api-url-select");
|
||||
// 获取id为"custom-url-input"的元素
|
||||
const customUrlInput = document.getElementById("custom-url-input");
|
||||
|
||||
// 如果selectElement的值为"custom"
|
||||
if (selectElement.value === "custom") {
|
||||
// 从customUrlInput的classList中移除"hidden"
|
||||
customUrlInput.classList.remove("hidden");
|
||||
} else {
|
||||
// 给customUrlInput的classList添加"hidden"
|
||||
customUrlInput.classList.add("hidden");
|
||||
}
|
||||
}
|
||||
|
||||
async function checkBilling(apiKey, apiUrl) {
|
||||
const headers = {
|
||||
"Authorization": "Bearer " + apiKey,
|
||||
"Content-Type": "application/json"
|
||||
};
|
||||
const urlGetsess = `${apiUrl}/dashboard/onboarding/login`;
|
||||
|
||||
try {
|
||||
const response = await fetch(urlGetsess, {
|
||||
method: "POST", // 设置请求方法为 POST
|
||||
headers: headers,
|
||||
body: JSON.stringify({}) // 此处放置要发送的数据
|
||||
});
|
||||
|
||||
const getsessdata = await response.json();
|
||||
console.log(getsessdata);
|
||||
if (getsessdata && getsessdata.user && getsessdata.user.session) {
|
||||
return getsessdata; // 直接返回整个getsessdata对象
|
||||
} else {
|
||||
console.error("Unexpected data structure: user or session property not found in the response.", getsessdata);
|
||||
return null;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
//查询函数
|
||||
async function sendRequest() {
|
||||
let button = document.querySelector("button");
|
||||
button.textContent = "加载中...";
|
||||
button.disabled = true;
|
||||
button.classList.add("loading")
|
||||
|
||||
let apiKeyInput = document.getElementById("api-key-input");
|
||||
let apiUrlSelect = document.getElementById("api-url-select");
|
||||
let customUrlInput = document.getElementById("custom-url-input");
|
||||
let table = document.getElementById("result-table");
|
||||
let h2 = document.getElementById("result-head");
|
||||
|
||||
if (apiKeyInput.value.trim() === "") {
|
||||
alert("请填写API KEY");
|
||||
return;
|
||||
}
|
||||
|
||||
document.getElementById("result-table").getElementsByTagName('tbody')[0].innerHTML = "";
|
||||
|
||||
let apiUrl = "";
|
||||
if (apiUrlSelect.value === "custom") {
|
||||
if (customUrlInput.value.trim() === "") {
|
||||
mdui.alert({
|
||||
headline: "无查询线路",
|
||||
description: "请选择或自定义",
|
||||
confirmText: "OK",
|
||||
})
|
||||
return;
|
||||
} else {
|
||||
apiUrl = customUrlInput.value.trim();
|
||||
if (!apiUrl.startsWith("http://") && !apiUrl.startsWith("https://")) {
|
||||
apiUrl = "https://" + apiUrl;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
apiUrl = apiUrlSelect.value;
|
||||
}
|
||||
|
||||
let apiKeys = apiKeyInput.value.split(/[,\s,\n]+/);
|
||||
|
||||
if (apiKeys.length === 0) {
|
||||
mdui.alert({
|
||||
headline: "未匹配到 access_token",
|
||||
description: "请检查输入内容",
|
||||
confirmText: "OK",
|
||||
})
|
||||
return;
|
||||
}
|
||||
|
||||
mdui.alert({
|
||||
headline: "成功匹配到 access_token",
|
||||
description: apiKeys,
|
||||
confirmText: "OK",
|
||||
});
|
||||
|
||||
showLoadingAnimation();
|
||||
|
||||
let tableBody = document.querySelector("#result-table tbody");
|
||||
for (let i = 0; i < apiKeys.length; i++) {
|
||||
let apiKey = apiKeys[i].trim();
|
||||
|
||||
let data = await checkBilling(apiKey, apiUrl); // 获取 checkBilling 的结果
|
||||
|
||||
let row = document.createElement("tr");
|
||||
|
||||
let serialNumberCell = document.createElement("td");
|
||||
serialNumberCell.textContent = serialNumber;
|
||||
row.appendChild(serialNumberCell);
|
||||
|
||||
let apiKeyCell = document.createElement("td");
|
||||
apiKeyCell.textContent = apiKey.replace(/^(.{10}).*(.{8})$/, "$1***$2");
|
||||
row.appendChild(apiKeyCell);
|
||||
|
||||
if (data.user && data.user.session) {
|
||||
let user = data.user;
|
||||
let session = user.session;
|
||||
let ip_country = data.ip_country;
|
||||
|
||||
let orgId = user.orgs.data[0].id;
|
||||
|
||||
let properties = ['id', 'email', 'name', 'phone_number', 'created', 'sensitive_id', 'session_created', orgId, 'ip_country'];
|
||||
properties.forEach(prop => {
|
||||
let cell = document.createElement("td");
|
||||
if (prop === 'created' || prop === 'session_created') {
|
||||
let timestamp = prop === 'created' ? user[prop] : session['created'];
|
||||
cell.textContent = new Date(timestamp * 1000).toLocaleString();
|
||||
} else if (prop === 'sensitive_id') {
|
||||
cell.textContent = session[prop]; // 获取 session 对象中的 sensitive_id
|
||||
} else if (prop === orgId) {
|
||||
cell.textContent = orgId; // 直接使用 orgId 变量
|
||||
} else if (prop === 'ip_country') {
|
||||
cell.textContent = ip_country ? ip_country : 'N/A'; // 改为使用 ip_country 变量
|
||||
} else {
|
||||
cell.textContent = user[prop];
|
||||
}
|
||||
row.appendChild(cell);
|
||||
});
|
||||
|
||||
} else {
|
||||
// 接口返回的数据结构不符合预期
|
||||
console.error("Unexpected data structure: data[0] or data.user is undefined.");
|
||||
let errorMessageCell = document.createElement("td");
|
||||
errorMessageCell.colSpan = "8";
|
||||
errorMessageCell.classList.add("status-error");
|
||||
errorMessageCell.textContent = "不正确或已失效的API-KEY";
|
||||
row.appendChild(errorMessageCell);
|
||||
}
|
||||
|
||||
tableBody.appendChild(row);
|
||||
|
||||
if (i === apiKeys.length - 1) {
|
||||
queriedApiKeys = [];
|
||||
}
|
||||
serialNumber++;
|
||||
|
||||
|
||||
|
||||
button.textContent = "查询";
|
||||
button.disabled = false;
|
||||
button.classList.remove("loading");
|
||||
}
|
||||
hideLoadingAnimation();
|
||||
}
|
||||
|
||||
|
||||
let apiUrlSelect = document.getElementById("api-url-select");
|
||||
let customUrlInput = document.getElementById("custom-url-input");
|
||||
|
||||
apiUrlSelect.addEventListener("change", function () {
|
||||
if (apiUrlSelect.value === "custom") {
|
||||
customUrlInput.style.display = "inline-block";
|
||||
customUrlInput.style.marginTop = "5px";
|
||||
} else {
|
||||
customUrlInput.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function showLoadingAnimation() {
|
||||
const button = document.getElementById("query-button");
|
||||
|
||||
// 创建一个新的 <mdui-linear-progress> 元素
|
||||
const progressElement = document.createElement("mdui-linear-progress");
|
||||
progressElement.id = "query-progress";
|
||||
|
||||
// 将新元素替代原始按钮元素
|
||||
button.parentElement.replaceChild(progressElement, button);
|
||||
}
|
||||
|
||||
function hideLoadingAnimation() {
|
||||
const progressElement = document.querySelector("mdui-linear-progress");
|
||||
|
||||
if (progressElement) {
|
||||
const button = document.createElement("mdui-button");
|
||||
button.id = "query-button";
|
||||
button.innerHTML = "查询";
|
||||
button.setAttribute("full-width", "");
|
||||
button.setAttribute("icon", "search");
|
||||
button.setAttribute("onclick", "sendRequest()");
|
||||
|
||||
// 将原始按钮元素替代回来
|
||||
progressElement.parentElement.replaceChild(button, progressElement);
|
||||
}
|
||||
}
|
@ -397,6 +397,9 @@ function sendRequest() {
|
||||
}
|
||||
else if (sessKeyMatch !== null) {
|
||||
result.push(sessKeyMatch[0]);
|
||||
}else {
|
||||
// 如果没有匹配到任何内容,保留原始行
|
||||
result.push(line);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -565,7 +568,7 @@ function sendRequest() {
|
||||
} else if (model === 'gpt-4-32k') {
|
||||
modelName = 'gpt4-32K';
|
||||
}
|
||||
rateLimitsText += `${modelName}: ${rateLimitsData[model].max_requests_per_1_minute}, ${rateLimitsData[model].max_tokens_per_1_minute}\n`;
|
||||
rateLimitsText += `${modelName}: ${rateLimitsData[model].max_requests_per_1_minute}, ${rateLimitsData[model].max_tokens_per_1_minute}-${rateLimitsData[model].max_requests_per_1_day}\n`;
|
||||
} else {
|
||||
rateLimitsText += model + ": ❌\n";
|
||||
}
|
||||
|
170
static/sess1.js
170
static/sess1.js
@ -1,170 +0,0 @@
|
||||
let queriedApiKeys = [];
|
||||
let serialNumber = 1;
|
||||
|
||||
|
||||
async function checkBilling(apiKey, apiUrl) {
|
||||
const headers = {
|
||||
"Authorization": "Bearer " + apiKey,
|
||||
"Content-Type": "application/json"
|
||||
};
|
||||
const urlGetsess = `${apiUrl}/dashboard/onboarding/login`;
|
||||
|
||||
try {
|
||||
let getSess;
|
||||
try {
|
||||
const response = await fetch(urlGetsess, {
|
||||
method: "POST", // 设置请求方法为 POST
|
||||
headers: headers,
|
||||
body: JSON.stringify({}) // 此处放置要发送的数据
|
||||
});
|
||||
|
||||
const getsessdata = await response.json();
|
||||
console.log(getsessdata);
|
||||
|
||||
// 获取"sensitive_id"
|
||||
const sensitiveId = getsessdata.user.session.sensitive_id;
|
||||
|
||||
// 现在,sensitiveId 包含了"sensitive_id"的值
|
||||
console.log(sensitiveId);
|
||||
return [sensitiveId];
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return [null];
|
||||
}
|
||||
}
|
||||
|
||||
//查询函数
|
||||
async function sendRequest() {
|
||||
let button = document.querySelector("button");
|
||||
button.textContent = "加载中...";
|
||||
button.disabled = true;
|
||||
button.classList.add("loading")
|
||||
|
||||
let apiKeyInput = document.getElementById("api-key-input");
|
||||
let apiUrlSelect = document.getElementById("api-url-select");
|
||||
let customUrlInput = document.getElementById("custom-url-input");
|
||||
let table = document.getElementById("result-table");
|
||||
let h2 = document.getElementById("result-head");
|
||||
h2.style.visibility = "visible";
|
||||
table.style.visibility = "visible";
|
||||
|
||||
if (apiKeyInput.value.trim() === "") {
|
||||
alert("请填写API KEY");
|
||||
return;
|
||||
}
|
||||
|
||||
document.getElementById("result-table").getElementsByTagName('tbody')[0].innerHTML = "";
|
||||
|
||||
let apiUrl = "";
|
||||
if (apiUrlSelect.value === "custom") {
|
||||
if (customUrlInput.value.trim() === "") {
|
||||
alert("请设置API链接");
|
||||
return;
|
||||
} else {
|
||||
apiUrl = customUrlInput.value.trim();
|
||||
if (!apiUrl.startsWith("http://") && !apiUrl.startsWith("https://")) {
|
||||
apiUrl = "https://" + apiUrl;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
apiUrl = apiUrlSelect.value;
|
||||
}
|
||||
|
||||
let apiKeys = apiKeyInput.value.split(/[,\s,\n]+/);
|
||||
|
||||
if (apiKeys.length === 0) {
|
||||
alert("未匹配到 API-KEY,请检查输入内容");
|
||||
return;
|
||||
}
|
||||
|
||||
alert("成功匹配到 API Key,确认后开始查询:" + apiKeys);
|
||||
|
||||
let tableBody = document.querySelector("#result-table tbody");
|
||||
for (let i = 0; i < apiKeys.length; i++) {
|
||||
let apiKey = apiKeys[i].trim();
|
||||
|
||||
if (queriedApiKeys.includes(apiKey)) {
|
||||
console.log(`API KEY ${apiKey} 已查询过,跳过此次查询`);
|
||||
continue;
|
||||
}
|
||||
queriedApiKeys.push(apiKey);
|
||||
|
||||
// 使用 await 关键字等待 checkBilling 的结果
|
||||
let data = await checkBilling(apiKey, apiUrl);
|
||||
|
||||
data = data.map(item => {
|
||||
if (item === undefined || item === null) {
|
||||
return 'Not Found.'
|
||||
} else {
|
||||
return item;
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
let row = document.createElement("tr");
|
||||
|
||||
checkBilling(apiKey, apiUrl).then((data) => {
|
||||
data = data.map(item => {
|
||||
if (item === undefined) {
|
||||
return 'Not Found.'
|
||||
} else {
|
||||
return item
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
let row = document.createElement("tr");
|
||||
|
||||
let serialNumberCell = document.createElement("td"); // 创建序列号单元格
|
||||
serialNumberCell.textContent = serialNumber; // 设置序列号文本
|
||||
row.appendChild(serialNumberCell); // 将序列号单元格添加到行中
|
||||
|
||||
let apiKeyCell = document.createElement("td");
|
||||
apiKeyCell.textContent = apiKey.replace(/^(.{10}).*(.{8})$/, "$1***$2");
|
||||
row.appendChild(apiKeyCell);
|
||||
|
||||
console.log('查看查询结果', data); // 添加 console.log 以查看 data 的值
|
||||
|
||||
if (data[0] === undefined) {
|
||||
let errorMessageCell = document.createElement("td");
|
||||
errorMessageCell.colSpan = "8";
|
||||
errorMessageCell.classList.add("status-error");
|
||||
errorMessageCell.textContent = "不正确或已失效的API-KEY";
|
||||
row.appendChild(errorMessageCell);
|
||||
} else {
|
||||
let sensitiveIdResult = document.createElement("td");
|
||||
sensitiveIdResult.textContent = data[0];
|
||||
row.appendChild(sensitiveIdResult);
|
||||
}
|
||||
tableBody.appendChild(row);
|
||||
|
||||
if (i === apiKeys.length - 1) {
|
||||
queriedApiKeys = [];
|
||||
}
|
||||
serialNumber++; // 增加序列号
|
||||
h2.style.display = 'block';
|
||||
table.style.display = 'table';
|
||||
|
||||
button.textContent = "查询";
|
||||
button.disabled = false;
|
||||
button.classList.remove("loading")
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
let apiUrlSelect = document.getElementById("api-url-select");
|
||||
let customUrlInput = document.getElementById("custom-url-input");
|
||||
|
||||
apiUrlSelect.addEventListener("change", function () {
|
||||
if (apiUrlSelect.value === "custom") {
|
||||
customUrlInput.style.display = "inline-block";
|
||||
customUrlInput.style.marginTop = "5px";
|
||||
} else {
|
||||
customUrlInput.style.display = "none";
|
||||
}
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user