目 录CONTENT

文章目录
AI

新必应(New Bing)聊天 国内部署&使用教程

俊阳IT知识库
2023-06-14 / 9 评论 / 2 点赞 / 8,062 阅读 / 2,124 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-12-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
广告

前言

之前两篇文章说了下如何部署属于自己的ChatGPT网站,文章:

有人说 New Bing 的模型使用的是 ChatGPT 4.0 的模型,但是我整体使用下来,感觉 New Bing 不如ChatGPT(目前使用的是3.5模型),而且回答的比较慢(可能跟网络有关系),不知道是不是我的使用方式有问题。

现在想使用 New Bing ,我们一般都要使用Edge浏览器,然后注册微软账号进行登录才能聊天,但是我们想使用其他的浏览器,想分享给别人使用,这种方式就不行了,那我们就部署个属于自己的网页版的 BingAI 聊天网站。

特点:

  • 无需登录(如果想要画图功能,则需要使用登录后的一个Token)
  • 国内可用
  • 兼容微软 Bing AI 所有功能
  • 支持现有开源 ChatGPT 提示词库
  • 可分享给别人使用

环境准备&项目展示

  1. 域名、服务器购买
  2. 服务器环境搭建,需要系统安装docker、docker-compose、Nginx反向代理或者其他反向代理工具等

相关链接:

  1. docker、docker-compose安装:https://blog.fanjunyang.zone/archives/debian-docker-install
  2. Nginx Proxy Manager安装使用:https://blog.fanjunyang.zone/archives/nginx-proxy-manager
  3. 要使用的开源项目go-proxy-bing:https://github.com/adams549659584/go-proxy-bingai

ai-newbing-chat-1

第三方部署方式

如果自己没有服务器,或者不想在自己服务器上部署的话,可以使用第三方托管平台进行部署(个别第三方平台免费账户都有限制)。
部署方式参考链接:https://github.com/adams549659584/go-proxy-bingai#railway ,只需注册账号,根据文档部署就好了,非常简单,如果有问题,可以参考我做的视频。

支持部署的平台:

  • railway
  • Vercel(部署不支持 Websocket )
  • Render

Docker部署方式



因国内的机器不可直连,所以要配置 socks 环境变量,国外的服务器无需配置。有问题的话参考issues:https://github.com/adams549659584/go-proxy-bingai/issues/71

环境变量

# 运行端口 默认 8080 可选
PORT=8080
# Socks 环境变量 示例 可选
Go_Proxy_BingAI_SOCKS_URL=192.168.0.88:1070
# Socks 账号、密码 可选
Go_Proxy_BingAI_SOCKS_USER=xxx
Go_Proxy_BingAI_SOCKS_PWD=xxx
# 默认用户 Cookie 设置,可选,不推荐使用,固定前缀 Go_Proxy_BingAI_USER_TOKEN 可设置多个,未登录用户将随机使用,多人共用将很快触发图形验证,并很快达到该账号的24小时限制
Go_Proxy_BingAI_USER_TOKEN_1=xxx
Go_Proxy_BingAI_USER_TOKEN_2=xxx
Go_Proxy_BingAI_USER_TOKEN_3=xxx ...
# 简单授权认证密码,可选
Go_Proxy_BingAI_AUTH_KEY=xxx

直接用docker命令构建

可以不配置socks环境变量

运行容器 监听8080 端口

docker run -d -p 8080:8080 --name go-proxy-bingai --restart=unless-stopped adams549659584/go-proxy-bingai

配置 socks 环境变量

docker run -e Go_Proxy_BingAI_SOCKS_URL=192.168.0.88:1070 -e Go_Proxy_BingAI_SOCKS_USER=xxx -e Go_Proxy_BingAI_SOCKS_PWD=xxx -d -p 8080:8080 --name go-proxy-bingai --restart=unless-stopped adams549659584/go-proxy-bingai

使用yml文件构建

/root/docker_data/new_bing 文件夹下面新建 docker-compose.yml 文件如下(自己可以自定义文件路径):

version: '3'

services:
  go-proxy-bingai:
    # 镜像名称
    image: adams549659584/go-proxy-bingai
    # 容器名称
    container_name: go-proxy-bingai  
    # 自启动
    restart: unless-stopped
    ports:
      - 8080:8080	# 左边的端口可以修改为你机器上未被占用的端口
    # environment:
    #   - Go_Proxy_BingAI_SOCKS_URL=192.168.0.88:1070
    #   - Go_Proxy_BingAI_SOCKS_USER=xxx
    #   - Go_Proxy_BingAI_SOCKS_PWD=xxx
    #   - Go_Proxy_BingAI_USER_TOKEN_1=xxx
    #   - Go_Proxy_BingAI_USER_TOKEN_2=xxx    

然后执行命令,启动容器:

docker-compose up -d

容器启动完毕后,一定要配置反向代理和HTTPS,否则不能访问和使用

部署聊天服务器

部署成功后使用,默认有两个聊天服务器可用,如下:

ai-newbing-chat-2

ai-newbing-chat-3

最好使用 Bing 官方 的服务,使用 Cloudflare 的话,一天默认100000次请求数,很多人都用的话,很快就用完了。

我们可以使用 Cloudflare 自己搭一个 Worker 服务,自己一个人或者几个人用,一天100000次请求数,一般够用了

具体部署 Cloudflare Workers 教程自行查询或者看我做的视频,大概如下:

  1. 注册 Cloudflare 账号
  2. 创建 Worker 服务,复制下面的worker.js 核心代码,粘贴至创建的服务中,保存并部署
  3. 触发器 中自定义访问域名(也可用默认的)

