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>