https://d226lax1qjow5r.cloudfront.net/blog/blogposts/throttling-bulk-sms-campaigns-with-python-and-vonage-sms-api/python_sms-throttling_1200x600.png

PythonとVonage SMS APIによるバルクSMSキャンペーンのスロットリング

最終更新日 August 18, 2021

所要時間:1 分

はじめに

バルクSMSは、マーケティングチームが販促キャンペーンを行う必要があるときに便利です。組織はまた、大規模なグループに情報を渡すためにそれらを配置することができます。

大勢の聴衆に反応を得るために一括SMSキャンペーンを送信する場合、問題が生じることがあります。たとえば、一度に何千ものインバウンドレスポンスを受信すると、チームが圧倒される可能性があります。この問題の1つの解決策は、スロットルを使用することです。たとえば、バッチ、特定の期間、またはその両方でメッセージを送信するようにキャンペーンを設計することができます。

この記事では、Django REST フレームワークと Vonage Messages API を使って、Python で一括 SMS スロットリングを実装する方法を教えます。このチュートリアルで作るウェブアプリケーションでは、指定した時間間隔で複数のユーザに一括でメッセージを送ることができます。

Vonage Messages API メッセージAPIにより、開発者は SMS ベースのアプリケーションを開発し、SMS、WhatsApp、Messenger などのアプリにメッセージング機能を実装することができます。 Djangoはウェブアプリケーションの構築に使用される Python フレームワークです。 Django REST フレームワークにより、開発者は RESTful APIを構築できます。

前提条件

  1. 無料のVonage APIアカウント

  2. Vonageのアプリケーションです。このガイドに従って このガイドに従ってに従ってVonageダッシュボードにアプリケーションを作成してください。

  3. Python(バージョン3.6以降)。Pythonは 公式ウェブサイト.

  4. Python パッケージマネージャ pip.pipのインストール方法は pipのインストール方法は.

  5. Pythonツール virtualenv隔離された Pythonプロジェクトのための隔離された仮想環境を作成するためのPythonツール.

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

セットアップとインストール

まず、プロジェクトの依存関係を設定し、必要なモジュールを pip でインストールします。次に、チュートリアル用の Django プロジェクトを作成します。

依存関係のインストール

まず、新しいディレクトリと仮想環境を作成します。次に、新しく作成した仮想環境をアクティブにします:

mkdir test_project && cd test_project
python -m venv env
source env/bin/activate

上記のコマンドは以下のパッケージをインストールした:

  1. DjangoDjango フレームワークパッケージ。

  2. djangorestframework: Django で API を作成するための Django REST フレームワークです。

  3. django-cors-headers:これにより、APIは他のサーバーに対してクロスオリジンリクエストを行うことができます。

  4. vonageVonage Python サーバー SDK。

Djangoプロジェクトを作成する

では django-adminユーティリティを使って vonage_project:

django-admin startproject vonage_project

次に Django-cors-headersを設定する必要があります。こうすることで、他のオリジンやフロントエンドのアプリケーションが、あなたの Django アプリケーションにリクエストできるようになります。アプリケーションの MIDDLEWAREファイルの settings.pyファイルを開き、以下のミドルウェア・クラスを追加してください:

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

次に myappというDjangoアプリを作成します:

cd vonage
django-admin startapp myapp

一括SMS機能の作成

このセクションでは、Vonage SMS APIを使用してバルクSMS機能を設定します。また、スロットリング機能も実装します。

Vonageライブラリの初期化

通常、メッセージ送信に Vonage API を使うには Vonage ライブラリを初期化する必要があります。しかし、新しい Vonage Messages API はベータ版で、Python はまだサポートされていません。しかし、Messages APIを使うことはできます。

まず、以下のコードを views.pyファイルに追加する:

import base64

vonageCredentials = 'API_KEY:API_SECRET'
encodedData = vonageCredentials.encode("utf-8")
b64value = b64encode(encodedData).decode("ascii")

上記のコードで API_KEYAPI_SECRETの値を Vonage ダッシュボードの値に置き換えてください。変数 vonageCredentials変数はあなたの Vonage 認証情報を受け取ります。 'API_KEY: API_SECRET.'次に、認証情報を含む文字列を base64 形式でエンコードおよびデコードし、ASCII 標準文字として渡します。

SMSメッセージを送信するビューの作成

次に、SMSメッセージを送信するビューを以下のように作成します。 views.pyビューを作成する:

