关于#javascript#的问题:调用openai的api开发网站被墙问题解决

我需要写一个网站,调用openai的api做代码生成和图像生成,由于国内ip无法访问openai的api,所以我找到了两种路子来做这个事情,第一种是apify代理,代码如下:

app.post('/generate-code', (req, res) => {
  const apiKey = '';
  const codeModel = 'text-babbage-001';
  const prompt = req.body.prompt;
  const headers = {
    'Content-Type': 'application/json',
    'Authorization': Bearer ${apiKey}
  };
  const data = {
    'model': codeModel,
    'prompt': prompt,
    'temperature': 0.5,
    'max_tokens': 1024,
    'top_p': 1,
    'n': 1,
    'stop': '\n',
    'presence_penalty': 0,
    'frequency_penalty': 0
  };
  
  // 创建 Apify 代理配置对象
  const apifyProxy = apify.createProxyConfiguration({
    groups: ['SHADER']
  });

  // 使用自定义 Axios 实例来发起 API 请求
  const customAxios = axios.create({
    proxy: apifyProxy
  });
  customAxios.post('https://api.openai.com/v1/engines/text-babbage-001/completions', data, { headers })
    .then(response => {
      res.json({ code: response.data.choices[0].text })
    })
    .catch(error => {
      console.log(error);
      res.status(300).json({ message: 'Error generating code' });
    });
});

以上代码是代码生成部分,图像生成部分大同小异。
但是部署之后宝塔面板项目启动失败,报错:
protocol: 'https:', _redirectable: [Circular *1], [Symbol(kCapture)]: false, [Symbol(kNeedDrain)]: false, [Symbol(corked)]: 0, [Symbol(kOutHeaders)]: [Object: null prototype] }, _currentUrl: 'https://api.openai.com/v1/engines/davinci-codex-002/completions', [Symbol(kCapture)]: false }, cause: Error: connect ETIMEDOUT 108.160.170.45:443 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1148:16) { errno: -110, code: 'ETIMEDOUT', syscall: 'connect', address: '108.160.170.45', port: 443 } }
我尝试更改代理组为RESIDENTIAL之后报错没了,只有启动失败提示。
然后第二个路子是使用cloudflare套壳转发请求,参照csdn博客:https://blog.csdn.net/illcx/article/details/129540095%EF%BC%8C%E4%BD%86%E6%98%AF%E6%88%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E7%9A%84%E6%97%B6%E5%80%99%E6%8A%A5%E9%94%99%E3%80%82
测试详情如图:

img


同时在项目中尝试调用,直接报错。
希望能指点一二

这种开发方式很容易被墙,要么就购买稳定的代理。

这段代码使用了Apify代理配置对象和自定义Axios实例来发起API请求,这样就可以绕过OpenAI API的IP限制。具体来说,通过Apify代理配置对象的“groups”属性将请求发送到代理服务器,然后使用自定义Axios实例来发起请求,从而实现代理。

在使用这段代码之前,你需要在Apify上注册并创建一个代理服务,然后将代理服务的URL和认证信息添加到Axios实例中,如下所示:


const apifyProxyUrl = 'http://proxy.apify.com:8000';
const apifyProxyUsername = 'YOUR_PROXY_USERNAME';
const apifyProxyPassword = 'YOUR_PROXY_PASSWORD';

const apifyProxy = apify.createProxyConfiguration({
  groups: ['SHADER'],
  proxyUrls: [apifyProxyUrl],
  username: apifyProxyUsername,
  password: apifyProxyPassword
});

const customAxios = axios.create({
  proxy: apifyProxy,
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json'
  }
});

其中,你需要将“YOUR_PROXY_USERNAME”和“YOUR_PROXY_PASSWORD”替换为你在Apify上创建的代理服务的用户名和密码。

此外,你需要注意的是,Apify代理服务是付费的,需要在Apify上购买套餐后才能使用。