新建一个worker
addEventListener("fetch", (event) => {
event.respondWith(handleRequest(event.request, event));
});
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 对象
}
async function getOAuthLink(shareToken, YOUR_DOMAIN) {
const url = `https://${YOUR_DOMAIN}/api/auth/oauth_token`;
const response = await fetch(url, {
method: 'POST',
headers: {
'Origin': `https://${YOUR_DOMAIN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
share_token: shareToken
})
});
const data = await response.json();
return data.login_url;
}
function isTokenExpired(token) {
const payload = parseJwt(token);
const currentTime = Math.floor(Date.now() / 1000); // 获取当前时间戳(秒)
return payload.exp < currentTime; // 检查 token 是否过期
}
async function handleRequest(request, event) {
const requestURL = new URL(request.url);
const path = requestURL.pathname;
const check = await oai_global_variables.get('check');
if (check === '1' && userMessages.length > 0) {
// 检查是否是特定路由
if (path === "/backend-api/conversation") {
const requestBody = await request.json(); // 读取 JSON 请求体
const userMessages = requestBody.messages
.filter(
(msg) =>
msg.author.role === "user" && msg.content.content_type === "text"
)
.map((msg) => msg.content.parts.join(" "));
// 使用 OpenAI 的道德审核接口检查文本
const openaiApiKey = await oai_global_variables.get('OPENAI_API_KEY'); // 从环境变量获取 OpenAI API 密钥
const moderationResult = await checkContentForModeration(
userMessages,
openaiApiKey
);
if (moderationResult.shouldBlock) {
return new Response(
JSON.stringify({ detail: "公益不易,请珍惜账号喵!" }),
{
status: 451,
headers: { "Content-Type": "application/json" },
}
);
}
}
// 如果没有触发拦截,使用请求体创建新的请求对象并请求目标网站
requestURL.host = "new.oaifree.com";
const newRequest = new Request(requestURL, {
body: JSON.stringify(requestBody),
method: request.method,
headers: request.headers,
});
return fetch(newRequest);
}
// 检查路径是否匹配 "/auth/login_auth0"
if (path !== "/auth/login_auth0") {
requestURL.host = "new.oaifree.com";
return fetch(new Request(requestURL, request));
}
// 如果 Token 未过期,继续执行原来的逻辑
if (request.method === "POST") {
const formData = await request.formData();
const accountChoice = formData.get("account_choice");
// 根据选择获取对应的 access_token
const token = await oai_global_variables.get(`at${accountChoice}`);
if (isTokenExpired(token)) {
// 如果 Token 过期,执行获取新 Token 的逻辑
const url = "https://token.oaifree.com/api/auth/refresh";
const refreshToken = await oai_global_variables.get(`rt${accountChoice}`);
// 发送 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;
await oai_global_variables.put(`at${accountChoice}`, token);
} else {
return new Response("Error fetching access token", {
status: response.status,
});
}
}
const access_token = token;
const unique_name = formData.get("unique_name");
const site_limit = "";
const expires_in = "0";
const gpt35_limit = "-1";
const gpt4_limit = "-1";
const show_conversations = unique_name === "ccf666666" ? "true" : "false";
const reset_limit = "false";
const url = "https://chat.oaifree.com/token/register";
const body = new URLSearchParams({
unique_name,
access_token,
site_limit,
expires_in,
gpt35_limit,
gpt4_limit,
show_conversations,
reset_limit,
}).toString();
const apiResponse = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
body: body,
});
const respJson = await apiResponse.json();
const tokenKey =
"token_key" in respJson ? respJson.token_key : "未找到 Share_token";
const YOUR_DOMAIN = await oai_global_variables.get('YOUR_DOMAIN') || requestURL.host;
return Response.redirect(`https://${YOUR_DOMAIN}/auth/login_share?token=${tokenKey}`, 301)
} else {
const formHtml = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
.account-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 10px;
padding: 20px;
max-height: 80vh;
overflow-y: auto;
}
.account-square {
display: flex;
justify-content: center;
align-items: center;
border: 1px solid #ccc;
border-radius: 10px;
height: 150px;
cursor: pointer;
text-align: center;
transition: background-color 0.3s, transform 0.3s;
background-color: #0d8767;
}
.account-square:hover {
background-color: lightblue;
}
.account-square:active {
transform: scale(0.95);
}
.title {
font-size: 32px;
color: #2d333a;
text-align: center;
margin-top: 100px;
}
body {
display: flex;
justify-content: center;
align-items: center;
height: 90vh;
overflow: hidden;
font-family: Arial, sans-serif;
}
.main-container {
width: 100%;
max-width: 1000px;
}
.popup {
display: none;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
padding: 20px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
border-radius: 10px;
z-index: 1000;
}
.popup.active {
display: block;
}
.popup-header {
font-size: 20px;
margin-bottom: 10px;
display: flex;
justify-content: space-between;
align-items: center;
}
.popup-input {
width: 92%;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #ccc;
border-radius: 5px;
}
.popup-button {
background-color: #0f9977;
color: #fff;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
width: 100%;
font-size: 16px;
}
.popup-button:hover {
background-color: #0d8767;
}
.popup-close {
cursor: pointer;
font-size: 24px;
color: #999;
}
.popup-close:hover {
color: #666;
}
.overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: none;
z-index: 999;
}
.overlay.active {
display: block;
}
</style>
</head>
<body>
<div class="main-container">
<h1 class="title">ChatGPT免费账号(100个)</h1>
<div class="account-grid" id="accountGrid">
${Array.from({ length: 100 }, (_, i) => `
<div class="account-square" data-account="${i + 1}">
ChatGPT 账号${i + 1}(普号)
</div>
`).join('')}
</div>
<div class="popup" id="popup">
<div class="popup-header">
<span>输入对话隔离密码</span>
<span class="popup-close" id="popupClose">×</span>
</div>
<input type="text" id="uniqueNameInput" class="popup-input" placeholder="双击随机生成密码">
<button id="continueButton" class="popup-button">继续</button>
</div>
<div class="overlay" id="overlay"></div>
</div>
<form id="hiddenForm" method="POST" style="display: none;">
<input type="hidden" id="hiddenAccountChoice" name="account_choice">
<input type="hidden" id="hiddenUniqueName" name="unique_name">
</form>
<script>
document.addEventListener('DOMContentLoaded', function () {
var accountGrid = document.getElementById('accountGrid');
var popup = document.getElementById('popup');
var overlay = document.getElementById('overlay');
var uniqueNameInput = document.getElementById('uniqueNameInput');
var continueButton = document.getElementById('continueButton');
var popupClose = document.getElementById('popupClose');
var hiddenForm = document.getElementById('hiddenForm');
var hiddenAccountChoice = document.getElementById('hiddenAccountChoice');
var hiddenUniqueName = document.getElementById('hiddenUniqueName');
function generateRandomPassword() {
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var passwordLength = Math.floor(Math.random() * 3) + 8;
var password = '';
for (var i = 0; i < passwordLength; i++) {
var randomIndex = Math.floor(Math.random() * characters.length);
password += characters[randomIndex];
}
return password;
}
function setCookie(name, value, days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=/";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) === ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
function openPopup() {
popup.classList.add('active');
overlay.classList.add('active');
}
function closePopup() {
popup.classList.remove('active');
overlay.classList.remove('active');
}
accountGrid.addEventListener('click', function (event) {
if (event.target.classList.contains('account-square')) {
var account = event.target.getAttribute('data-account');
hiddenAccountChoice.value = account;
uniqueNameInput.value = getCookie('unique_name') || '';
openPopup();
}
});
uniqueNameInput.addEventListener('dblclick', function () {
uniqueNameInput.value = generateRandomPassword();
});
continueButton.addEventListener('click', function () {
hiddenUniqueName.value = uniqueNameInput.value;
setCookie('unique_name', uniqueNameInput.value, 7); // Store for 7 days
hiddenForm.submit();
});
uniqueNameInput.addEventListener('input', function () {
hiddenUniqueName.value = uniqueNameInput.value;
});
popupClose.addEventListener('click', closePopup);
overlay.addEventListener('click', closePopup);
});
</script>
</body>
</html>
`;
return new Response(formHtml, {
headers: {
"Content-Type": "text/html; charset=utf-8",
},
});
}
}
// 使用 OpenAI 的道德审核接口检查内容
async function checkContentForModeration(messages, apiKey) {
const apiBase = await oai_global_variables.get('OPENAI_API_BASE'); // 获取 API 基础 URL
const response = await fetch(`${apiBase}/v1/moderations`, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${apiKey}`,
},
body: JSON.stringify({ input: messages }),
});
// 检查 HTTP 响应是否成功
if (response.ok) {
const data = await response.json();
return {
shouldBlock: data.results.some((result) => result.flagged),
};
} else {
console.error("Moderation API returned an error:", response.status);
return { shouldBlock: false }; // 如果 API 调用失败,假定内容是安全的
}
}
${Array.from({ length: 100 }, (_, i) => `,有几个账号就将100改为几
在设置-触发器-添加自定义域这里可以设置自己的域名:
设置-变量设置kv数据库,均为oai_global_variables:
kv变量如下,可继续设置多个at2,at3,rt2,rt3:
OPENAI_API_BASE —— 填写审查的代理地址,https://xxxxxx.com
OPENAI_API_KEY ——填写审查的apikey,sk-xxxxxxxxx
YOUR_DOMAIN ——填写自己的域名,没设置就填new.oaifree.com
check ——未设置或为0不开启审查,设置为1开启审查
at1
rt1
效果如下: