https://d226lax1qjow5r.cloudfront.net/blog/blogposts/sending-sms-templates-python-dr/Sending-SMS-templates-with-Jinja2-and-Python.png

Jinja2とPythonでSMSテンプレートを送信する

最終更新日 May 11, 2021

所要時間:1 分

一度に多くの人にメッセージを送る必要がありますか?非個人的な印象を与えないように、個人的なメッセージを送りたいですか?母親だけでなく、親戚全員に同じ心のこもった文章を送ったことを見られたくないので、グループメッセージは送れない?ここでは、一括メッセージやテンプレートを使ってパーソナライズできるSMSクライアントの作り方を紹介します。

はじめに

CLIを実行するにはPythonの経験が少し必要で、f-stringsを使うので少なくともPython 3.6が必要だ。

  1. GitHubからソースをクローンする

  2. 依存関係を仮想環境にインストールする。 pipenvを使い、編集モードでパッケージをインストールすることをお勧めする: pipenv install -e .

  3. 以下の環境変数を作成する; NEXMO_KEY, NEXMO_SECRETMY_NUMBER最初の2つは Nexmoダッシュボード. MY_NUMBERは国際E.164形式の携帯電話番号です。

SMSコンタクトの管理

Creating a new contact via the CLICreating a new contact via the CLI

私たちのアプリケーションには 連絡先を保持するための基本的なCRM.あまり複雑なものは必要なく、おまけにデータをJSONファイルとして保存してくれるので、バックアップや手動でのデータ編集が簡単になります。

連絡先の名前と電話番号だけでなく、私たちが収集するいくつかの複数の選択肢の値を持っています。

@contact.command("create")
def contact_create():
    """Creates a new contact"""
    questions = [
        {"type": "input", "name": "name", "message": "Contact name"},
        {
            "type": "input",
            "name": "phonenumber",
            "message": "Contact phone number (E.164 international format)",
        },
        {
            "type": "checkbox",
            "qmark": "?",
            "message": "Select diminutives (select at least 1)",
            "name": "diminutive",
            "choices": [
                Separator("= The Bros ="),
                {"name": "Bro"},
                {"name": "Buddy"},
                {"name": "Dude"},
                {"name": "Matey"},
                {"name": "Pal"},
                Separator("= The Sweethearts ="),
                {"name": "Baby"},
                {"name": "Bae"},
                {"name": "Darling"},
                {"name": "Sweetheart"},
                {"name": "Sugar"},
                Separator("= The Scots/Irish/Aussies ="),
                {"name": "████"},
                {"name": "Eejit"},
                {"name": "█████████"},
                {"name": "Numpty"},
            ],
            "validate": lambda answer: "You must choose at least one diminutive."
            if len(answer) == 0
            else True,
        },
        {
            "type": "checkbox",
            "qmark": "?",
            "message": "Select greetings (select at least 1)",
            "name": "greeting",
            "choices": [
                {"name": "Alright"},
                {"name": "Greetings"},
                {"name": "Hello"},
                {"name": "Hey"},
                {"name": "Hi"},
                {"name": "Oi"},
                {"name": "Wasssssup"},
                {"name": "Yo"},
            ],
            "validate": lambda answer: "You must choose at least one greeting."
            if len(answer) == 0
            else True,
        },
        {
            "type": "checkbox",
            "qmark": "?",
            "message": "Select valediction (select at least 1)",
            "name": "valediction",
            "choices": [
                {"name": "Bye"},
                {"name": "Cya"},
                {"name": "Love you x"},
                {"name": "Peace"},
                {"name": "xox"},
            ],
            "validate": lambda answer: "You must choose at least one valediction."
            if len(answer) == 0
            else True,
        },
    ]

    answers = prompt(questions, style=questions_style)
    contacts_db.insert(answers)

    click.secho(
        f"New contact {answers['name']} created", fg="black", bg="cyan", bold=True
    )

メッセージのテンプレートをレンダリングするときに、これらのリストからランダムな値をコンテキストに与え、メッセージにバリエーションを持たせます。

