You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:42:41