群发短信 - Twilio
Bulk SMS - Twilio
我正在尝试使用 Twilio SMS 发送 SMS api。我正在尝试发送 2,000 条短信,但只有 200 条已送达。我读到我需要分批发送 100 个,所以我更改了代码以将数组分成 100 个块,每个块只有一个 API 调用它,但这没有用,只有第一个数字在数组中收到一条短信。
您可以执行此操作的另一种方法(根据我的阅读)是您可以同步执行不同的 API 调用,一个接一个,您应该不会有问题。我现在正在一个接一个地发送短信,但我总是在成功发送 200 条后收到 "Error: 20429 - Too Many Requests"。
这是我的代码:
//After I grab all the numbers:
var cleanNumbers = []
let recipientAmount = 1;
let numberStart = 0;
let numbersLen = numbers.length
while (numberStart < numbersLen) {
let maxNumbers = Math.min(numbersLen, numberStart + recipientAmount);
for (let i = numberStart; i < maxNumbers; i++) {
let number = numbers[i]['phone_number'].replace(/[^\d]/g, '')
if (number.length > 10 && number[0] === '1') {
number = number.substring(1)
cleanNumbers.push('1' + number)
}
else {
cleanNumbers.push('1' + number)
}
if (i == maxNumbers - 1) {
var params = {
'body': `${event_sms_message}`,
'messagingServiceSid': 'XXXXXXXXXXXXXXX',
'to': cleanNumbers
}
sendMessage(params)
cleanNumbers = []
numberStart = numberStart + recipientAmount;
}
}
}
调用API的函数
async function sendMessage(params) {
let msg = await client.messages.create(params, function(err, data, message) {
if (err) {
console.log("ERROR:");
console.log(err)
return 'done'
}
else {
console.log("SUCCESS:");
console.log(data)
return 'done'
}
})
.then(message =>
console.log(message.sid)
);
}
有没有人知道更好的路线或者我是否遗漏了什么?
嘿嘿,这里是 Twilio 开发者布道师。
one after another and you shouldn't have problems
这不是您的代码所做的。您在循环中调用 sendMessage
而无需等待它完成。这很可能会导致 X 几乎并行的请求,从而导致 too many request
响应。
解决此问题的一种方法是将您的代码包装到一个异步函数中,然后 await
它。为此,您必须稍微调整 sendMessage
以 return 由 Twilio 帮助程序库 return 编辑的承诺(或直接使用 client.messages.create
)。
async function sendMessage(params) {
return client.messages.create(params)
}
通过这些调整,您可以将循环包装到异步函数中并等待每个请求先成功。
(async () => {
while (numberStart < numbersLen) {
try {
let maxNumbers = Math.min(numbersLen, numberStart + recipientAmount);
for (let i = numberStart; i < maxNumbers; i++) {
let number = numbers[i]['phone_number'].replace(/[^\d]/g, '')
if (number.length > 10 && number[0] === '1') {
number = number.substring(1)
cleanNumbers.push('1' + number)
} else {
cleanNumbers.push('1' + number)
}
if (i == maxNumbers - 1) {
var params = {
'body': `${event_sms_message}`,
'messagingServiceSid': 'XXXXXXXXXXXXXXX',
'to': cleanNumbers
}
await sendMessage(params)
cleanNumbers = []
numberStart = numberStart + recipientAmount;
}
} catch(e) {
console.error(e);
}
}
})();
此代码将等待 client.message.create
成功,您不应再 运行 陷入速率限制错误 (too many requests
)。
如果有帮助请告诉我。 :)
我正在尝试使用 Twilio SMS 发送 SMS api。我正在尝试发送 2,000 条短信,但只有 200 条已送达。我读到我需要分批发送 100 个,所以我更改了代码以将数组分成 100 个块,每个块只有一个 API 调用它,但这没有用,只有第一个数字在数组中收到一条短信。
您可以执行此操作的另一种方法(根据我的阅读)是您可以同步执行不同的 API 调用,一个接一个,您应该不会有问题。我现在正在一个接一个地发送短信,但我总是在成功发送 200 条后收到 "Error: 20429 - Too Many Requests"。
这是我的代码:
//After I grab all the numbers:
var cleanNumbers = []
let recipientAmount = 1;
let numberStart = 0;
let numbersLen = numbers.length
while (numberStart < numbersLen) {
let maxNumbers = Math.min(numbersLen, numberStart + recipientAmount);
for (let i = numberStart; i < maxNumbers; i++) {
let number = numbers[i]['phone_number'].replace(/[^\d]/g, '')
if (number.length > 10 && number[0] === '1') {
number = number.substring(1)
cleanNumbers.push('1' + number)
}
else {
cleanNumbers.push('1' + number)
}
if (i == maxNumbers - 1) {
var params = {
'body': `${event_sms_message}`,
'messagingServiceSid': 'XXXXXXXXXXXXXXX',
'to': cleanNumbers
}
sendMessage(params)
cleanNumbers = []
numberStart = numberStart + recipientAmount;
}
}
}
调用API的函数
async function sendMessage(params) {
let msg = await client.messages.create(params, function(err, data, message) {
if (err) {
console.log("ERROR:");
console.log(err)
return 'done'
}
else {
console.log("SUCCESS:");
console.log(data)
return 'done'
}
})
.then(message =>
console.log(message.sid)
);
}
有没有人知道更好的路线或者我是否遗漏了什么?
嘿嘿,这里是 Twilio 开发者布道师。
one after another and you shouldn't have problems
这不是您的代码所做的。您在循环中调用 sendMessage
而无需等待它完成。这很可能会导致 X 几乎并行的请求,从而导致 too many request
响应。
解决此问题的一种方法是将您的代码包装到一个异步函数中,然后 await
它。为此,您必须稍微调整 sendMessage
以 return 由 Twilio 帮助程序库 return 编辑的承诺(或直接使用 client.messages.create
)。
async function sendMessage(params) {
return client.messages.create(params)
}
通过这些调整,您可以将循环包装到异步函数中并等待每个请求先成功。
(async () => {
while (numberStart < numbersLen) {
try {
let maxNumbers = Math.min(numbersLen, numberStart + recipientAmount);
for (let i = numberStart; i < maxNumbers; i++) {
let number = numbers[i]['phone_number'].replace(/[^\d]/g, '')
if (number.length > 10 && number[0] === '1') {
number = number.substring(1)
cleanNumbers.push('1' + number)
} else {
cleanNumbers.push('1' + number)
}
if (i == maxNumbers - 1) {
var params = {
'body': `${event_sms_message}`,
'messagingServiceSid': 'XXXXXXXXXXXXXXX',
'to': cleanNumbers
}
await sendMessage(params)
cleanNumbers = []
numberStart = numberStart + recipientAmount;
}
} catch(e) {
console.error(e);
}
}
})();
此代码将等待 client.message.create
成功,您不应再 运行 陷入速率限制错误 (too many requests
)。
如果有帮助请告诉我。 :)