from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import parser_classes
from rest_framework.parsers import JSONParser
import json
import requests
import base64
import time
from django.http.response import JsonResponse

vonageCredentials = 'API_KEY:API_SECRET'
encodedData = vonageCredentials.encode("utf-8")
b64value = base64.b64encode(encodedData).decode("ascii")

@ csrf_exempt
@ parser_classes(\[JSONParser])
def sendMessage(self, request):
    pass

上のコードでは csrf_exempt, parser_classesそして JSONParserクラスをインポートしました。また json, JsonResponseなどのモジュールもインポートしました。そして sendMessage関数を作成し、ここにメッセージを送信するロジックを記述します。

次に sendMessageコードを追加します。以下のように修正します。 view.pyを次のように修正します:

def sendMessage(self, request):
    if request.method == 'POST':
        body_unicode = request.body.decode('utf-8')
        body_data = json.loads(body_unicode)

        sender = body_data['sender']
        recipients = body_data['recipients']
        message_string = body_data['message_string']
        batch_size = body_data['batch_size']
        delay_period = body_data['delay_period']

上記のコードでは、ビューがPOSTリクエストを受け付けることを行で指定しています: request.method == 'POST'.そして、リクエストボディをJSON形式でデコードしました。その後、リクエストのボディを、それが含むアイテムにストリップしました。項目は、ユーザーから受け取った以下の入力です:

  1. senderメッセージ送信者の情報を格納する変数。

  2. recipientsSMS受信者の電話番号のリスト。

  3. message_string一括SMSキャンペーンで送信するテキスト。

  4. batch_size: 一度にSMSを送信する受信者の数を指定します。

  5. delay_periodSMS バッチの送信間隔(秒単位)。

次に、受信者の電話番号リストをバッチに分割する関数を作成します。以下のコードを sendMessageファイルの views.pyファイルに追加します:

def batch(recipients, batch_size=1):
    for i in range(0, len(recipients), batch_size):
        yield recipients[i:min(i + batch_size, len(recipients))]

という関数を定義した。 batch.この関数は2つのパラメーターを受け取る。 recipientsリストと batch_size一度にメッセージを送信したい受信者の数を表す整数です。forループとyieldキーワードを使用して、電話番号のバッチを作成します。これが不明な場合は 範囲yieldキーワードの働きについてを参照してください。

次に、メッセージを送信できるようにするためのロジックを実装します。以下のように sendMessageビューを修正します:

@ csrf_exempt
@ parser_classes([JSONParser])
def sendMessage(request):
    if request.method == 'POST':
        body_unicode = request.body.decode('utf-8')
        body_data = json.loads(body_unicode)

        sender = body_data['sender']
        recipients = body_data['recipients']
        message_string = body_data['message_string']
        batch_size = body_data['batch_size']
        delay_period = body_data['delay_period']

        for eachBatch in batch(recipients, batch_size):
            for number in eachBatch:
                response = requests.post('https://api.nexmo.com/v0.1/messages',
                     headers={
                         "Authorization": "Basic %s" % b64value,
                         "Content-type": "application/json",
                         "Accept": "application/json"},
                     json={
                         "to": {
                             "type": "sms",
                             "number": number
                         },
                         "from": {
                             "type": "sms",
                             "number": sender
                         },
                         "message": {
                             "content": {
                                 "type": "text",
                                 "text": message_string
                             }
                         }
                     })
                print("message sent to ", number)
            time.sleep(delay_period)
        try:
            return JsonResponse("OK", status=200, safe=False)

        except Exception as e:
            return JsonResponse({'the error is': str(e)}, status=403)

