日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Node.js中使用AWS SNS服务发送短信

發(fā)布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Node.js中使用AWS SNS服务发送短信 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

Amazon Simple Notification Service (Amazon SNS) is a web service that coordinates and manages the delivery or sending of messages to subscribing endpoints or clients. In Amazon SNS, there are two types of clients—publishers and subscribers—also referred to as producers and consumers. Publishers communicate asynchronously with subscribers by producing and sending a message to a topic, which is a logical access point and communication channel. Subscribers (i.e., web servers, email addresses, Amazon SQS queues, AWS Lambda functions) consume or receive the message or notification over one of the supported protocols (i.e., Amazon SQS, HTTP/S, email, SMS, Lambda) when they are subscribed to the topic. [1]

正如SNS的介紹所述,SNS是AWS提供的一個消息收發(fā)服務(wù),它包括了諸如消息推送、短信、電子郵件等服務(wù)。AWS官方文檔提供了非常多的內(nèi)容,但提供的示例代碼是以Java或.Net為主,關(guān)于Node.js的直接資料較少,所以這里便來介紹如何使用AWS SNS服務(wù)發(fā)送短信。

Node.js中使用SNS發(fā)送短信

在Node.js中使用AWS的服務(wù),需要先安裝aws-sdk依賴。AWS SDK中包括了眾多服務(wù)的接口,在這里我們需要的是AWS.SNS類。首先,需要實例化AWS.SNS對象,其構(gòu)造函數(shù)的參數(shù)為一個對象,通常需要包括accessKeyId、secretAccessKey、region等屬性。在AWS IAM中,可生成并下載使用的用戶對應(yīng)的accessKeyId及secretAccessKey。需要注意的是,使用的用戶需要在IAM中設(shè)置SNS對應(yīng)的權(quán)限。

const AWS = require('aws-sdk');const options = {accessKeyId: 'String',secretAccessKey: 'String',apiVersion: '2010-03-31', };const snsService = new AWS.SNS(options);

通過AWS.SNS類的實例,就可以使用其進(jìn)行SNS服務(wù)的相關(guān)操作。本文的主題為使用SNS服務(wù)發(fā)送短信,所以接下來即可通過AWS.SNS實例的publish方法以短信形式發(fā)送消息。

AWS SDK for Node.js中,publish方法接收一個Object類型的參數(shù),它其中包括Message、MessageAttributes、MessageStructure、PhoneNumber、Subject、TargetArn以及TopicArn屬性。publish是一個SNS中通用的方法,發(fā)送郵件、消息推送也是通過它進(jìn)行完成,所以在發(fā)送短信時部分的參數(shù)不是必須的。下面是一個發(fā)送短信所需最少參數(shù)的例子。

