文章阅读时长:大约5分钟
需求分析:
OpenAI屏蔽了国内IP,国内网络直连ChatGPT会被block,如何国内自己使用呢?
解决方案:
国内连接海外服务器,海外服务器转接请求到ChatGPT
需要资源:
海外服务器 + 基础编程能力 + OpenAI的Key
准备一台海外服务器(这篇文章介绍如何白嫖一年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
启动你的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,去炫耀你的技术吧🐮)