Repl.it部署JS Discord机器人调用API提示IP被ban如何解决
问题说明
使用JavaScript开发的Discord机器人本地运行时,调用第三方API的全部逻辑运行正常;迁移至Repl.it平台做常驻自动化运行后,API请求无法正常返回,接口提示当前请求IP已被封禁,对应业务实现代码如下:
const fetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args)); module.exports = async function player(name, message, channel){ var headers = { 'API-KEY' : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' } var link = 'https://api.rinaorc.com/player/'+name var fetched = await fetch(link, {method: 'GET', headers: headers}) fetched = await fetched.json() if(fetched['message'] === 'Player not found'){ return message.reply('Joueur introuvable') }
故障根因
Repl.it属于公共共享型托管平台,平台上所有项目的对外请求都走共享公网IP池,只要池内任意用户此前对目标API发起过违规、滥用请求,整个IP段都会被API服务商拉入封禁列表。本地运行时走家庭宽带的独立出口IP,没有被封禁标记,因此请求可以正常响应。
可行解决方法
- 配置独立代理转发API请求
自行搭建或购买合规的独享IP/住宅代理服务,修改fetch请求逻辑,让API请求从未被封禁的独立IP出口发出,绕过Repl.it默认的共享出口。node-fetch生态可以搭配https-proxy-agent库快速实现代理配置,参考实现:const fetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args)); const { HttpsProxyAgent } = require('https-proxy-agent'); // 替换为你自行采购/搭建的代理连接地址 const proxyAgent = new HttpsProxyAgent('http://代理认证账号:认证密码@代理服务IP:端口'); module.exports = async function player(name, message, channel){ var headers = { 'API-KEY' : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' } var link = 'https://api.rinaorc.com/player/'+name var fetched = await fetch(link, { method: 'GET', headers: headers, agent: proxyAgent }) fetched = await fetched.json() if(fetched['message'] === 'Player not found'){ return message.reply('Joueur introuvable') } }禁止使用公开免费代理转发请求,这类代理IP大多已被主流服务商标记封禁,同时存在泄露API密钥、请求数据被窃听的风险。
- 更换托管平台
放弃Repl.it部署,选择提供独立出口IP的托管服务,比如各云厂商的轻量应用服务器、Fly.io、Render等平台。这类平台的出口IP不会被大量陌生用户共享,只要自身请求符合API服务商的使用规则,就不会被其他用户的违规行为牵连封禁。 - 联系API服务商申请白名单
持有效API密钥联系目标API的技术支持,说明自身为合法开发者,因Repl.it平台共享IP机制被误封禁,申请将你的API账号加入请求白名单,或申请平台将对应出口IP段移出封禁列表。
内容的提问来源于stack exchange,提问作者Kilyan_T
相关产品推荐
相关产品推荐

