분류 Nodejs

Node.js 및 Express로 SMS 메시지를 보내고 받는 방법

컨텐츠 정보

  • 조회 1,196 (작성일 )

본문

이 기사는 원래 Nexmo 블로그에 실 렸지만 dev.to 커뮤니티를 위해 더 많은 컨텐츠를 추가하고 싶었습니다. 따라하고 싶지 않지만 시도해보고 싶다면 Glitch에 코드를 넣고 다른 국가의 Nexmo 전화 번호로 Nexmo 응용 프로그램을 설정 한 다음 SMS 메시지를 + 442038973497 또는 +19373652539를 입력하고 자동 응답기로 재생하십시오. 당신이 당신의 국가에 대한 번호를 설정하려면 트위터에 알려주십시오, 나는 그것을 프로비저닝하고 다른 사람들이 사용할 수 있도록 여기에 게시물을 업데이트 할 것입니다.


https://dev.to/nexmo/how-to-send-and-receive-sms-messages-with-node-js-and-express-4g46 


Nexmo에는 전 세계 어디에서나 많은 양의 SMS를 보내고 받을 수 있는 몇 가지 API가 있습니다. 가상 전화 번호를 받으면 API를 사용하여 발신 메시지 ( "보내기")와 수신 메시지 ( "수신")를 관리 할 수 ​​있습니다. 이 기사에서는 Node.js 및 Express로 SMS 메시지를 보내고 받는 방법을 배웁니다.


먼저 Node.js와 이전 SMS API (Nexmo의 첫 번째 API)를 사용하여 SMS를 전송 한 다음 새 메시지 API를 사용하여 동일한 SMS를 전송하도록 해당 코드를 다시 작성합니다. 그런 다음 express를 사용하여 SMS 메시지를 수신 할 수 있는 Webhook을 구축합니다. 이 기사에서는 SMS 메시지 송수신에 중점을 두지 만 Facebook Messenger, Viber 또는 Whatsapp와 메시지를 주고 받으려면 Messages API를 사용하여 메시지를 주고 받을 수 있습니다.


여기에 구축 중인 응용 프로그램을 확장하여 수신 SMS 메시지에 회신하거나 보다 복잡한 대화식 요소를 포함 시키고 SMS 요구에 맞는 자동 응답기를 빠르게 시작할 수 있습니다.


이 튜토리얼의 코드는 GitHub & Glitch에서 찾을 수 있습니다.


전제 조건 

시작하기 전에 다음 사항을 확인하십시오.

  • Nexmo 계정
  • 컴퓨터에 설치된 Node.js
  • 로컬 컴퓨터의 코드를 외부 세계에서 액세스 할 수 있게 하는 ngrok
  • Nexmo CLI : npm install -g nexmo-cli

SMS API를 사용하여 SMS 메시지 보내기 


SMS API는 최초의 Nexmo API이며 전화 번호로 SMS 메시지를 보내는 데 사용됩니다.


Node.js 종속성 설치 


먼저 NPM 패키지를 초기화하십시오. 그렇지 않으면 이전 버전의 NPM이 package.json없이 패키지 설치에 대해 불평합니다. init에 기본값을 사용하고 nexmo Node.js 패키지를 설치하십시오.


$ npm init
$ npm install nexmo


종속성 초기화 


새로운 JavaScript 파일을 만들고 index.js라고 하겠습니다.


$ touch index.js


앞에서 만든 index.js 파일에서 이전에 설치 한 Nexmo 노드 라이브러리를 초기화 해야 합니다.


const Nexmo = require('nexmo')

const nexmo = new Nexmo({
  apiKey: NEXMO_API_KEY,
  apiSecret: NEXMO_API_SECRET
})


거기에 있는 값을 실제 API 키 및 비밀번호로 바꾸십시오. Nexmo 대시 보드의 "시작하기"페이지에서 찾을 수 있습니다.


SMS 메시지 보내기 


Nexmo 라이브러리에는 SMS API를 사용하여 SMS를 보내는 방법이 있으며 nexmo.message.sendSms입니다. 이 메소드는 매개 변수 3 개의 문자열과 오브젝트를 사용합니다. SMS를 보낼 Nexmo 번호, SMS를 전달할 전화 번호, 메시지 텍스트 및 SMS 인코딩 옵션. 또한 API 요청이 완료되면 호출되는 콜백도 허용합니다.


