cloudflare workers的gemini代理脚本,支持多个账号随机调用

  1. 创建一个命名空间 gemini-load-balance,然后添加条目
    key为API_KEYS
    value为["xxxxxxxx","xxxxxxxx",...],其中value的元素是一个个gemini key
  2. 创建workers脚本,编辑代码输入下面的代码,然后部署
// API 密钥和主机
const API_HOST = 'generativelanguage.googleapis.com';
const api_secret = "自定义apikey";

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  // 处理 OPTIONS 请求
  if (request.method === 'OPTIONS') {
    return new Response(null, {
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE',
        'Access-Control-Allow-Headers': 'Content-Type, Accept, x-goog-api-key',
        'Access-Control-Max-Age': '86400' // 缓存 OPTIONS 响应 1 天
      },
      status: 204
    });
  }

  const url = new URL(request.url);
  const path = url.pathname;
  
  const keyParam = url.searchParams.get('key');
  const apiKeyHeader = request.headers.get('x-goog-api-key');
  
  let key = '';
  if(keyParam) {
    key = keyParam
  } else if (apiKeyHeader) {
    key = apiKeyHeader
  }
  console.log(key)

  // API 密钥验证
  if (key === '' || key !== api_secret) {
    return new Response(JSON.stringify({ error: 'Unauthorized' }), {
      status: 401,
      headers: { 'Content-Type': 'application/json' }
    });
  }

  // 获取 API 密钥数组
  const API_KEYS = JSON.parse(await api_keys.get('API_KEYS') || '[]'); // 确保处理 API_KEYS 缺失的情况

  // 如果没有配置 API Key数组, 直接使用 api_secret
  let API_KEY = api_secret;

  if (API_KEYS.length > 0) {
    API_KEY = selectApiKey(API_KEYS);
  }

  // 记录使用的 API 密钥
  console.log(`Using API KEY: ${API_KEY}`);

  const newHeaders = new Headers(request.headers);

  // 修改请求
  url.hostname = API_HOST;
  if (path.includes(":generateContent")) {
    url.searchParams.set('key', API_KEY);
    newHeaders.set('x-goog-api-key', API_KEY); // 设置新的请求头
  }
  if (path.includes(":streamGenerateContent")) {
    newHeaders.set('x-goog-api-key', API_KEY); // 设置新的请求头
    url.searchParams.set('key', API_KEY);
  }
  if (path.includes("models")) {
    url.searchParams.set("key", API_KEY);
  }

  const modifiedRequest = new Request(url.toString(), {
    method: request.method,
    headers: newHeaders,
    body: request.body,
    redirect: 'follow'
  });

  try {
    const response = await fetch(modifiedRequest);
    return new Response(response.body, response);
  } catch (error) {
    return new Response(JSON.stringify({ error: error.message }), {
      status: 500,
      headers: { 'Content-Type': 'application/json' }
    });
  }
}

function selectApiKey(apiKeys) {
  // 随机选择一个 API 密钥
  const randomIndex = Math.floor(Math.random() * apiKeys.length);
  return apiKeys[randomIndex];
}
  1. 设置里面添加kv命名空间绑定,变量名称设置为api_keys,选择刚才创建的gemini-load-balance命名空间
  2. 搞定,还有就是建议不要用香港节点调用,cf可能会用香港的ip调用gemini出现地区不支持。
温馨提示: 本文最后更新于2024-10-27 13:59:27,某些文章具有时效性,若有错误或已失效,请在下方 留言或联系 Macfun-A very interesting site
© 版权声明
THE END
喜欢就支持一下吧
点赞14赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容