SMSテンプレートの管理

私たちのテンプレートはJinja2を使ってレンダリングされるので、Jinjaのすべての組み込みフィルタと機能にアクセスできます。また コンテキストの各コンタクトに関する情報を提供します。で各連絡先に関する情報も提供します。

Creating a new template via the CLICreating a new template via the CLI

Jinjaの randomフィルタを自由に使って、同じ人に同じメッセージを何度も送り直したとしても、そのたびに時間をかけて個人的に書いたように見えるようにしています。さらに信憑性を高めるために、時々奇妙なタイプミスをランダムに追加することもできます。

{{ greeting }} {{ diminutive }} {{ ["gah", "sorry", "I suck", "soz"]|random }}, I'm {{ ["running", "runnin", "runing"]|random }} about {{ range(5,25)|random }} {{ ["mins", "minutes", "mintes"]|random }} late. {{ valediction }}

Screenshot of phone with multiple SMSScreenshot of phone with multiple SMS

残りの テンプレート管理コードは連絡先と非常によく似ていますが、テンプレートの内容を素早く見ることができるように、粗いドリルダウン/展開があります。

@template.command("list")
def template_list():
    """View all templates"""
    viewing_templates = True
    all_templates = templates_db.all()

    while viewing_templates:
        questions = [
            {
                "type": "list",
                "message": "View template",
                "name": "template",
                "choices": [
                    {"name": f"{template['name']}", "value": template}
                    for template in all_templates
                ],
            }
        ]

        answers = prompt(questions, style=questions_style)

        click.echo(answers["template"]["name"])
        click.echo("---")
        click.echo(answers["template"]["template"])

        if not click.confirm("View another template?"):
            viewing_templates = False

Pythonで複数のSMSを送信する

Sending multiple/bulk SMS via the CLISending multiple/bulk SMS via the CLI

この NexmoパイソンクライアントSMSの送信は 関数を呼び出すだけです。SMS送信コードのほとんどは、ユーザがメッセージを受信する番号とテンプレートを選択できるようにするためのものです。

@click.command()
def send():
    """Send SMS"""

    questions = [
        {
            "type": "checkbox",
            "qmark": "?",
            "message": "Select contacts to message",
            "name": "contacts",
            "choices": [
                {
                    "name": f"{contact['name']} - {contact['phonenumber']}",
                    "value": contact,
                }
                for contact in contacts_db.all()
            ],
            "validate": lambda answer: "You must choose at least one contact."
            if len(answer) == 0
            else True,
        },
        {
            "type": "list",
            "message": "Select template",
            "name": "template",
            "choices": [
                {"name": f"{template['name']}", "value": template["template"]}
                for template in templates_db.all()
            ],
        },
    ]

    answers = prompt(questions, style=questions_style)
    template = Template(answers["template"])

    with click.progressbar(answers["contacts"], label="Sending messages") as contacts:
        for contact in contacts:
            message = template.render(
                name=contact["name"],
                phonenumber=contact["phonenumber"],
                diminutive=random.choice(contact["diminutive"]),
                greeting=random.choice(contact["greeting"]),
                valediction=random.choice(contact["valediction"]),
            )

            nexmo_client.send_message(
                {
                    "from": os.environ["MY_NUMBER"],
                    "to": contact["phonenumber"],
                    "text": message,
                }
            )

上のコードを修正して、クリスマス・メッセージの結果を記録するようにした。

Multiple messages output from bulk SMS CLI in PythonMultiple messages output from bulk SMS CLI in Python

シェア:

https://a.storyblok.com/f/270183/150x150/a3d03a85fd/placeholder.svg
Aaron Bassettヴォネージの卒業生

アーロンはNexmoの開発者支持者だった。ベテランのソフトウェア・エンジニアであり、デジタル・アーティスト志望でもあるアーロンは、コードや電子機器、時にはその両方を使って何かを作っているところをよく見かける。彼が何か新しいことに取り組んでいるときは、空気中の部品が燃える匂いでわかるのが通例だ。