응답 데이터에는 전송 된 모든 메시지에 대한 배열과 상태 정보가 포함됩니다. 대부분의 경우 해당 배열의 요소는 1 개이지만 SMS가 160자를 초과하면 여러 부분으로 분할 된 SMS로 분할 된 다음 배열에 전송 된 각 부분에 대한 데이터가 포함됩니다. 메시지 상태가 0이면 SMS가 성공적으로 전송 된 것입니다. 그렇지 않으면 메시지의 오류 데이터가 메시지의 오류 텍스트 속성에 있습니다.


내 텍스트에는 그림 이모티콘이 있기 때문에 옵션 개체에 유니 코드 유형을 설정하고 있습니다. 그렇지 않으면 해당 그림 이모티콘이 네트워크에서?로 전송됩니다.


let text = "?Hello from Nexmo";

nexmo.message.sendSms("Nexmo", "TO_NUMBER", text, {
  type: "unicode"
}, (err, responseData) => {
  if (err) {
    console.log(err);
  } else {
    if (responseData.messages[0]['status'] === "0") {
      console.log("Message sent successfully.");
    } else {
      console.log(`Message failed with error: ${responseData.messages[0]['error-text']}`);
    }
  }
})


이동 통신사 네트워크에서 영숫자 발신자 ID를 지원하는 경우 FROM은 전화 번호 대신 텍스트가 될 수 있습니다 (예 : Nexmo). 네트워크가 영숫자 발신자 ID (예 : 미국)를 지원하지 않는 경우 전화 번호 여야 합니다.


SMS를 보내려는 국가에 따라 SMS를 보내는 전화 번호를 소유해야 하는 규정이 있으므로 Nexmo 전화 번호를 구입 해야 합니다. Nexmo 대시 보드 또는 CLI를 통해 수행 할 수 있습니다.


$ nexmo number:buy --country_code US --confirm


다음을 사용하여 코드를 실행하고 SMS 메시지를 받을 수 있습니다.


$ node index.js


새 메시지 API를 사용하여 SMS 메시지 보내기 


Messages API라는 문자 메시지 전송을 처리하는 최신 Nexmo API가 있습니다. SMS, Facebook Messenger, Viber 및 Whatsapp와 같은 다른 채널을 통해 메시지를 보낼 수 있는 다중 채널 API입니다. API는 현재 베타 버전이므로 API를 사용하여 동일한 SMS 메시지를 보내려면 베타 버전의 Nexmo 노드 라이브러리를 설치해야 합니다.


$ npm install nexmo@beta


ngrok 실행 


이전에 ngrok을 사용해 본 적이 없다면 사용 방법을 설명하는 블로그 게시물이 있습니다. ngrok에 익숙한 경우 3000 포트에서 http로 실행하십시오.


$ ngrok http 3000


ngrok을 실행 한 후에는 무작위로 보이는 URL을 제공하여 나중에 웹 후크의 기본으로 사용할 것입니다. 광산은 다음과 같습니다 : http://5b5c1bd0.ngrok.io.


메시지 응용 프로그램 만들기 


메시지 API와 상호 작용하려면 요청을 인증하기 위해 Nexmo 플랫폼에서 메시지 응용 프로그램을 만들어야 합니다. 컨테이너, 메타 데이터와 같은 애플리케이션을 생각하면 Nexmo 플랫폼에서 모든 데이터를 그룹화 할 수 있습니다. Nexmo 대시 보드를 사용하여 이름을 생성하고 이름과 인바운드 URL 및 상태 URL이 필요합니다.


또한 키 파일을 디스크에 저장합니다. 응용 프로그램은 공개 / 개인 키 시스템에서 작동하므로 응용 프로그램을 만들 때 공개 키가 생성되고 Nexmo와 함께 유지되고 개인 키가 생성되고 Nexmo와 함께 유지되지 않고 응용 프로그램 생성을 통해 사용자에게 반환됩니다. 나중에 개인 키를 사용하여 라이브러리 호출을 인증합니다.


이전 단계에서 얻은 ngrok URL을 사용하고 각 필드에 / webhooks / status 및 / webhooks / inbound를 추가하여 필드를 채우십시오. 메시지가 메시지 API로 오면 메시지에 대한 데이터가 인바운드 URL로 전송됩니다. API를 사용하여 메시지를 보내면 메시지 상태에 대한 데이터가 상태 URL로 전송됩니다.


Create Nexmo Messages Application 


