Guikong
Guikong
发布于 2023-07-07 / 40 阅读
0

使用cloudflare worker转发openai api并设置关键词屏蔽

cloudflare的worker功能可以用与转发一些API的调用需求,通过这个功能可以实现使用自己的域名转发调用某些API的需求。 这里分享两个worker.js代码,一个可以实现将APIKey进行自定义变换后转发,另一个可以自定义一些关键词或者敏感词汇,然后再调用Openai API的过程中拦截含有屏蔽词的调用请求。

自定义Key转发

这里的代码中,在openai-api处填写官方api,前面填写自定义字符串即可设定不一样的api实现转发调用。如果不设置任何自定义api,也可以直接使用官方apikey进行调用。

const OPENAI_URL = 'https://api.openai.com';

const keyMap = {
  '自定义api名1': 'openai-api1',
  '自定义api名2': 'openai-api2',
  // ...更多映射关系...
};

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const url = new URL(request.url);
  url.host = OPENAI_URL.replace(/^https?:\/\//, '');

  const modifiedRequest = new Request(url.toString(), {
    headers: new Headers(request.headers),
    method: request.method,
    body: request.body,
    redirect: 'follow'
  });

  const authHeader = modifiedRequest.headers.get('Authorization');
  if (authHeader) {
    for (const customKey in keyMap) {
      if (authHeader.includes(customKey)) {
        modifiedRequest.headers.set('Authorization', authHeader.replace(customKey, keyMap[customKey]));
        break;
      }
    }
  }

  const response = await fetch(modifiedRequest);
  const modifiedResponse = new Response(response.body, response);

  // 添加允许跨域访问的响应头
  modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');

  return modifiedResponse;
}

关键词屏蔽版本

该版本的可以设定无限个关键词,自定义设置,然后当请求调用是出现了这些关键词,会直接返回拒绝调用的消息,不消耗Toekn。

const OPENAI_URL = 'https://api.openai.com';

// 将敏感词汇放在一个数组中
const sensitiveWords = ['关键词1', '关键词2', '更多关键词'];

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  const url = new URL(request.url);
  url.host = OPENAI_URL.replace(/^https?:\/\//, '');

  const requestBody = await request.clone().text();
  
  // 检查请求体中是否包含屏蔽词
  if (sensitiveWords.some(word => requestBody.includes(word))) {
    return new Response('请求包含敏感信息,终止会话。', { status: 400 });
  }

  const modifiedRequest = new Request(url.toString(), {
    headers: request.headers,
    method: request.method,
    body: request.body,
    redirect: 'follow'
  });

  const response = await fetch(modifiedRequest);
  const modifiedResponse = new Response(response.body, response);

  // 添加允许跨域访问的响应头
  modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');

  return modifiedResponse;
}

Github地址:cloudflare-transfer-api