在new成功加入了道德审查!使用cf的一个worker部署,来分享一下!

新建一个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">&times;</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
效果如下:


12 个赞

好,虽然我用的是免费的gpt4o

好,我也用免费4o

目前的问题就是,开启审查后,回复很长时,点击继续生成会出错 :thinking:

好!

佬友,很想知道你这点击号池里的一个号,跳出对话框要求输入随机密码的功能是怎么实现的