https://account.siliconflow.cn/login?redirect=https%3A%2F%2Fcloud.siliconflow.cn&invitation=sf
检测有效
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>批量检测账号有效性</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
margin: 0;
padding: 20px;
background-color: #f0f2f5;
color: #333;
}
.container {
max-width: 800px;
margin: 0 auto;
background-color: #fff;
padding: 30px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
h1 {
color: #2c3e50;
text-align: center;
margin-bottom: 30px;
}
.input-section {
margin-bottom: 20px;
}
.separator-options {
margin-bottom: 15px;
padding: 10px;
background-color: #f8f9fa;
border-radius: 4px;
}
.separator-options label {
margin-right: 15px;
cursor: pointer;
}
.instructions {
margin: 20px 0;
padding: 15px;
background-color: #fff3cd;
border-left: 4px solid #ffc107;
border-radius: 4px;
}
.instructions h3 {
margin-top: 0;
color: #856404;
}
.instructions ul {
margin: 10px 0;
padding-left: 20px;
}
.instructions li {
margin-bottom: 5px;
}
textarea {
width: 100%;
height: 200px;
margin-bottom: 20px;
padding: 15px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
resize: vertical;
}
button {
display: block;
width: 100%;
padding: 12px;
background-color: #3498db;
color: #fff;
border: none;
border-radius: 4px;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s;
}
button:hover {
background-color: #2980b9;
}
button:disabled {
background-color: #95a5a6;
cursor: not-allowed;
}
.results {
margin-top: 30px;
}
.results h2 {
color: #2c3e50;
margin-bottom: 10px;
}
.results-content {
background-color: #f9f9f9;
padding: 15px;
border-radius: 4px;
border: 1px solid #ddd;
font-size: 14px;
max-height: 300px;
overflow-y: auto;
}
#validResults {
border-left: 4px solid #2ecc71;
white-space: pre-wrap;
}
#invalidResults {
border-left: 4px solid #e74c3c;
}
.invalid-token {
background-color: #ffecec;
padding: 12px;
margin-bottom: 12px;
border-radius: 4px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.invalid-token-content {
display: flex;
flex-direction: column;
}
.invalid-token-token {
font-family: monospace;
background-color: #fff;
padding: 6px;
border-radius: 3px;
margin-bottom: 6px;
border: 1px solid #ffcccb;
word-break: break-all;
}
.invalid-token-message {
color: #c0392b;
font-weight: bold;
}
.loader {
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
border-radius: 50%;
width: 20px;
height: 20px;
animation: spin 1s linear infinite;
display: inline-block;
vertical-align: middle;
margin-right: 10px;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.copy-button {
background-color: #27ae60;
margin-top: 10px;
}
.copy-button:hover {
background-color: #2ecc71;
}
</style>
</head>
<body>
<div class="container">
<h1>硅基流动Token有效性检测</h1>
<div class="instructions">
<h3>使用说明</h3>
<ul>
<li>支持多种输入格式:
<ul>
<li>使用逗号分隔的token(推荐)</li>
<li>每行一个token</li>
<li>使用空格分隔的token</li>
</ul>
</li>
<li>自动过滤无效格式和undefined值</li>
<li>点击"检测账号"按钮开始检测</li>
<li>检测完成后可以复制有效账号</li>
</ul>
</div>
<div class="separator-options">
<label>
<input type="radio" name="separator" value="comma" checked> 逗号分隔
</label>
<label>
<input type="radio" name="separator" value="newline"> 换行分隔
</label>
<label>
<input type="radio" name="separator" value="space"> 空格分隔
</label>
</div>
<textarea id="tokens" placeholder="请输入sk token,用逗号分隔"></textarea>
<button id="checkButton" onclick="checkTokens()">检测账号</button>
<div class="results">
<h2>有效账号 (包含余额)</h2>
<div id="validResults" class="results-content"></div>
<button id="copyButton" class="copy-button" onclick="copyValidTokens()"
style="display: none;">复制所有有效账号</button>
<h2>无效账号</h2>
<div id="invalidResults" class="results-content"></div>
</div>
</div>
<script>
async function checkTokens() {
const tokensTextarea = document.getElementById('tokens');
const checkButton = document.getElementById('checkButton');
const validResults = document.getElementById('validResults');
const invalidResults = document.getElementById('invalidResults');
const copyButton = document.getElementById('copyButton');
// 获取选中的分隔符
const separator = document.querySelector('input[name="separator"]:checked').value;
let tokens;
// 根据选择的分隔符分割输入
switch (separator) {
case 'newline':
tokens = tokensTextarea.value.split('\n');
break;
case 'comma':
tokens = tokensTextarea.value.split(',');
break;
case 'space':
tokens = tokensTextarea.value.split(/\s+/);
break;
default:
tokens = tokensTextarea.value.split(','); // 默认使用逗号分隔
}
// 增强的过滤和清理逻辑
tokens = tokens
.map(token => token.trim())
.filter(token => {
return token !== '' &&
token !== 'undefined' &&
token !== undefined &&
token !== null &&
token.startsWith('sk-'); // 确保token格式正确
});
if (tokens.length === 0) {
alert('请输入至少一个有效的token');
return;
}
checkButton.disabled = true;
checkButton.innerHTML = '<span class="loader"></span>检测中...';
validResults.textContent = '';
invalidResults.innerHTML = '';
copyButton.style.display = 'none';
try {
const results = await Promise.all(tokens.map(checkToken));
const validTokens = results
.filter(r => r.isValid)
.map(r => `${r.token} (余额: ${r.balance})`);
const invalidTokens = results.filter(r => !r.isValid);
validResults.textContent = validTokens.join('\n');
invalidTokens.forEach(result => {
const div = document.createElement('div');
div.className = 'invalid-token';
div.innerHTML = `
<div class="invalid-token-content">
<div class="invalid-token-token">${result.token}</div>
<div class="invalid-token-message">${result.message}</div>
</div>
`;
invalidResults.appendChild(div);
});
if (validTokens.length > 0) {
copyButton.style.display = 'block';
}
} catch (error) {
console.error('检测过程出错:', error);
alert('检测过程出现错误,请重试');
} finally {
checkButton.disabled = false;
checkButton.textContent = '检测账号';
}
}
async function checkToken(token) {
try {
const response = await fetch('https://api.siliconflow.cn/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) CherryStudio/0.8.7 Chrome/120.0.6099.291 Electron/28.3.3 Safari/537.36',
'Accept': 'application/json',
'Content-Type': 'application/json',
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120"',
'x-stainless-os': 'Unknown',
'x-stainless-lang': 'js',
'sec-ch-ua-mobile': '?0',
'x-stainless-package-version': '4.59.0',
'x-stainless-runtime': 'browser:chrome',
'x-stainless-arch': 'unknown',
'x-stainless-runtime-version': '120.0.6099',
'x-api-key': token,
'sec-ch-ua-platform': 'macOS',
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Accept-Language': 'zh-CN'
},
body: JSON.stringify({
"model": "Qwen/Qwen2.5-72B-Instruct",
"messages": [
{
"role": "user",
"content": "hi"
}
],
"max_tokens": 100,
"stream": false
})
});
if (response.ok) {
const balanceResponse = await fetch('https://api.siliconflow.cn/v1/user/info', {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
});
const balanceData = await balanceResponse.json();
const balance = balanceData.data.totalBalance;
return { token, isValid: true, balance };
} else {
const errorData = await response.json();
return { token, isValid: false, message: errorData.message };
}
} catch (error) {
return { token, isValid: false, message: `请求失败: ${error.message}` };
}
}
function copyValidTokens() {
const validResults = document.getElementById('validResults');
const tokens = validResults.textContent
.split('\n')
.map(line => line.split(' ')[0]) // 只获取token部分
.filter(token => token.startsWith('sk-')); // 确保只复制有效的token
if (tokens.length === 0) {
alert('没有找到有效的token可复制');
return;
}
const textArea = document.createElement('textarea');
textArea.value = tokens.join('\n');
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
alert('有效账号已复制到剪贴板');
} catch (err) {
console.error('复制失败:', err);
alert('复制失败,请手动复制');
} finally {
document.body.removeChild(textArea);
}
}
// 添加自动格式化功能
document.getElementById('tokens').addEventListener('paste', function(e) {
// 延迟执行以确保内容已经粘贴
setTimeout(() => {
const content = this.value;
// 自动检测和清理输入格式
let cleanedContent = content
.replace(/\s+/g, ',') // 将所有空白字符替换为逗号
.split(',')
.map(token => token.trim())
.filter(token => token && token !== 'undefined' && token.startsWith('sk-'))
.join(',');
this.value = cleanedContent;
// 自动选择合适的分隔符
if (cleanedContent.includes(',')) {
document.querySelector('input[name="separator"][value="comma"]').checked = true;
}
}, 0);
});
// 添加输入框提示更新功能
document.querySelectorAll('input[name="separator"]').forEach(radio => {
radio.addEventListener('change', function() {
const textarea = document.getElementById('tokens');
switch (this.value) {
case 'newline':
textarea.placeholder = '请输入sk token,每行一个';
break;
case 'comma':
textarea.placeholder = '请输入sk token,用逗号分隔';
break;
case 'space':
textarea.placeholder = '请输入sk token,用空格分隔';
break;
}
});
});
</script>
</body>
</html>