종속성 초기화 


앞에서 만든 파일의 내용을 바꾸겠습니다. 앞에서 만든 index.js 파일에서 이전에 설치 한 Nexmo 노드 라이브러리를 초기화해야 합니다.


const Nexmo = require('nexmo')

const nexmo = new Nexmo({
  apiKey: NEXMO_API_KEY,
  apiSecret: NEXMO_API_SECRET,
  applicationId: NEXMO_APPLICATION_ID,
  privateKey: NEXMO_APPLICATION_PRIVATE_KEY_PATH
})


거기에 있는 값을 실제 API 키 및 비밀, 방금 작성한 애플리케이션의 애플리케이션 ID 및 저장 한 개인 키의 경로로 바꾸십시오.


동일한 SMS 메시지 보내기 


Messages API로 SMS 메시지를 보내려면 베타 버전의 Nexmo 노드 라이브러리에서 nexmo.channel.send 메소드를 사용합니다. 이 메소드는 수신자, 발신자 및 컨텐츠에 대한 정보와 함께 오브젝트를 매개 변수로 승인합니다. 채널마다 다르므로 언급 된 다른 채널에 대해서는 API 설명서를 확인해야 합니다.


SMS의 경우 받는 사람과 보낸 사람의 유형은 sms이며 개체에는 숫자 속성도 포함 되어야 합니다. 컨텐츠 객체는 문자 유형과 문자 메시지를 허용합니다. 콜백은 오류 및 응답 객체를 반환하며 작업의 성공 또는 실패에 대한 메시지를 기록합니다.

let text = "?Hello from Nexmo";

nexmo.channel.send(
  { "type": "sms", "number": "TO_NUMBER" },
  { "type": "sms", "number": "Nexmo" },
  {
    "content": {
      "type": "text",
      "text": text
    }
  },
  (err, responseData) => {
    if (err) {
      console.log("Message failed with error:", err);
    } else {
      console.log(`Message ${responseData.message_uuid} sent successfully.`);
    }
  }
);


다음을 사용하여 코드를 실행하고 SMS 메시지를 받을 수 있습니다.

$ node index.js

이제 두 개의 다른 Nexmo API를 사용하여 동일한 SMS 메시지를 보냈습니다. Messages API는 사용법이 훨씬 장황 하지만 두 API 모두 동일한 작업을 수행하는 방법이 하나만 필요합니다.


SMS 메시지 수신 


Nexmo 전화 번호가 SMS 메시지를 수신하면 Nexmo는 해당 메시지를 Nexmo 대시 보드에서 지정한 Webhook에 전달합니다. 웹 후크 URL을 설정하려면 Nexmo 대시 보드에서 전화 번호 옆에 있는 작은 톱니 바퀴 아이콘으로 이동하여 YOUR_NGROK_URL / webhooks / inbound로“인바운드 웹 후크 URL”필드를 채우십시오. 실제 ngrok URL을 바꾸는 것을 잊지 마십시오.


Set Inbound Webhook URL on the Nexmo Dashboard 


웹 서버 만들기 


이 목적을 위해 가장 인기 있고 사용하기 쉬운 Node.js 프레임 워크 중 하나이므로 express를 사용하여 웹 서버를 만들 것입니다. 또한 인바운드 URL에 대한 요청 본문을 살펴볼 것이므로 본문 구문 분석기를 설치하고 npm을 사용하여 표현해야 합니다.

$ npm install express body-parser


이를 위해 새 파일을 만들어 server.js라고 합니다.


$ touch server.js

bodyParser의 JSON 구문 분석기를 사용하고 urlencoded 옵션을 true로 설정하는 기본 Express 애플리케이션을 작성합니다. 우리가 만든 server.js 파일을 작성해 봅시다. 우리는 서버가 포트 3000을 사용하여 포트를 사용할 것입니다. 포트 3000에서 이미 ngrok을 실행하고 있습니다.


const app = require('express')()
const bodyParser = require('body-parser')

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))

app.listen(3000)


인바운드 URL에 대한 Webhook 만들기 


인바운드 URL의 경우 /webhooks/inbound에 대한 사후 처리기를 만들고 요청 본문을 콘솔에 기록하기 만하면 됩니다. Nexmo에는 재시도 메커니즘이 있으므로 URL이 200으로 응답하지 않으면 메시지를 계속 다시 보내므로 200 상태로 다시 보내 드리겠습니다.


