硅基流动Token有效性批量检测

搞了个硅基流动Token有效性批量检测的页面,方便一件筛选有效的token

<!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;
        }

        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>
        <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 tokens = tokensTextarea.value.split('\n').filter(token => token.trim() !== '');

            if (tokens.length === 0) {
                alert('请输入至少一个token');
                return;
            }

            checkButton.disabled = true;
            checkButton.innerHTML = '<span class="loader"></span>检测中...';
            validResults.textContent = '';
            invalidResults.innerHTML = '';
            copyButton.style.display = 'none';

            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';
            }

            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]);
            const textArea = document.createElement('textarea');
            textArea.value = tokens.join('\n');
            document.body.appendChild(textArea);
            textArea.select();
            document.execCommand('copy');
            document.body.removeChild(textArea);
            alert('有效账号已复制到剪贴板');
        }
    </script>
</body>

</html>
31 个赞

还可以加上 api 剩余额度请求

3 个赞

主打一个听劝,加上了

3 个赞

太强了佬友!

感谢大佬分享!

感谢大佬的分享

还可以,建议左右各一个大框,不然太小了,不好查看啊。

有点厉害支持~~

感谢佬友tieba_013

牛的牛的!!

佬们最常用硅基的是什么模型?之前注册后吃灰好久了,好用不

支持支持 这得注册多少阿

话说为什么要chat一次,直接info不行吗

可以的,我是想知道这些key为啥不能用,你可以根据个人需要改

用佬的源码,让ai改了一下,搞了个cf worker版本

