海外服务器接入ChatGPT - NodeJS篇

文章阅读时长:大约5分钟

需求分析:

OpenAI屏蔽了国内IP,国内网络直连ChatGPT会被block,如何国内自己使用呢?

解决方案:

国内连接海外服务器,海外服务器转接请求到ChatGPT

需要资源:

海外服务器 + 基础编程能力 + OpenAI的Key


\color{#888888}{ (以下所有代码是在MacOS系统操作,服务器为Linux。) }

准备一台海外服务器(这篇文章介绍如何白嫖一年Amazon服务器),先安装NodeJS环境。

服务器验证

ssh进入你的服务器,假如你的服务器ip为123.456.78.9
% ssh root@123.456.78.9

在你的服务器里,先试下使用cURL可不可以访问OpenAi。
(记得替换你的key: sk-xxxx,然后几行一起复制,在终端里输入以下代码)

curl "https://api.openai.com/v1/chat/completions" \
-X POST \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-3.5-turbo", "messages": [ {"role": "user", "content": "软件工程师,如何在职场中增加影响力"} ] }'

这个时候返回ChatGPT的回答,就证明你的服务器可以用。如果有其他错误,要查查你的服务器,是不是海外ip了。

下面是服务器配置

安装NodeJS (LTS版本的)
% curl -fsSL https://raw.githubusercontent.com/tj/n/master/bin/n | bash -s lts

装完查看node版本号
% node -v

安装Nginx (NodeJS本身能运行web服务,为什么还要Nginx、Apache这些?可以看看这个文章,主要是因为Nginx有负载均衡、静态缓存这些优化。)
% yum install nginx

装完查看nginx版本号
% nginx -v

查看nginx配置
% nginx -t

启动nginx
% nginx

启动完nginx后,在浏览器输入你的服务器ip,访问到一个“Welcome to nginx!”的页面,证明服务器已经可以使用。

编写代码:

// 新建 server.js 文件,直接copy代码的话记得替换sk-xxxxx为你自己的key。

// server.js 文件

var express = require('express'); // 没有装过的话可以先安装: npm install express
var app = express();
var path = require('path');
const https = require('https');

// 要解析application/json
app.use(express.json()); 

app.post('/chat', (req, res) => {
    var auth = req.body.auth;
    // 这里是你自己的简单验证key,可以不要
    if (auth === 'aaa') {
        var msg = req.body.msg;
        try {
            PostTextToChat(msg, function(callbackString) {
                // 把openAi返回的字段全部透传给你
                res.send(callbackString);
            });
        } catch (error) {
            console.log('error: ' + error)
        }
    } else {
        res.send('Invalid Auth');
    }
});

// 向chatGPT发出Post请求
function PostTextToChat(msg, callback) {
    const apiKey = 'sk-xxxxx'; // 这里填写你的key
    const prompt = msg;

    const messages = [];
    messages.push({
        "role": "user",
        "content": prompt
    });
    const postData = JSON.stringify({
        "model": "gpt-3.5-turbo",
        "messages": messages,
//        "max_tokens": 200,
    });
    const options = {
        hostname: 'api.openai.com',
        port: 443,
        path: '/v1/chat/completions',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + apiKey
        }
    };

    const req = https.request(options, (res) => {
        let response = '';
        res.on('data', (chunk) => {
            response += chunk;
        });
        res.on('end', () => {
            response = JSON.parse(response);
            callback(response);
        });
    });

    req.on('error', (error) => {
        console.error('error~~ ' + error);
        callback(error);
    });

    req.write(postData);
    req.end();
}

// 生成服务器并监听3000端口
var server = app.listen(3000, 'localhost', function () {
    var host = server.address().address
    var port = server.address().port
    console.log('应用实例,访问地址为 http://%s:%s', host, port)
});

使用工具,把server.js文件复制到你的服务器任意路径下。Mac端可以使用Transmit等工具

配置nginx

刚刚使用的命令 % nginx -t 可以获取配置路径,如 /etc/nginx/nginx.conf
修改nginx.conf文件
% vim /etc/nginx/nginx.conf

i键开始编辑;
编辑好后,按esc键,先输入: 再输入 wq 这样就会保存退出。

配置里主要是proxy_pass http://Localhost:3000; 这行,表示服务器在监听80端口(你平时在浏览器输入域名或者ip后,不另外加端口号的话,默认就是80端口),监听到80端口的请求后,会映射到3000端口。然后你的server.js在监听3000端口,这样请求就到你的server.js去了。

配置好后重启下nginx
% nginx -s reload

修改后大概长这样:
nginx.conf
启动你的server.js

% cd [server.js目录]
% node server.js

(开启后当前终端就一直挂在这里了。如果你关掉终端,server.js也会失效。这个时候可以用一个叫pm2的工具,它可以让js服务在后台开启。这个是后话,有空再写pm2的东西,现在先测试整个流程。)

这个时候,你已经配置好nginx:监听80端口,然后反向路由到3000端口;且开启了server.js;
当你向服务器发出请求的时候,就能收到响应了。

如何向服务器发出请求

可以在你电脑另外开一个终端,输入以下cURL代码 / 使用Postman

curl "http://123.456.78.9/chat" \
-X POST \
-H "Content-Type: application/json" \
-H 'Accept: application/json' \
-d  '{ "auth": "aaa", "msg": "软件工程师,如何在职场中增加影响力"}'

如果收到大洋彼岸的服务器的响应,恭喜你,成功解决了被block的问题了~🎉
(利用这个项目,你还能写App或小程序,给你的小伙伴无障碍使用chatGPT,去炫耀你的技术吧🐮)

cURL返回的结果
Postman返回的结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容