解决vps docker访问chatgpt时1020或429错误的终极解决方案突破openai限流
解决vps docker访问chatgpt时1020或429错误的终极解决方案突破openai限流
2023年9月25日更新: chatgpt 403错误解决思路。
最近两天发现chatgpt的历史会话load error,同时也无法正常使用。查看错误发现不是1020或是429,而是整体变成了403的错误。
经过简单的定位,还是IP地址本身的问题,同时发现之前切换IP的功能失效了,经过定位是myip.ipip.net这个网址对于脚本的访问进行了防护。
因此进行更新:
1. 将myip.ipip.net替换为https://chat.openai.com/cdn-cgi/trace
2. 给大家重新打包了一个容器。galtjay/warp:v3
启动的方式未发生变化,大家之前的假如使用有问题,直接进行将v2换成v3即可。
2023年6月9日更新:
有用户需要同时屏蔽多个IP,因此在原有的基础上增加了多个IP屏蔽的功能。
在传递环境变量的时候传递多个IP即可,myip="104.28.245.199,104.28.222.43",逗号分隔。
本人使用了这个方案之后,一周内没有发生过chatgpt的网络相关的问题,所以方案的可行性应该是很高的,希望能帮到大家。
github及dockerhub均已更新,直接使用即可。
2023年6月2日更新:
今天对于整体方案做了一下小的优化:
1. checkip 脚本中加了--accept-tos的参数
2. 将切换的频率进行了降低,我测试发现,warp切换频率过高的话,IP整个就不变了。
新增一个测试页面,方便大家在本地验证目前访问的IP:
https://chat.openai.com/cdn-cgi/trace
同时思路进行改变,之前的想法是锁住可以访问的IP,这次变更为排除不能访问的IP。
当我们使用warp时,90%的概率会被分配到某个指定的IP,我们只需要把这个IP直接排除掉就好了。
原文也已经重新修改。
原文:
本人前期已经写了两篇文章,阐述了如何在vps侧套warp,从而解决chatgpt被禁止访问或者限流的问题。从后台的数据来看,访问量很大,说明很多人遇到了类似的问题。
但是之前的那两篇文章没有彻底,或者说自动化的解决掉429的错误。因此在之前的方案上,补充轮询和锁定可靠节点的能力就比较重要了。话不多说,为了让大家一把梭,还是基于docker去做。
整体思路的详解
根据我对于warp的实际使用经验来说,当你连接warp的时候,大多数情况下,初次分配的IP都会遇到429的错误。我们可以透过手动断连、重连实现IP的切换,并且同步的去验证是否解除了429。
warp-cli disconnect && sleep 3 &&warp-cli connect && sleep 3&& export ALL_PROXY=socks5://127.0.0.1:40000 && curl myip.ipip.net
比如我们上边看到的这个104.28.222.43IP,是会遇到429的。
透过重复的断连切换,最终我们发现104.28.222.46这个IP,它是不存在429的情况。
因此我们只需要写个脚本,把最常用的那个IP进行排除即可:只要发现连接了104.28.222.43这个IP,直接进行切换。
脚本:脚本会按照10分钟的频率去进行ip的监测,确保符合期望状态。
#!/bin/bash
# myip在容器运行时进行传递,这个ip就是你想要排除的ip
sleep 5
ip=$myip
while true
ipnow=`export ALL_PROXY=socks5://127.0.0.1:40000 && curl https://chat.openai.com/cdn-cgi/trace | grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b'`
echo "current ip is "$ipnow "excluded ip is" $ip >> /var/log/warp.log
do
if [ -z "$ip" ]; then
echo "IP address is not set" >> /var/log/warp.log
break
elif [[ "$ipnow" != "$ip" ]]; then
echo "IP address meets the expected state,sleep 10 mins" >> /var/log/warp.log
sleep 600
else
echo "Start to change ip address" >> /var/log/warp.log
warp-cli --accept-tos disconnect
sleep 10
warp-cli --accept-tos connect
sleep 10
fi
done
随后我们结合之前的思路对于Dockerfile进行变更,在启动脚本中加入监测脚本,并透过环境变量传递我们需要的ip即可。下边是容器的启动脚本
#!/bin/bash
supervisord
sleep 5
warp-cli --accept-tos register
warp-cli --accept-tos set-mode proxy
warp-cli --accept-tos connect
nohup ./checkip.sh &
tail -f /var/log/warp.log
Dockerfile的内容:
FROM ubuntu:22.10
LABEL mantainer="galtjay<galtjay@foxmail.com>"
#下边这一行主要是完成supervisor和cloudflare-warp的安装
RUN apt update && apt install -y curl gpg supervisor && curl https://pkg.cloudflareclient.com/pubkey.gpg | gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg && echo "deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ jammy main" | tee /etc/apt/sources.list.d/cloudflare-client.list && apt update && apt install cloudflare-warp -y && apt-get clean
#生成supervisor守护配置文件,原本的warp-svc基于systemd进行管理,docker内部不太好实现,切换成supervisor进行守护。
RUN echo "[program:warp-svc]\ncommand=/bin/bash -c /usr/bin/warp-svc\nautostart=true\nautorestart=true\nstartretries=3\nstderr_logfile=/var/log/warp.log\nstdout_logfile=/var/log/warp.log\n" > /etc/supervisor/conf.d/warp.conf
#生成docker启动脚本,输出日志到控制台。每次启动会自动的完成注册,切换模式。假如各位需要嵌入现有的license,此处自行修改。主要修改warp-cli --accept-tos register这条。
COPY init.sh /init.sh
COPY checkip.sh /checkip.sh
RUN chmod +x /init.sh && chmod +x /checkip.sh
#默认暴露40000端口
EXPOSE "40000/tcp"
CMD ["bash","-c","/init.sh"]
github的链接:
https://github.com/galtjay/warpforvps.git
成品docker image url:
docker pull galtjay/warp:v3
TL;DR 废话连篇,其实运行下边这个就可以了
首先 :docker run -d --name warp --network host galtjay/warp:v3
手动验证: chatgpt warp-cli disconnect && sleep 3 &&warp-cli connect && sleep 3&& export ALL_PROXY=socks5://127.0.0.1:40000 && curl https://chat.openai.com/cdn-cgi/trace
找到warp最常分配的那个IP,即可实现对于IP地址进行排除。
How to run: 替换myip成你想要排除的IP即可
docker run -d --name warp --network host -e myip="104.28.222.43,104.28.245.199" galtjay/warp:v3
How to run with docker-compose:注意替换环境变量IP
version: '2'
services:
warp:
image: galtjay/warp:v3
container_name: warp
network_mode: host
environment:
myip: "104.28.222.43,104.28.245.199"