私人ChatGPT账号配置new.oaifree,哪个佬友帮忙补充第四步啊?

自己不是很懂代码问题,最近想买一个共享plus账号然后用始皇的new.oaifree配合一个share token,就可以把链接分享给办公室小伙伴使用,所以用Notion简单记录了下操作步骤,参考的下面的帖子,

很详细,但还是不会第四步反代,我的记录j截图如下:

有佬友懂得能帮忙补充下第四部的简要步骤吗,我自己有cloudflare,域名解析啥的也知道。

也不知道我记录的简单步骤有没有漏掉或者可以完善的,佬友们帮帮忙啊

为了表达感谢,特意送上一个全新的DeepL Pro账号(别改密码啊,让有需要的都能用,邮箱是假的,也收不了验证码):
[email protected]
PU%fN0KLDRgDWj&Q

(新建了worker并填写了代码,创建了custom domain,然后使用类似以下地址访问,成功:
http://xxxxxxx.com/auth/login_share?token=fk-gaYWRIinVoPHoWyT0lbxgfqle61Q59hdADg7FGdNv4)

感谢评论区的指点,学会了。

4 个赞

wiki快问快答

这儿

我也看了这个,搞不会,毕竟不是搞IT的

第四步不是 chat2api 的吗,你要是不需要转 api,可以跳过,直接进入第六步反代 new.oaifree

1.创建一个workers
2.点编辑代码复制粘贴那段反代代码,保存部署。
3.设置里添加自定义域。

1 个赞

不需要API,就是想反代就够了

好像是这么回事,似懂非懂,能再具体截图图展示不?

1 个赞

这一段不就是你要的吗

1 个赞

vps 也可以通过 nginx 反代,看你是想反代到哪里

你要点击deploy先创建 然后在编辑

1 个赞

嗯,发现了

新建了worker并填写了代码,创建了custom domain,当我使用类似以下地址访问,并不能直接使用ChatGPT,而是跳转到了new.oaifree:
http://xxxxxxx.com/auth/login_share?token=fk-gaYWRIinVoPHoWyT0lbxgfqle61Q59hdADg7FGdNv4

你反代的就是new.oaifree,不是chatgpt,输入你at。放心使用吧

1 个赞
1 个赞

学会了,感谢

我不知道你用的是哪个 worker 代码,但是建议加一下这几个小功能(反代原来的backend-api):

  • 去掉小锁, 查询所有历史记录
  • 修改显示的账户信息
  • 反代 voice.oaifree.com
  // 检查二级域名是否是 voice
  if (subDomain === 'voice') {
    if (requestURL.pathname === '/' && !requestURL.search) {
      // 直接访问就重定向到 chat
      const chatBase = replaceSubdomain(requestURL.hostname, 'chat');
      return Response.redirect(`https://${chatBase}`, 301)  // 301 永久重定向
    }
    // 一文教你如何反代oaifree voice: https://linux.do/t/topic/107417
    requestURL.host = 'voice.oaifree.com';
    return fetch(new Request(requestURL, request));
  }

  const path = requestURL.pathname;
  // ------------ 反代到 new.oaifree.com
  if (path !== '/auth/login_auth0' && path !== '/auth/login') {
    const voiceBase = replaceSubdomain(requestURL.hostname, 'voice');
    requestURL.host = 'new.oaifree.com';
    // + https://linux.do/t/topic/107417#voice-httpsvoiceabccom-httpsnewoaifreecom-x-voice-base-3
    const modifiedRequest = new Request(requestURL, request);
    modifiedRequest.headers.set('X-Voice-Base', `https://${voiceBase}`);

    //去掉小锁, 查询历史记录
    if (path === '/backend-api/conversations') {
      const consResponse = await fetch(new Request(modifiedRequest, request));
      let consData = await consResponse.json();
      consData.items = consData.items.filter(item => item.title !== "🔒");
      /* consData: {
        "items": [...], "total":180, "limit":28, "offset":0
      } */
      let offset = consData.offset;
      const limit = consData.limit;
      let isAllHistory = consData.limit + offset > consData.total;
      const url = new URL(modifiedRequest.url);
      const params = new URLSearchParams(url.search);
      params.set('limit', consData.limit.toString());
      params.set('order', 'updated');
      
      while (consData.items.length < limit && !isAllHistory) {
        params.set('offset', (offset + limit).toString());
        // 创建新的 Request 对象
        url.search = params.toString();   // "?offset=28&limit=28&order=updated"
        const consResponse = await fetch(new Request(url.toString(), request));
        const newData = await consResponse.json();
        newData.items = newData.items.filter(item => item.title !== "🔒");

        consData.items.push(...newData.items);
        consData.limit = consData.items.length;
        consData.offset = newData.offset + newData.limit - consData.limit;   // todo: offset 这个值需要再议
        isAllHistory = limit + offset > consData.total;   // "total":180, "limit":28, "offset":168
        offset = offset + limit;
      }

      return new Response(JSON.stringify(consData), {
        status: consResponse.status,
        headers: consResponse.headers
      });
    }

    const response = await fetch(modifiedRequest);
    //修改用户信息
    if (path === '/backend-api/me') {
      const data = await response.json();
      data.picture = `xxxxx`;   // 头像的路径;
      data.email = '[email protected]';
      data.name = 'xxxxx';
      return new Response(JSON.stringify(data), {
        status: response.status,
        headers: response.headers
      });
    }
    if (path === '/backend-api/gizmo_creator_profile') {
      const data = await response.json();
      data.name = 'xxxxx';
      data.display_name = 'xxxxx';
      const chatProxyDomain = replaceSubdomain(voiceBase, 'chat');
      data.website_url = `https://${chatProxyDomain}`;
      return new Response(JSON.stringify(data), {
        status: response.status,
        headers: response.headers
      });
    }
    return response;
  }
1 个赞

From 快问快答 to 开发调优

目前了解到的最优方案。但对于中途上车的用户,尤其是历史创建的对话数小于limit(目前为28)时,会自动加载所有的对话历史,导致列表长时间加载不出来 :bili_001: