使用Pushbullet API批量发送短信时遭遇500错误的咨询
Pushbullet API批量发送短信出现500错误的排查与解决
问题描述
我在公司项目中使用Pushbullet API实现短信自动发送功能,单条或少量发送时一切正常,但批量发送多条短信时,浏览器控制台会出现POST https://api.pushbullet.com/v2/texts 500错误。请问这是否因发送频率过高导致?该如何解决?
调用API的代码
sendSms: async function ( iden , numero , smsBody ) { let authHeaders = new Headers(); var body = {"data":{}} if ( (iden.length === 0 ) || ( numero.length === 0 ) || ( smsBody.length === 0 ) ) { console.warn("SMS SEND NOT VALID " + iden + ' ' + numero + ' ' + smsBody) return } authHeaders.append( 'Content-Type', 'application/json' ); authHeaders.append( 'Access-Token', APIkey ); body.data.target_device_iden = iden body.data.addresses=[] body.data.addresses.push(numero) body.data.message = smsBody console.log(JSON.stringify(body)) let response = await fetch ( 'https://api.pushbullet.com/v2/texts', { method: 'POST', headers: authHeaders, body: JSON.stringify(body) } ) return }
问题原因判断
大概率是发送频率过高触发了Pushbullet的API限流机制。虽然500是服务器内部错误,但批量高频请求时,服务端可能因过载或限流策略返回该错误(部分API不会严格返回429限流状态码,而是用500作为兜底)。另外,批量请求时如果未控制异步请求的并发数,同时发起过多连接也可能触发服务端防护逻辑。
解决方法
添加请求间隔,控制发送频率
不要同时发起所有请求,给每个请求之间设置固定延迟,避免触发限流。示例代码:// 分批延迟发送的封装函数 async function batchSendSms(smsList) { const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); // 每条短信间隔1秒发送(可根据实际情况调整) for (const sms of smsList) { await sendSms(sms.iden, sms.numero, sms.smsBody); await delay(1000); } }检查并遵守API调用配额
确认Pushbullet的API调用速率限制,免费版通常有严格的频率限制,批量发送必须遵守对应规则。若使用付费版,可联系官方调整配额。完善错误处理,精准定位问题
当前代码未处理错误响应,建议增加状态码判断和错误信息打印,确认是否为限流问题,甚至实现自动重试逻辑:let response = await fetch('https://api.pushbullet.com/v2/texts', { method: 'POST', headers: authHeaders, body: JSON.stringify(body) }); if (!response.ok) { const errorData = await response.json().catch(() => response.text()); console.error(`短信发送失败: ${response.status}`, errorData); // 若为429限流,自动重试(带指数退避) if (response.status === 429) { const retryAfter = parseInt(response.headers.get('Retry-After')) || 5; await new Promise(resolve => setTimeout(resolve, retryAfter * 1000)); return await sendSms(iden, numero, smsBody); } }尝试合并批量请求(若API支持)
检查Pushbullet的/v2/texts接口是否允许一次性发送短信到多个地址,若支持可修改请求body,将多个号码放入同一个请求的addresses数组中,减少请求次数:// 示例:同一请求发送给多个号码(需确认API支持) body.data.addresses = ['号码1', '号码2', '号码3'];
内容的提问来源于stack exchange,提问作者Dario Danti
相关产品推荐
相关产品推荐

