建立一个 Fuclaude Shared Chat多账号轮循的简易教程

一、创建KV
1、查询复制session_keys:https://demo.fuclaude.com//api/auth/session
2、具体操作
Workers 和 Pages→KV→创建命名空间→名称:SESSION_KEYS→密钥:session_keys_list→值:[“session_key1”, “session_key2”, “session_key3”]
二、cloudflare创建workers、kv
1、创建workers

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

async function handleRequest(request) {
  try {
    const sessionKeysJson = await SESSION_KEYS.get('session_keys_list')
    if (!sessionKeysJson) {
      throw new Error('No session keys available')
    }
    const sessionKeys = JSON.parse(sessionKeysJson)
    if (!Array.isArray(sessionKeys) || sessionKeys.length === 0) {
      throw new Error('Invalid session keys list')
    }

    let currentIndex = parseInt(await SESSION_KEYS.get('current_index') || '0')
    let validKeyFound = false
    let sessionKey

    for (let i = 0; i < sessionKeys.length; i++) {
      sessionKey = sessionKeys[currentIndex]
      if (isValidSessionKey(sessionKey)) {
        validKeyFound = true
        break
      }
      // 如果当前key无效,尝试下一个
      currentIndex = (currentIndex + 1) % sessionKeys.length
    }

    if (!validKeyFound) {
      throw new Error('No valid session keys found')
    }

    // 更新索引
    currentIndex = (currentIndex + 1) % sessionKeys.length
    await SESSION_KEYS.put('current_index', currentIndex.toString())

    // 构造重定向URL
    const redirectUrl = `https://demo.xxxx.com/login_token?session_key=${sessionKey}`
    return Response.redirect(redirectUrl, 302)
  } catch (error) {
    console.error('Error in handleRequest:', error)
    return new Response(`Error: ${error.message}`, { status: 500 })
  }
}

function isValidSessionKey(key) {
  // 这里添加检查session key有效性的逻辑
  // 例如,检查key的格式是否正确
  return typeof key === 'string' && key.startsWith('sk-ant-sid01-') && key.length > 20
}

编辑代码(替换里边的demo.xxxx.com,demo.xxxx.com为自己创建的fuclaude,dns解析至demo)→点击部署。workers设置→触发器创建claude.xxxx.com(xxxx.com为域名)
最后session_key判断是否正确网友可以续写,这里暂时铺垫……
2、 KV 命名空间绑定
workers→设置→变量→ KV 命名空间绑定,输入变量名称、KV 命名空间均为: SESSION_KEYS。

最后打开https://claude.xxxx.com狂欢吧


【v0.2.8】闲来无事搓的一个小玩具
建立一个 Fuclaude Shared Chat 的第二步

76 Likes

虽然看不懂 但是我是第一

8 Likes

感谢分享

1 Like

太强了佬

1 Like

不错,,

3 Likes

mark,感谢佬

3 Likes

感谢

2 Likes

感谢大佬

Added #https:linuxdottopic1

试试

不错

mark,感谢佬

Claude, #Fuclaude添加#https:linuxdottopic1移除

1 Like

能不能用这个功能验证啊,如果 key 过期或错误,应该不能生成登录接口吧?
我自己的 oai share 站会在更新 token 后用类似方法验证

curl 'https://demo.fuclaude.com/manage-api/auth/oauth_token' \                                   
-H 'Content-Type: application/json' \
-d '{                                
    "session_key": "sk-ant-sid01-xxx"
}'

返回 => {"detail":"invalid sessionKey"}%
2 Likes

感谢分享。

按你这个修改了代码

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

const CACHE_TTL = 300 // 缓存有效期5分钟

async function handleRequest(request) {
  try {
    // 解析请求体
    let userProvidedKey = null
    if (request.method === 'POST') {
      const body = await request.json()
      userProvidedKey = body.session_key
    }

    // 如果用户提供了key,先验证它
    if (userProvidedKey) {
      if (await isValidSessionKey(userProvidedKey)) {
        return redirectWithKey(userProvidedKey)
      } else {
        return new Response('Provided session key is invalid', { status: 400 })
      }
    }

    const sessionKeysJson = await SESSION_KEYS.get('session_keys_list')
    if (!sessionKeysJson) {
      throw new Error('No session keys available')
    }
    const sessionKeys = JSON.parse(sessionKeysJson)
    if (!Array.isArray(sessionKeys) || sessionKeys.length === 0) {
      throw new Error('Invalid session keys list')
    }

    let currentIndex = parseInt(await SESSION_KEYS.get('current_index') || '0')
    let validKeyFound = false
    let sessionKey

    // 检查缓存的有效key
    const cachedValidKey = await SESSION_KEYS.get('valid_key')
    if (cachedValidKey) {
      console.log('Using cached valid key')
      return redirectWithKey(cachedValidKey)
    }

    for (let i = 0; i < sessionKeys.length; i++) {
      sessionKey = sessionKeys[currentIndex]
      if (await isValidSessionKey(sessionKey)) {
        validKeyFound = true
        // 缓存有效的key
        await SESSION_KEYS.put('valid_key', sessionKey, {expirationTtl: CACHE_TTL})
        break
      }
      console.log(`Key ${sessionKey} is invalid, trying next`)
      currentIndex = (currentIndex + 1) % sessionKeys.length
    }

    if (!validKeyFound) {
      throw new Error('No valid session keys found')
    }

    // 更新索引
    await SESSION_KEYS.put('current_index', currentIndex.toString())

    return redirectWithKey(sessionKey)
  } catch (error) {
    console.error('Error in handleRequest:', error)
    return new Response(`Internal Server Error: ${error.message}`, { status: 500 })
  }
}

async function isValidSessionKey(key) {
  if (typeof key !== 'string' || !key.startsWith('sk-ant-sid01-') || key.length <= 20) {
    return false
  }

  try {
    const response = await fetch('https://demo.fuclaude.com/manage-api/auth/oauth_token', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ session_key: key })
    })

    const data = await response.json()
    return !data.detail || data.detail !== 'invalid sessionKey'
  } catch (error) {
    console.error('Error validating session key:', error)
    return false
  }
}

function redirectWithKey(sessionKey) {
  const redirectUrl = `https://demo.xxxx.com/login_token?session_key=${sessionKey}`
  return Response.redirect(redirectUrl, 302)
}
5 Likes

感恩的心,感谢有你

没有识别到KV,请问可能是啥原因呢?
提示:Error: SESSION_KEYS.get is not a function


没有绑定空间

1 Like

发现了,放错位置了 :rofl: