Pandora Car 去除小锁脚本

image

使用 给大家带来新玩具Pandora Car开车平台,0门槛的共享ChatGPT Plus服务 开车的时候左边会有很多别人的聊天记录,占地方,而且不好翻自己的记录

油猴脚本重写 fetch 方法过滤掉所有带锁的项

// ==UserScript==
// @name         Filter JSON items with 🔒 in items array
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Filter out objects with 🔒 symbol in the title field within the items array when parsing JSON data.
// @author       Your Name
// @match        https://chat.oai2b.com/*
// @grant        none
// ==/UserScript==

(function () {
    "use strict";

    // 保存原始的JSON.parse方法
    const originalFetch = window.fetch;
    window.fetch = function () {
        return originalFetch.apply(this, arguments).then((response) => {
            return response
                .clone()
                .json()
                .then((data) => {
                    console.log("Original data:", data);
                    // 在这里过滤数据
                    if (data.items) {
                        data.items = data.items.filter(
                            (item) => item.title !== "🔒"
                        );
                    }
                    console.log("Filtered data:", data);
                    // 返回修改后的对象
                    return new Response(JSON.stringify(data), {
                        headers: response.headers,
                        status: response.status,
                        statusText: response.statusText,
                    });
                });
        });
    };
})();
11 个赞

挺好的小工具

1 个赞

不会导致消息记录没法下拉加载叭

应该不会,测试一下

感谢大佬分享

1 个赞

谢谢大佬!紫薯布丁

您好,这个会导致上传附件的时候中断而失败。禁用后恢复正常的附件上传呢~

试试这个

(function () {
    //"use strict";

    // 保存原始的 fetch 方法
    const originalFetch = window.fetch;
    window.fetch = function (url, config) {
        return originalFetch.apply(this, arguments).then(response => {
            const urlObj = new URL(url, window.location.origin);

            // 当路径匹配时处理响应
            if (urlObj.pathname === '/backend-api/conversations') {
                if (!response.clone) return response;
                return response.clone().json().then(data => {
                    console.log("Original data:", data);
                    // 过滤数据
                    if (data.items) {
                        data.items = data.items.filter(
                            item => !item.title.includes("\uD83D\uDD12") // 🔒 是 🔒 的 Unicode 编码
                        );
                    }
                    console.log("Filtered data:", data);
                    // 返回修改后的对象
                    return new Response(JSON.stringify(data), {
                        headers: response.headers,
                        status: response.status,
                        statusText: response.statusText,
                    });
                });
            }

            // 其他 URL 直接返回原始响应
            return response;
        });
    };
})();

能添加到我这里不?大佬。

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 对象
  }

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

  async function getOAuthLink(shareToken, proxiedDomain) {
    //const url = `https://${proxiedDomain}/api/auth/oauth_token`;
    const url = `https://new.oaifree.com/api/auth/oauth_token`;
    const response = await fetch(url, {
        method: 'POST',
        headers: {
            'Origin': `https://${proxiedDomain}`,
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            share_token: shareToken
        })
    })
    const data = await response.json();

    return data.login_url;
  }

  async function getShareToken(userName, at) {
    const url = 'https://chat.oaifree.com/token/register';
    const body = new URLSearchParams({
        // 此处为获取Share Token时的请求参数,可自行配置
        access_token: at,
        unique_name: userName,
        site_limit: '', // 限制的网站
        expires_in: '0', // token有效期(单位为秒),填 0 则永久有效
        gpt35_limit: '-1', // gpt3.5 对话限制
        gpt4_limit: '-1', // gpt4 对话限制
        show_conversations: 'false', // 是否显示所有人的会话
        show_userinfo: 'false', // 是否显示用户信息
        reset_limit: 'false' // 是否重置对话限制
    }).toString();
    const apiResponse = await fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        body: body
    });

    const responseText = await apiResponse.json();
    const tokenKey = responseText.token_key ? responseText.token_key : 'share token 获取失败';
    return tokenKey;
  }

  async function handleRequest(request) {
    const url = new URL(request.url);
    const params = new URLSearchParams(url.search);
    const userName = params.get('un');
    if (!userName) {
        // 如果没有 'un' 参数,返回 HTML 表单
        return new Response(formHtml, {
            headers: {
                'Content-Type': 'text/html; charset=utf-8'
            }
        });
    }



    // @ts-ignore
    // 验证用户名是否存在
    const users = await oai_global_variables.get("users");
    console.log(users)
    if (!users.split(",").includes(userName)) {
        return new Response('用户不存在', { status: 4014 });
    }

    // @ts-ignore
    const accessToken = await oai_global_variables.get('at');
    console.log(accessToken)
    if (isTokenExpired(accessToken)) {
        // 给没有refresh token的萌新用(比如我),取消下面这行注释即可享用
        // return new Response('当前access token未更新,请联系管理员更新', { status: 401 });

        // 如果 Token 过期,执行获取新 Token 的逻辑
        const url = 'https://token.oaifree.com/api/auth/refresh';
        // @ts-ignore
        const refreshToken = await oai_global_variables.get('rt');  // 实际情况下你可能会从某处获取这个值
        console.log(refreshToken)
        // 发送 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();  // 假设服务器返回的是 JSON 格式数据
            console.log('data01',data)


           const accessToken = data.access_token;; // 直接从 JSON 中获取 access_token
        //    console.log(accessToken)

            // @ts-ignore
            await oai_global_variables.put('at', accessToken);
        } else {
            return new Response('Error fetching access token', { status: response.status });
        }
    }

    // @ts-ignore
    //const tokenPrefix = await oai_global_variables.get('token_prefix');
    const finalaccessToken = await oai_global_variables.get('at');
    const shareToken = await getShareToken(userName, finalaccessToken);
    if (shareToken === 'share token 获取失败') {
        return new Response('token获取失败,请刷新重试', { status: 500 });
    }
    // @ts-ignore
    const proxiedDomain = await oai_global_variables.get('proxied_domain');
    return Response.redirect(await getOAuthLink(shareToken, proxiedDomain), 302);
  }
  // HTML 表单代码
  const formHtml = `
  <!DOCTYPE html>
  <html lang="en">
  <head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
  body {
  font-family: Arial, sans-serif;
  background-color: #f4f4f4;
  padding: 20px;
  }
  form, .response-container {
  background: white;
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  max-width: 600px;
  margin: 20px auto;
  }
  h1 {
  text-align: center; 
  }
  h2 {
  text-align: center; 
  }
  p {
  display: block;
  margin-bottom: 10px;
  font-size: 16px;
  }
  input[type="text"], textarea {
  width: calc(100% - 22px);
  padding: 10px;
  margin-top: 5px;
  margin-bottom: 20px;
  border-radius: 5px;
  border: 1px solid #ccc;
  }
  textarea {
  font-family: 'Courier New', monospace;
  background-color: #f8f8f8;
  height: 150px; /* Adjust height based on your needs */
  }
  button {
  background-color: #000000;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
  font-size: 16px;
  font-weight:600;
  width:100% !important
  }
  button:hover {
  background-color: #1e293b;
  }
  @media (max-width: 768px) {
  body, form, .response-container {
  padding: 10px;
  }
  }
  .checkbox-group {
  display: flex;
  justify-content: space-between;
  }
  .checkbox-group input[type="checkbox"] {
  margin-right: 5px;
  }
  .checkbox-group label {
  margin-right: 10px;
  }
  </style>
  </head>
  <body>
  <h1>欢迎使用</h1>
  <form method="GET">
  <label for="unique_name">请输入独一无二的名字,以你的区分身份,用于会话隔离:</label>
  <input type="text" id="un" name="un" placeholder="" required value="">
  <br></br>
  <button type="submit">访问使用</button>
  </form>
  </body>
  </html>
  `;
1 个赞

脚本在哪呢?没找到

好东西呀~!!

???
主贴里面有啊,也可以看上面大佬的

大佬,你这个小工具的油猴脚本叫啥呢?我没找到

直接复制代码到控制台运行,或者直接新建一个脚本粘贴进去就好

这个怎么添加到helper里面呢?