const params = {Message: text,MessageAttributes: {'AWS.SNS.SMS.SMSType': {DataType: 'String',StringValue: 'Transactional', // Transactional or Promotional},// AWS.SNS.SMS.MaxPrice// AWS.SNS.SMS.SenderId},PhoneNumber: phoneNumber, // 電話號碼,需要遵從E.164格式 };

MessageAttributes中可以包含多個屬性,例如上述例子中的AWS.SNS.SMS.SMSType。MessageAttribute的值主要包括DataType與StringValue或BinaryValue,其根據(jù)DataType的值決定需要的是StringValue或是BinaryValue。StringValue接受一組以UTF-8編碼的字符串,而BinaryValue可以接受任何二進(jìn)制值,例如壓縮后的數(shù)據(jù)、圖片等。

在MessageAttributes的AWS.SNS.SMS.SMSType屬性中,其值需為Transactional或Promotional。二者的區(qū)別為Transactional更為可靠,但其價格通常更為昂貴,一般用于發(fā)送較為重要的消息(如短信驗證碼等),而Promotional一般用于發(fā)送推廣信息。另外AWS.SNS.SMS.MaxPrice為愿意為發(fā)送消息支付以美元為單位的最高金額;AWS.SNS.SMS.SenderId為一個在接收設(shè)備上顯示的自定義ID,但其支持程度受所在地區(qū)限制,如中國便不支持SenderId的顯示。

使用上面定義的參數(shù)調(diào)用publish方法即可發(fā)送短信。publish方法提供了基于Promise的異步使用方法,只需將代碼修改為:const response = await snsService.publish(params).promise();。同理,AWS SDK中的其它方法也可通過添加.promise()將其異步形式從回調(diào)改為基于Promise。

snsService.publish(params, (err, data) => {if (err) {// ...}// ... })

返回結(jié)果

在參數(shù)錯誤、權(quán)限不足等情況下,調(diào)用publish方法將會拋出諸如InvalidParameter、AuthorizationError等錯誤,可根據(jù)其具體錯誤信息判斷錯誤原因。調(diào)用publish方法將會返回下述結(jié)果。其中,MessageId為該消息的唯一標(biāo)識符,當(dāng)開啟CloudWatch Logs后可通過該標(biāo)識符獲取消息的傳輸信息。

{"ResponseMetadata":{"RequestId":"bfb2a062-c201-5d34-a7d8-f5fd653b27f9"},"MessageId":"2b38eec7-a3f0-5679-a116-bb5804cadcb4" }

未收到短信

調(diào)用publish接口成功并正常返回結(jié)果,不代表短信發(fā)送成功。短信發(fā)送失敗的原因可能是下列其中一個:

  • 被電話運營商作為垃圾消息屏蔽
  • 目標(biāo)已加入黑名單
  • 電話號碼無效
  • 消息正文無效
  • 電話運營商已屏蔽此消息
  • 電話運營商目前無法訪問/不可用
  • 電話已屏蔽SMS
  • 電話已加入黑名單
  • 電話當(dāng)前無法訪問/可用
  • 電話號碼已退出
  • 此傳輸會超過最高價格
  • 嘗試聯(lián)系電話時發(fā)生未知錯誤

publish方法返回的結(jié)果無法得知短信發(fā)送是否成功,只有在開啟CloudWatch Logs功能后才能從日志中獲取短信是否發(fā)送成功及發(fā)送失敗的原因。

發(fā)送短信至多個號碼

使用AWS SNS可以實現(xiàn)同時發(fā)送短信至多個手機號碼,其中一種實現(xiàn)方法即為多次調(diào)用publish方法向不同號碼發(fā)送短信。但重復(fù)多次調(diào)用publish方法需要耗費更多的時間,所以在此也可選用另一種方法,即使用Topic發(fā)送短信至多個號碼。該方法的步驟是在創(chuàng)建一個topic后,為多個手機號碼訂閱該topic。訂閱后在發(fā)送消息時,會將消息發(fā)送至訂閱該topic的端點中,此處的端點即為電話號碼。

在發(fā)送信息至多個號碼前,需要創(chuàng)建一個新的Topic并使用subscribe方法為發(fā)送的號碼訂閱該Topic。Topic即一個消息信道,當(dāng)有消息發(fā)送至topic中時,SNS服務(wù)將會將該消息發(fā)送至訂閱該topic的終端節(jié)點中。Topic可通過AWS Console創(chuàng)建,也可通過AWS SDK中的createTopic方法創(chuàng)建。

通過SDK調(diào)用createTopic創(chuàng)建Topic,需要包括Name、Attributes、Tags三個參數(shù),其中Name為必須的參數(shù)。Attributes參數(shù)。

const params = {Name: 'STRING_VALUE', // Topic 名稱Attributes: {'<attributeName>': 'STRING_VALUE',/* '<attributeName>': ... */},Tags: [{Key: 'STRING_VALUE', // Tag keyValue: 'STRING_VALUE', // Tag value},// ...], };const response = await snsService.createTopic(params).promise(); // response.TopicArn

完成topic的創(chuàng)建之后,即可為需要發(fā)送短信的電話號碼訂閱所創(chuàng)建的topic。為電話號碼訂閱topic需要使用subscribe方法,它必填的參數(shù)包括TopicArn、Endpoint以及Protocol。其中,Protocol的值必須為sms,TopicArn的值為創(chuàng)建的Topic Arn地址,Endpoint為訂閱Topic的電話號碼。另外,它的參數(shù)還包括有Attributes以及ReturnSubscriptionArn兩個屬性。Attributes屬性如同publish方法的MessageAttributes屬性,通過它的DeliveryPolicy、FilterPolicy、RawMessageDelivery配置訂閱的相關(guān)設(shè)置。

const params = {Protocol: 'sms',TopicArn: topicArn,// Attributes: {// '<attributeName>': 'STRING_VALUE',// },Endpoint: phoneNumber,// ReturnSubscriptionArn: false, };const response = await snsService.subscribe(params).promise();

在為需要發(fā)送短信的號碼訂閱topic后,即可調(diào)用publish方法發(fā)送消息。發(fā)送短信至多個號碼時調(diào)用publish方法的參數(shù)與發(fā)送至單個號碼大致相同,唯一需要修改的地方為不再需要設(shè)置PhoneNumber,而是需要設(shè)置TopicArn屬性,它的值即為上面調(diào)用createTopic所得到的TopicArn字段。

const params = {Message: text,MessageAttributes: {// 發(fā)送短信至topic同樣可設(shè)置SMSType, MaxPrice, SenderId三個屬性'AWS.SNS.SMS.SMSType': {DataType: 'String',StringValue: 'Transactional', // Transactional or Promotional},// AWS.SNS.SMS.MaxPrice// AWS.SNS.SMS.SenderId},TopicArn: topicArn, // 群發(fā)的topic ARN地址 };const response = await snsService.publish(params).promise();

結(jié)束語

AWS的free tier提供了每月100條的免費短信可以使用,但需要注意的是此處的免費短信接收方為美國號碼。若要發(fā)送短信至國內(nèi)號碼,價格約為0.01531 USD(約0.11元),該價格相對于國內(nèi)服務(wù)商較為昂貴。另外,SNS發(fā)送短信至國內(nèi)時失敗率也較高,且在發(fā)送失敗的情況下也是按正常價格收取費用。在實際開發(fā)中,若不是以海外業(yè)務(wù)為主的情況下,可考慮國內(nèi)服務(wù)商提供的短信服務(wù)。

參考資料

  • Amazon Simple Notification Service Developer Guide
  • AWS Javascript SDK Docs
  • 總結(jié)

    以上是生活随笔為你收集整理的Node.js中使用AWS SNS服务发送短信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。