addEventListener('fetch', function(event) {
    event.respondWith(handleRequest(event.request));
  });
  
  function handleRequest(request) {
    if (request.method === 'OPTIONS') {
      return handleOptions(request);
    }
  
    if (request.method === 'POST') {
      return handlePost(request);
    }
  
    return new Response(getHtmlContent(), {
      headers: {
        'content-type': 'text/html;charset=UTF-8',
        'Access-Control-Allow-Origin': '*',
        'Cache-Control': 'no-cache',
      },
    });
  }
  
  function handlePost(request) {
    return request.json()
      .then(function(data) {
        var tokens = data.tokens || [];
        if (!tokens.length) {
          throw new Error('No tokens provided');
        }
        
        return Promise.all(tokens.map(function(token) {
          return checkToken(token);
        }));
      })
      .then(function(results) {
        return new Response(JSON.stringify(results), {
          headers: {
            'content-type': 'application/json',
            'Access-Control-Allow-Origin': '*',
            'Cache-Control': 'no-cache',
          },
        });
      })
      .catch(function(error) {
        return new Response(JSON.stringify({
          error: error.message || 'Unknown error occurred'
        }), {
          status: 400,
          headers: {
            'content-type': 'application/json',
            'Access-Control-Allow-Origin': '*',
            'Cache-Control': 'no-cache',
          },
        });
      });
  }
  
  function checkToken(token) {
    var checkUrl = 'https://api.siliconflow.cn/v1/chat/completions';
    var balanceUrl = 'https://api.siliconflow.cn/v1/user/info';
    
    var requestOptions = {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer ' + token,
        'Content-Type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
        'Accept': 'application/json',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'cross-site'
      },
      body: JSON.stringify({
        "model": "Qwen/Qwen2.5-72B-Instruct",
        "messages": [{"role": "user", "content": "hi"}],
        "max_tokens": 100,
        "stream": false
      })
    };
  
    return fetch(checkUrl, requestOptions)
      .then(function(response) {
        if (response.ok) {
          return fetch(balanceUrl, {
            headers: {
              'Authorization': 'Bearer ' + token,
              'Accept': 'application/json',
              'Accept-Language': 'zh-CN,zh;q=0.9'
            }
          })
          .then(function(balanceResponse) {
            if (!balanceResponse.ok) {
              throw new Error('Balance check failed');
            }
            return balanceResponse.json();
          })
          .then(function(balanceData) {
            return {
              token: token,
              isValid: true,
              balance: balanceData.data.totalBalance
            };
          })
          .catch(function() {
            return {
              token: token,
              isValid: true,
              balance: '获取余额失败'
            };
          });
        }
        
        return response.json()
          .then(function(errorData) {
            return {
              token: token,
              isValid: false,
              message: errorData.message || '验证失败'
            };
          })
          .catch(function() {
            return {
              token: token,
              isValid: false,
              message: '验证请求失败'
            };
          });
      })
      .catch(function(error) {
        return {
          token: token,
          isValid: false,
          message: '网络请求失败: ' + error.message
        };
      });
  }
  
  function handleOptions(request) {
    return new Response(null, {
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
        'Access-Control-Allow-Headers': 'Content-Type, Authorization',
        'Access-Control-Max-Age': '86400',
      },
    });
  }
  function getHtmlContent() {
    return `<!DOCTYPE html>
  <html lang="zh-CN">
  <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>硅基流动Token检测工具</title>
      <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🚀</text></svg>">
      <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=JetBrains+Mono:wght@400;600&display=swap" rel="stylesheet">
      <script src="https://cdn.jsdelivr.net/npm/[email protected]/build/three.min.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.net.min.js"></script>
      <style>
          :root {
              --primary: #64ffda;
              --bg-dark: #0a192f;
              --text: #ccd6f6;
              --error: #ff3b30;
              --success: #64ffda;
          }
  
          * {
              margin: 0;
              padding: 0;
              box-sizing: border-box;
          }
  
          body {
              font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
              background-color: var(--bg-dark);
              color: var(--text);
              line-height: 1.6;
              min-height: 100vh;
              overflow-x: hidden;
          }
  
          #vanta-canvas {
              position: fixed;
              top: 0;
              left: 0;
              width: 100%;
              height: 100%;
              z-index: 0;
          }
  
          .container {
              position: relative;
              z-index: 1;
              max-width: 1000px;
              margin: 0 auto;
              padding: 40px 20px;
          }
  
          .glass-panel {
              background: rgba(10, 25, 47, 0.7);
              backdrop-filter: blur(10px);
              border-radius: 24px;
              padding: 40px;
              border: 1px solid rgba(100, 255, 218, 0.1);
              box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
          }
  
          h1 {
              font-size: 2.5rem;
              text-align: center;
              margin-bottom: 40px;
              color: var(--primary);
              text-shadow: 0 0 20px rgba(100, 255, 218, 0.3);
              font-weight: 600;
          }
  
          .input-group {
              margin-bottom: 30px;
          }
  
          textarea {
              width: 100%;
              height: 200px;
              background: rgba(255, 255, 255, 0.05);
              border: 1px solid rgba(100, 255, 218, 0.2);
              border-radius: 12px;
              padding: 20px;
              color: var(--text);
              font-family: 'JetBrains Mono', monospace;
              font-size: 14px;
              resize: vertical;
              transition: all 0.3s ease;
          }
  
          textarea:focus {
              outline: none;
              border-color: var(--primary);
              box-shadow: 0 0 20px rgba(100, 255, 218, 0.1);
          }
  
          .button-container {
              text-align: center;
              margin: 30px 0;
          }
  
          button {
              background: transparent;
              color: var(--primary);
              border: 2px solid var(--primary);
              padding: 12px 30px;
              border-radius: 8px;
              font-size: 16px;
              font-weight: 600;
              cursor: pointer;
              transition: all 0.3s ease;
              position: relative;
              overflow: hidden;
          }
  
          button:hover {
              background: rgba(100, 255, 218, 0.1);
              transform: translateY(-2px);
              box-shadow: 0 5px 15px rgba(100, 255, 218, 0.2);
          }
  
          button:disabled {
              opacity: 0.6;
              cursor: not-allowed;
              transform: none;
          }
  
          .progress-container {
              margin: 20px 0;
              text-align: center;
              display: none;
          }
  
          .progress-bar {
              width: 100%;
              height: 6px;
              background: rgba(255, 255, 255, 0.1);
              border-radius: 3px;
              overflow: hidden;
              margin-bottom: 10px;
          }
  
          .progress {
              width: 0%;
              height: 100%;
              background: linear-gradient(90deg, var(--primary) 0%, #4facfe 100%);
              transition: width 0.3s ease;
              border-radius: 3px;
          }
  
          .progress-text {
              font-size: 14px;
              color: var(--text);
          }
  
          .results {
              margin-top: 40px;
          }
  
          .results h2 {
              font-size: 1.5rem;
              color: var(--text);
              margin-bottom: 20px;
              display: flex;
              align-items: center;
              gap: 10px;
          }
  
          .results h2::before {
              content: '';
              display: block;
              width: 4px;
              height: 24px;
              background: var(--primary);
              border-radius: 2px;
          }
  
          .results-content {
              background: rgba(255, 255, 255, 0.03);
              border-radius: 12px;
              padding: 20px;
              margin-bottom: 20px;
              border: 1px solid rgba(255, 255, 255, 0.1);
          }
  
          #validResults {
              font-family: 'JetBrains Mono', monospace;
              white-space: pre-wrap;
              color: var(--success);
              word-break: break-all;
          }
  
          .invalid-token {
              background: rgba(255, 59, 48, 0.1);
              border-radius: 8px;
              padding: 15px;
              margin-bottom: 15px;
              border-left: 4px solid var(--error);
              animation: slideIn 0.3s ease-out;
          }
  
          .loader {
              display: inline-block;
              width: 20px;
              height: 20px;
              border: 3px solid rgba(100, 255, 218, 0.3);
              border-radius: 50%;
              border-top-color: var(--primary);
              animation: spin 1s linear infinite;
              margin-right: 10px;
              vertical-align: middle;
          }
  
          .toast {
              position: fixed;
              bottom: 20px;
              right: 20px;
              padding: 12px 24px;
              background: rgba(100, 255, 218, 0.9);
              color: var(--bg-dark);
              border-radius: 8px;
              font-weight: 600;
              transform: translateY(100px);
              opacity: 0;
              transition: all 0.3s ease;
              z-index: 1000;
          }
  
          .toast.show {
              transform: translateY(0);
              opacity: 1;
          }
  
          @keyframes spin {
              to { transform: rotate(360deg); }
          }
  
          @keyframes slideIn {
              from {
                  opacity: 0;
                  transform: translateX(-10px);
              }
              to {
                  opacity: 1;
                  transform: translateX(0);
              }
          }
  
          @media (max-width: 768px) {
              .container {
                  padding: 20px;
              }
  
              .glass-panel {
                  padding: 20px;
              }
  
              h1 {
                  font-size: 2rem;
              }
  
              button {
                  width: 100%;
              }
          }
      </style>
  </head>
  <body>
      <div id="vanta-canvas"></div>
      <div class="container">
          <div class="glass-panel">
              <h1>硅基流动Token检测工具</h1>
              <div class="input-group">
                  <textarea id="tokens" placeholder="请在此输入sk token,每行一个"></textarea>
              </div>
              <div class="progress-container">
                  <div class="progress-bar">
                      <div class="progress"></div>
                  </div>
                  <div class="progress-text">检测进度: <span id="progress-percentage">0</span>%</div>
              </div>
              <div class="button-container">
                  <button id="checkButton" onclick="checkTokens()">开始检测</button>
              </div>
              <div class="results">
                  <h2>有效账号</h2>
                  <div id="validResults" class="results-content"></div>
                  <button id="copyButton" onclick="copyValidTokens()" style="display: none;">复制有效账号</button>
                  <h2>无效账号</h2>
                  <div id="invalidResults" class="results-content"></div>
              </div>
          </div>
      </div>
      <div id="toast" class="toast"></div>
  
      <script>
          window.addEventListener('DOMContentLoaded', function() {
              VANTA.NET({
                  el: "#vanta-canvas",
                  mouseControls: true,
                  touchControls: true,
                  gyroControls: false,
                  minHeight: 200.00,
                  minWidth: 200.00,
                  scale: 1.00,
                  scaleMobile: 1.00,
                  color: 0x64ffda,
                  backgroundColor: 0x0a192f,
                  points: 10.00,
                  maxDistance: 20.00,
                  spacing: 20.00
              });
          });
  
          function showToast(message, duration) {
              var toast = document.getElementById('toast');
              toast.textContent = message;
              toast.classList.add('show');
              setTimeout(function() {
                  toast.classList.remove('show');
              }, duration || 3000);
          }
  
          function checkTokens() {
              var tokensTextarea = document.getElementById('tokens');
              var checkButton = document.getElementById('checkButton');
              var validResults = document.getElementById('validResults');
              var invalidResults = document.getElementById('invalidResults');
              var copyButton = document.getElementById('copyButton');
              var progressContainer = document.querySelector('.progress-container');
              var progressBar = document.querySelector('.progress');
              var progressText = document.getElementById('progress-percentage');
  
              var tokens = tokensTextarea.value.split('\\n').filter(function(token) {
                  return token.trim() !== '';
              });
  
              if (!tokens.length) {
                  showToast('请输入至少一个token', 2000);
                  return;
              }
  
              checkButton.disabled = true;
              checkButton.innerHTML = '<span class="loader"></span>检测中...';
              validResults.textContent = '';
              invalidResults.innerHTML = '';
              copyButton.style.display = 'none';
              progressContainer.style.display = 'block';
              progressBar.style.width = '0%';
              progressText.textContent = '0';
  
              var completed = 0;
              var results = [];
  
              function processTokens(tokens, batchSize) {
                  var batches = [];
                  for (var i = 0; i < tokens.length; i += batchSize) {
                      batches.push(tokens.slice(i, i + batchSize));
                  }
  
                  return batches.reduce(function(promise, batch) {
                      return promise.then(function() {
                          return Promise.all(batch.map(function(token) {
                              return fetch(window.location.href, {
                                  method: 'POST',
                                  headers: {
                                      'Content-Type': 'application/json',
                                  },
                                  body: JSON.stringify({ tokens: [token] })
                              })
                              .then(function(response) { return response.json(); })
                              .then(function(result) {
                                  completed++;
                                  var progress = Math.round((completed / tokens.length) * 100);
                                  progressBar.style.width = progress + '%';
                                  progressText.textContent = progress;
                                  return result[0];
                              });
                          }));
                      }).then(function(batchResults) {
                          results = results.concat(batchResults);
                          updateResults(results);
                      });
                  }, Promise.resolve());
              }
  
              function updateResults(results) {
                  var validTokens = results.filter(function(r) { 
                      return r.isValid; 
                  }).map(function(r) {
                      return r.token + ' (余额: ' + r.balance + ')';
                  });
  
                  var invalidTokens = results.filter(function(r) { 
                      return !r.isValid; 
                  });
  
                  validResults.textContent = validTokens.join('\\n');
                  invalidResults.innerHTML = '';
  
                  invalidTokens.forEach(function(result) {
                      var 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';
                  }
              }
  
              processTokens(tokens, 3)
                  .then(function() {
                      showToast('检测完成!', 2000);
                  })
                  .catch(function(error) {
                      showToast('检测过程出错: ' + error.message, 3000);
                  })
                  .finally(function() {
                      checkButton.disabled = false;
                      checkButton.textContent = '开始检测';
                      progressContainer.style.display = 'none';
                  });
          }
  
          function copyValidTokens() {
              var validResults = document.getElementById('validResults');
              var tokens = validResults.textContent.split('\\n').map(function(line) {
                  return line.split(' ')[0];
              });
              var textArea = document.createElement('textarea');
              textArea.value = tokens.join('\\n');
              document.body.appendChild(textArea);
              textArea.select();
              document.execCommand('copy');
              document.body.removeChild(textArea);
              showToast('有效账号已复制到剪贴板', 2000);
          }
      </script>
  </body>
  </html>`;
  }```
6 个赞

这个好,救了命了

厉害啊佬友

https://linux.do/t/topic/290550
试试这个tieba_087

大佬太强了

太好用了