関数の中には2つのforループがある。 sendSmsMessage関数がある。外部 for文が電話番号のバッチをループしています。 batch関数を使って電話番号のバッチをループしています。POSTリクエストから`batch_size'を使って受信者の電話番号をバッチに分割する。

次に、すべてのバッチの各番号を受け取り、https://api.nexmo.com/v0.1/messages エンドポイントで Vonage Messages API に POST リクエストを行う内部ループがある。リクエストヘッダには、先ほど "b64value" として作成した、base64 エンコードされた認証情報が含まれている。また、Messages API に配信する JSON ペイロードも含まれている。JSONペイロードには以下の情報が含まれる:

  • senderメッセージの送信者に関する情報を格納する変数。

  • recipientsSMS受信者の電話番号のリスト。

  • message_string一括SMSに含まれるテキスト。

  • batch_size一度にメッセージを送信する受信者の数。

  • delay_periodSMSを送信する間隔を指定します。

Messages APIエンドポイントへのリクエストが成功すると、SMSメッセージは受信者に送られ、コードは送信されたメッセージを知らせるメッセージを端末に表示します。その後、コードは次のバッチの送信に取り掛かります。

バッチ内の全受信者にメッセージを送信した後、親のforループは次のように設定した遅延時間の後に実行されます。 time.sleep(delay_period).

SMSメッセージの送信が完了すると、コードは 200 - OK JsonResponse.

完全な views.pyコードは以下の通り:

from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import parser_classes
from rest_framework.parsers import JSONParser
import json
import requests
import base64
import time
from django.http.response import JsonResponse


# Create your views here.
vonageCredentials = 'ba779f8e:fFImpyBSezdXV1Nd'
encodedData = vonageCredentials.encode("utf-8")
b64value = base64.b64encode(encodedData).decode("ascii")
print(b64value)


@ csrf_exempt
@ parser_classes([JSONParser])
def sendMessage(request):
    if request.method == 'POST':
        body_unicode = request.body.decode('utf-8')
        body_data = json.loads(body_unicode)

        sender = body_data['sender']
        recipients = body_data['recipients']
        message_string = body_data['message_string']
        batch_size = body_data['batch_size']
        delay_period = body_data['delay_period']

        for eachBatch in batch(recipients, batch_size):
            for number in eachBatch:
                response = requests.post('https://api.nexmo.com/v0.1/messages',
                     headers={
                         "Authorization": "Basic %s" % b64value,
                         "Content-type": "application/json",
                         "Accept": "application/json"},
                     json={
                         "to": {
                             "type": "sms",
                             "number": number
                         },
                         "from": {
                             "type": "sms",
                             "number": sender
                         },
                         "message": {
                             "content": {
                                 "type": "text",
                                 "text": message_string
                             }
                         }
                     })
                print("message sent to ", number)
            time.sleep(delay_period)
        try:
            return JsonResponse("OK", status=200, safe=False)

        except Exception as e:
            return JsonResponse({'the error is': str(e)}, status=403)


def batch(recipients, batch_size=1):
    for i in range(0, len(recipients), batch_size):
        yield recipients[i:min(i + batch_size, len(recipients))]

URLパスの定義

リクエストを受け取るためのビューを作成したので、ユーザがリクエストを行うためにビューにアクセスするための対応するURLが必要になります。したがって urlpatternsへのパスを urls.pyファイルにパスを追加します。プロジェクトのサブディレクトリに移動し、次のコードを追加します:

from django.urls import path
from myapp.views import sendMessage

urlpatterns = [
   ...
    path('message/', sendMessage),
]

上記のように pathsendMessageビューをインポートしました。そして、URL message/のリストに追加しました。 urlpatterns.

テストアプリケーションAPI

上記で構築した機能は ポストマンツールを使ってテストできます。あなたは サインアップにサインアップしてください。

このテストを実行するには、次のように Django のテストサーバを起動する必要があります:

Python manage.py runserver

SMS一括キャンペーンに以下の内容を使用するつもりだと仮定してみましょう。

{
    "sender": "Your Vonage number.",
    "recipients": ["First number to send to.", "Second number to send to"],
    "message_string": "Hello, World!",
    "batch_size": 3,
    "delay_period": 3600
}

以下の画像のように、上記の詳細をJSONとしてPostmanリクエストのボディに入力することができる:

A Postman screenshot

必ず "recipients"電話番号を実際の番号に置き換えてください。 "sender"に置き換えてください。そうすれば、メッセージは受信者に届きます。

結論

この記事では、Django REST API で Vonage を使って一括 SMS スロットリングを実装しました。これで、このソリューションをあなたのプロジェクトに統合し、 Vonage を使ってより多くのソリューションを構築できるようになります。Vonage API での認証についてよりよく理解するには、認証ガイド を参照してください。 Vonage API.

シェア:

https://a.storyblok.com/f/270183/400x397/505bfb0eb9/jekayinoluwa-olabemiwo.png
Jekayinoluwa Olabemiwo

Jẹ́káyinOlúwa is a software craftsman and product manager passionate about technology and its impact on people. He works on product management, backend development, DevOps, technical writing, and community strategy. He enjoys dealing in the intersection of software, design, and human interaction. He likes reading and music.