接力,基于cloudflare workers实现多账号accesstoken刷新,账号随机调用

本文基于上面这位佬的帖子,稍作修改,支持多个账号的accesstoken刷新以及账号的随机调用。

适合用户:

  • 拥有cloudflare账号
  • 拥有chatgpt plus订阅账号
  • 获取到账号的access_token和refresh_token

步骤:

  1. 获取账号refresh_token和access_token,可以参考奥特曼佬的帖子
  1. 在KV中创建命名空间,命名空间名字随便填写,然后添加

  2. 在刚才创建的命名空间中添加如下三个键值对

  • 键:at_array 值:["xxxxxxxx","xxxxxxxxx"...] ,数组是多个access_token
  • 键:rt_array 值:["xxxxxxxx","xxxxxxxxx"...],数组是多个refresh_token,与上面access_token一一对应,每一对是一个账号的rt和at
  • 键:auth_key 值:随便填,充当api_key的角色。
  1. 为worker绑定之前创建的命名空间,变量名称必须是 oai_global_variables

  2. 创建worker,部署如下代码:

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

function parseJwt(token) {
	const base64Url = token.split('.')[1]; // 获取载荷部分
	const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); // 将 Base64Url 转为 Base64
	const jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
		return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
	}).join(''));

	return JSON.parse(jsonPayload); // 返回载荷解析后的 JSON 对象
}

function isTokenExpired(token) {
	const payload = parseJwt(token);
	const currentTime = Math.floor(Date.now() / 1000); // 获取当前时间戳(秒)
	return payload.exp < currentTime; // 检查 token 是否过期
}

async function handleRequest(request) {
	// 1. 目标反代 URL
	const url = new URL(request.url);
	url.host = 'api.oaifree.com';

// 2. 获取 Authorization header
	const authHeader = request.headers.get('Authorization');
	const apikey = authHeader ? authHeader.split(' ')[1] : null;

// 3. 检查 token
	const auth_key = await oai_global_variables.get('auth_key')
	if (!apikey || apikey !== auth_key) {
		// 4. Token 验证失败
		return new Response('Unauthorized', { status: 401 });
	}

	// ------------ get at
	// 随机选择一个令牌并检查是否过期
	const jsontokens = await oai_global_variables.get('at_array'); // 这里假设令牌数组存储在'at_array'键下
	const jsonrefreshTokens = await oai_global_variables.get('rt_array'); // 刷新令牌数组存储在'rt_array'键下
	const tokens = JSON.parse(jsontokens);
	const refreshTokens = JSON.parse(jsonrefreshTokens);
	// 随机选择索引
	const randomIndex = Math.floor(Math.random() * tokens.length);
	let token = tokens[randomIndex];

	//const token = await oai_global_variables.get('at'); // 这里填入你的 JWT
	if (isTokenExpired(token)) {
		// 如果 Token 过期,执行获取新 Token 的逻辑
		const url = 'https://token.oaifree.com/api/auth/refresh';
		// @ts-ignore
		const refreshToken = refreshTokens[randomIndex]; // 获取对应的刷新令牌
		console.log(refreshToken);
		// const refreshToken = await oai_global_variables.get('rt');  // 实际情况下你可能会从某处获取这个值
		// 发送 POST 请求
		const response = await fetch(url, {
			method: 'POST',
			headers: {
				'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
			},
			body: `refresh_token=${refreshToken}`
		});
		// 检查响应状态
		if (response.ok) {
			const data = await response.json();
			// const token = data.access_token;
			// @ts-ignore
			// await oai_global_variables.put('at', token);
			const newToken = data.access_token;
			// 更新数组中的令牌
			tokens[randomIndex] = newToken;
			token = newToken;
			// 将更新后的数组存回 KV 数据库
			await oai_global_variables.put('at_array', JSON.stringify(tokens));
		} else {
			return response
		}
	}
	// 如果 Token 未过期,继续执行原来的逻
	// 5. 替换 token 并转发请求
	const modifiedHeaders = new Headers(request.headers);
	modifiedHeaders.set('Authorization', 'Bearer '+token);

// 创建新的请求对象以转发
	const newRequest = new Request(url, {
		method: request.method,
		headers: modifiedHeaders,
		body: request.body
	});

// 发送新的请求到目标 API
	const response = await fetch(newRequest);
	return response;
}

  1. 接下来就是愉快的调用。
    水个5分。美滋滋 :stuck_out_tongue_winking_eye:
22 个赞

写得很详细 :laughing:

3 个赞

哈哈哈,详细点好,小白也能学的会,顺便感谢佬的付出 ~~

2 个赞

等大佬接力,我就等大佬喂饭

2 个赞

好东西。
羡慕你们有多账号的

3 个赞

好的,教程看完了,请问一下“chatgpt plus”在哪领取?

1 个赞

找奥特曼领取,哈哈哈

哈哈,总共也就两个,一个是跟朋友合租,还有一个是以前撞出来的,就获取了refreshtoken :face_with_peeking_eye:

白嫖

1 个赞

牛逼 感谢

1 个赞

多个plus账号 已经阻挡99%的用户了

一个账号也可以用,支持多账号

哈哈哈 说到重点了plus已备好 等账号3级 拿个refresh_token

其实有其他方法可以获得rt,不过稍微麻烦一点,可以在论坛搜一下,有教程

错误 500

可以用啊,刚特地测试了没问题,或者大将军你在cf上测试打点log日志看下

引号看下去好像有点问题

好了= = 确实引号问题,我是直接 复制你那个引号 你改一下

“” “”