app.post('/webhooks/inbound-message', (req, res) => {
  console.log(req.body);

  res.status(200).end();
});


다음을 사용하여 코드를 실행할 수 있습니다.


$ node server.js


사용해보십시오 


제 휴대폰에서 Nexmo 번호로 SMS 메시지를 보냅니다. 코드를 실행 한 터미널 창에 메시지가 기록되는 것을 볼 수 있습니다. 다음과 유사합니다.


Received SMS message with Nexmo 

그것이 효과가 있기를 바랍니다. Nexmo API와 Node.js로 SMS 메시지를 보내고 받는 방법을 배웠습니다.


자동 응답 


SMS 메시지를 보내고 받는 가장 일반적인 사용 사례 중 하나는 자동 응답입니다. 

이 예제를 한 단계 더 발전시키고 싶었으므로 방금 배운 내용으로 SMS 자동 응답기를 작성하겠습니다. 

지금까지 배운 내용을 인바운드 Webhook에서 함께 결합하면 들어오는 모든 SMS 메시지에 SMS로 응답하고 SMS를 보내는 SMS 자동 응답자가 있습니다.


app.post('/webhooks/inbound', (req, res) => {
  console.log(req.body);

  nexmo.channel.send(
    { "type": "sms", "number": req.body.msisdn },
    { "type": "sms", "number": req.body.to },
    {
      "content": {
        "type": "text",
        "text": text
      }
    },
    (err, responseData) => {
      if (err) {
        console.log("Message failed with error:", err);
      } else {
        console.log(`Message ${responseData.message_uuid} sent successfully.`);
      }
    }
  );

  res.status(200).end();
});


나는 NumbersAPI의 팬이기 때문에 자동 응답에도 사용할 것이라고 생각했습니다. 자동 응답을 변경하여 수신 SMS 메시지의 텍스트가 숫자인지 확인한 다음 Numbers API에서 해당 숫자에 대한 사실을 얻는 데 사용하려고 합니다. 사실이 있으면 SMS 메시지와 함께 다시 보냅니다.


먼저 HTTP 요청 라이브러리를 설치해야 합니다. Node.js의 기본 http 라이브러리를 좋아하지 않습니다. 우연히도 이를 요청이라고 합니다. npm을 통해 설치하겠습니다.


$ npm install request

/webhooks/inbound 엔드 포인트에 POST 요청이 있을 때마다 http://numbersapi.com/${number}에 요청합니다. 여기서 number는 수신 한 SMS의 번호입니다. 텍스트를 정수로 파싱해야 합니다. 42는 삶의 의미이기 때문에 0 대신 42로 기본 설정합니다.


수신 SMS에 응답하기 전에 /webhooks/inbound 경로를 업데이트하여 NumbersAPI에 요청합니다.


app.post('/webhooks/inbound', (req, res) => {
  console.log(req.body)

  var number = parseInt(req.body.text) || 42;

  request(`http://numbersapi.com/${number}`, (error, response, body) => {
    if (error) {
      text = "The Numbers API has thrown an error."
    } else {
      text = body
    }

    nexmo.channel.send(
      { "type": "sms", "number": req.body.msisdn },
      { "type": "sms", "number": req.body.to },
      {
        "content": {
          "type": "text",
          "text": text
        }
      },
      (err, responseData) => {
        if (err) {
          console.log("Message failed with error:", err);
        } else {
          console.log(`Message ${responseData.message_uuid} sent successfully.`);
        }
      }
    );

    res.status(200).end();
  })
});

사용해보십시오 


참고로 최종 server.js 파일은 다음과 같아야 합니다. 이 과정을 오랫동안 수행했다면 터미널에서 node server.js를 다시 실행하여 서버를 다시 시작해야 합니다. 번호가 포함 된 SMS 메시지를 Nexmo 전화 번호로 보내고 자동 응답자와 상호 작용을 시작하십시오.


편집자 주 : 메시지 API에 대해 자세히 알아보기 


Messages API에 대해 더 알고 싶으시다면 샌프란시스코의 Vonage Campus 행사에 참석하십시오. Alex (이 게시물의 저자)는 말하는 웹 사이트 구축에 대한 워크샵을 진행할 예정입니다. 그는 JavaScript와 관련된 모든 것에 대해 이야기하기를 좋아하므로 Nexmo 사용자와 이야기를 나눌 수 있는 좋은 기회입니다.