worker.js 核心代码

const SYDNEY_ORIGIN = 'https://sydney.bing.com';
const KEEP_REQ_HEADERS = [
  'accept',
  'accept-encoding',
  'accept-language',
  'connection',
  'cookie',
  'upgrade',
  'user-agent',
  'sec-websocket-extensions',
  'sec-websocket-key',
  'sec-websocket-version',
  'x-request-id',
  'content-length',
  'content-type',
  'access-control-request-headers',
  'access-control-request-method',
];
const IP_RANGE = [
  ['3.2.50.0', '3.5.31.255'], //192,000
  ['3.12.0.0', '3.23.255.255'], //786,432
  ['3.30.0.0', '3.33.34.255'], //205,568
  ['3.40.0.0', '3.63.255.255'], //1,572,864
  ['3.80.0.0', '3.95.255.255'], //1,048,576
  ['3.100.0.0', '3.103.255.255'], //262,144
  ['3.116.0.0', '3.119.255.255'], //262,144
  ['3.128.0.0', '3.247.255.255'], //7,864,320
];

/**
 * 随机整数 [min,max)
 * @param {number} min
 * @param {number} max
 * @returns
 */
const getRandomInt = (min, max) => Math.floor(Math.random() * (max - min)) + min;

/**
 * ip 转 int
 * @param {string} ip
 * @returns
 */
const ipToInt = (ip) => {
  const ipArr = ip.split('.');
  let result = 0;
  result += +ipArr[0] << 24;
  result += +ipArr[1] << 16;
  result += +ipArr[2] << 8;
  result += +ipArr[3];
  return result;
};

/**
 * int 转 ip
 * @param {number} intIP
 * @returns
 */
const intToIp = (intIP) => {
  return `${(intIP >> 24) & 255}.${(intIP >> 16) & 255}.${(intIP >> 8) & 255}.${intIP & 255}`;
};

const getRandomIP = () => {
  const randIndex = getRandomInt(0, IP_RANGE.length);
  const startIp = IP_RANGE[randIndex][0];
  const endIp = IP_RANGE[randIndex][1];
  const startIPInt = ipToInt(startIp);
  const endIPInt = ipToInt(endIp);
  const randomInt = getRandomInt(startIPInt, endIPInt);
  const randomIP = intToIp(randomInt);
  return randomIP;
};

/**
 * home
 * @param {string} pathname
 * @returns
 */
const home = async (pathname) => {
  const baseUrl = 'https://raw.githubusercontent.com/adams549659584/go-proxy-bingai/master/';
  let url;
  // if (pathname.startsWith('/github/')) {
  if (pathname.indexOf('/github/') === 0) {
    url = pathname.replace('/github/', baseUrl);
  } else {
    url = baseUrl + 'cloudflare/index.html';
  }
  const res = await fetch(url);
  const newRes = new Response(res.body, res);
  if (pathname === '/') {
    newRes.headers.delete('content-security-policy');
    newRes.headers.set('content-type', 'text/html; charset=utf-8');
  }
  return newRes;
};

export default {
  /**
   * fetch
   * @param {Request} request
   * @param {*} env
   * @param {*} ctx
   * @returns
   */
  async fetch(request, env, ctx) {
    const currentUrl = new URL(request.url);
    // if (currentUrl.pathname === '/' || currentUrl.pathname.startsWith('/github/')) {
    if (currentUrl.pathname === '/' || currentUrl.pathname.indexOf('/github/') === 0) {
      return home(currentUrl.pathname);
    }
    const targetUrl = new URL(SYDNEY_ORIGIN + currentUrl.pathname + currentUrl.search);

    const newHeaders = new Headers();
    request.headers.forEach((value, key) => {
      // console.log(`old : ${key} : ${value}`);
      if (KEEP_REQ_HEADERS.includes(key)) {
        newHeaders.set(key, value);
      }
    });
    newHeaders.set('host', targetUrl.host);
    newHeaders.set('origin', targetUrl.origin);
    newHeaders.set('referer', 'https://www.bing.com/search?q=Bing+AI');
    const randIP = getRandomIP();
    // console.log('randIP : ', randIP);
    newHeaders.set('X-Forwarded-For', randIP);
    const oldUA = request.headers.get('user-agent');
    const isMobile = oldUA.includes('Mobile') || oldUA.includes('Android');
    if (isMobile) {
      newHeaders.set(
        'user-agent',
        'Mozilla/5.0 (iPhone; CPU iPhone OS 15_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.7 Mobile/15E148 Safari/605.1.15 BingSapphire/1.0.410427012'
      );
    } else {
      newHeaders.set('user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.35');
    }

    // newHeaders.forEach((value, key) => console.log(`${key} : ${value}`));
    const newReq = new Request(targetUrl, {
      method: request.method,
      headers: newHeaders,
      body: request.body,
    });
    // console.log('request url : ', newReq.url);
    const res = await fetch(newReq);
    return res;
  },
};

然后在【聊天服务器设置】中使用自己的服务,如下:

ai-newbing-chat-4

图像创建

想使用BingAI作图的话,可以使用【图像创建】功能,如下:

ai-newbing-chat-5

但是要使用画图功能的话,需要先进行登录

ai-newbing-chat-6

这个时候,我们需要先【设置用户】

  1. 访问 https://www.bing.com/https://cn.bing.com/ ,登录
  2. F12 或 Ctrl + Shift + I 打开控制台
  3. 拿到 Cookie 中 _U 的值 后,在网站设置 => 设置用户 中填入即可。

ai-newbing-chat-7

然后就可以进行图片创作了

ai-newbing-chat-8

视频链接

2

评论区