モーニングコールをノンコーディングで作る

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

今回は、Twilioを使ってノンコーディングでモーニングコールを作ります。
電話の発信部分にはTwilio Studioを使い、Studioの定期実行には、[cron-job.org](https://cron-job.org/en/)というクラウドサービスを使います。分単位で起動時間を設定できますが、実際には1〜2分程度の遅延が発生することもありそうですので、朝の1分が死活レベルの方には向いてないかもしれません（笑）。
cron-job.orgについては、[こちらの記事](http://windowsphone.fanweb.jp/?p=3131)がわかりやすくておすすめです。

# 準備

## Twilioアカウントの作成

今回は、Twilioのトライアルアカウントでも動作します。ただし、トライアルアカウントのポイントがなくなった時点で使えなくなりますので、継続して使いたい場合はアカウントのアップグレードをお願いいたします。
また、トライアルアカウントでは、アカウント作成時に認証した電話番号にしか電話がかけられません。また、電話をとったときにトライアルアカウントである旨のガイダンスが流れます。

トライアルアカウントの作成は、[こちら](https://twilio.kddi-web.com/signup/)から行います。

## cron-job.orgアカウントの作成

cron-job.orgはcronと呼ばれる定期的にコマンドを実行する仕組みをクラウドで提供してくれる無料のサービスです。
[こちら](https://cron-job.org/en/signup/)からアカウントが作成できるので、予め作成しておいてください。

# 電話番号の購入

## Twilioの管理コンソールにログインする

- ブラウザで[ログイン画面](https://jp.twilio.com/login/kddi-web)を表示し、ご自分のIDとパスワードでログインをします。

## 電話番号を購入する

*すでに050番号をお持ちの方は、そちらをご利用いただくことができますので、このセクションは飛ばしていただいて大丈夫です。*

- 管理コンソールの左側にあるボタンアイコンを押すと、スライドメニューが表示されます。

![002 (1).png](https://qiita-image-store.s3.amazonaws.com/0/86046/e9bd6295-1b6e-9eb7-fdf4-1075b4d610c3.png)

- スライドメニューの一覧から、**電話番号**を選択します。

![005 (1).png](https://qiita-image-store.s3.amazonaws.com/0/86046/7a3e89e8-540a-8c9e-2340-fdcbecdc80d6.png)
- **Phone Numbers**メニューの中の**Buy a Number**を選択します。
- 国のプルダウンから「Japan（+81）」を選択し、**検索**ボタンを押します。

![006.png](https://qiita-image-store.s3.amazonaws.com/0/86046/e3e0c258-960e-f8fa-5301-62c4c28b2834.png)

- 一覧表示されたリストの中から、TYPEがローカルになっている（108円）の番号を一つ選び、**購入**ボタンを押します。
- この番号を購入しますか？というダイアログが出たら、**この番号を購入する。**を押します。
- Congratulationのダイアログが表示されたら、購入完了です。**閉じる**ボタンを押します。
- Phone Numbersの中のManage Numbersを選択し、今購入した電話番号が表示されることを確認します。購入した電話番号は後ほど使いますので、メモ帳などに控えておきます。

```lang:電話番号の表記方法について
Twilioは、世界100カ国と接続されていて、それぞれの国に直接電話をかけることができます。
そのため、発信・着信の電話番号は、全世界で利用可能な「E.164形式」と呼ばれる表記方法を使います。
E.164形式とは、先頭が+から始まる国番号と電話番号の組み合わせです。
例えば、日本は国番号が+81となっており、その後の電話番号を続けて記述します。
※電話番号の先頭の0は削除します。
「09012345678」は、E.164形式だと「+819012345678」となります。
```

# 発信部分の作成

通常、Twilioを使って電話を発信する場合は、外部からRestAPIを利用して行いますが、Twilio Studioを使っても電話発信が可能です。
Twilio Studioは、ドラッグアンドドロップでコールフローが作れるツールで、発信後に相手が応答したらどういうメッセージを流すかといった部分もStudioで作ることができます。

## フローの読み込み

- 管理コンソールの左側のスライドメニューから、Studioを選択します。
- 赤いプラスアイコンをクリックするか、**Create a new flow**を選択して、新しいフローを作成します。
- **FLOW NAME**に「MorningCall」と入力して、**NEXT**ボタンを押します。
- **New Flow**ダイアログが表示されるので、**Import from JSON**を選択して、**Next**ボタンを押します。

![スクリーンショット 2019-01-07 16.57.36.png](https://qiita-image-store.s3.amazonaws.com/0/86046/b70b1156-98b9-cb54-d5b1-3edb8118ba06.png)

- **New Flow**ダイアログが開きますので、1行目の{}を削除して、以下のJSONを貼り付けます。

```json
{
  "description": "A New Flow",
  "states": [
    {
      "type": "InitialState",
      "name": "Trigger",
      "properties": {
        "offset": {
          "x": 0,
          "y": 0
        },
        "flow_url": "https://webhooks.twilio.com/v1/Accounts/ACXXXXXXXXX/Flows/FWXXXXXXXXX"
      },
      "transitions": [
        {
          "event": "incomingMessage",
          "conditions": [],
          "next": null,
          "uuid": "5ca61294-f90b-4861-91d2-4c4620acc296"
        },
        {
          "event": "incomingCall",
          "conditions": [],
          "next": null,
          "uuid": "a42f9e89-5766-4df2-a2ae-590ab3dd5016"
        },
        {
          "event": "incomingRequest",
          "conditions": [],
          "next": "FF3e5ff9d5e4454ee8af0ca7ace75a51ce",
          "uuid": "07409c3d-54c5-4a9b-addd-5546d5dc8bd3"
        }
      ],
      "sid": "FF3f062059877d47d7fafa64f50bd070ab"
    },
    {
      "type": "Dial",
      "name": "CallPhone",
      "properties": {
        "offset": {
          "x": 190,
          "y": 190
        },
        "from": "{{flow.channel.address}}",
        "to": "{{contact.channel.address}}",
        "record": false,
        "timeout": 60
      },
      "transitions": [
        {
          "event": "answered",
          "conditions": [],
          "next": "FF7c43db433814ba7c4d748a5b055bb672",
          "uuid": "63dd5eb0-3783-4454-b395-f77d1246d18f"
        },
        {
          "event": "answeredByMachine",
          "conditions": [],
          "next": null,
          "uuid": "9715a81d-52df-4d36-a43d-54ff4c25adaf"
        },
        {
          "event": "busy",
          "conditions": [],
          "next": null,
          "uuid": "8f600e69-cd00-4392-9b19-5d946afc68bc"
        },
        {
          "event": "noAnswer",
          "conditions": [],
          "next": null,
          "uuid": "760a4b9a-a3b5-4205-8980-3dc0d703ad25"
        },
        {
          "event": "failed",
          "conditions": [],
          "next": null,
          "uuid": "66f0f6cc-b1a9-4b5c-b547-732ef5a11e7c"
        }
      ],
      "sid": "FF3e5ff9d5e4454ee8af0ca7ace75a51ce"
    },
    {
      "type": "SayPlay",
      "name": "SayGuide",
      "properties": {
        "offset": {
          "x": 10,
          "y": 410
        },
        "say": "おはようございます！\n朝ですよー。",
        "play": null,
        "voice": "Polly.Mizuki",
        "language": "ja-JP",
        "loop": 3
      },
      "transitions": [
        {
          "event": "audioComplete",
          "conditions": [],
          "next": null,
          "uuid": "8cc2bca7-f671-41e6-bd63-8b4baf2fd92d"
        }
      ],
      "sid": "FF7c43db433814ba7c4d748a5b055bb672"
    }
  ]
}
```

- **Next**ボタンを押します。
- 次のようなフローが読み込まれます。
<img width="558" alt="スクリーンショット 2019-03-16 19.46.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/2ffde620-e633-3f2a-1586-a39147a85cf9.png">

このフローでは、かかってきた電話に応答すると「おはようございます。朝ですよー。」と女性の声で3回繰り返すようになっています。もし文言を変えたり、繰り返しの回数を変えたい場合は、フローの中にある**SayGuide**という名前がついたウィジェットを選択し、右側に表示されるプロパティページで値を変更してください。

<img width="256" alt="スクリーンショット 2019-03-17 08.32.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/66f67633-b7bd-a895-add5-0f9e4f949bbd.png">

**<重要>**
もし値を変更したときは、**Save**ボタンで変更を保存した後、かならず画面上部の赤い**Publish**ボタンを押してください。これを忘れると設定は反映しません。

# 自動実行の設定

では次に、今作成したフローを自動実行する部分を作っていきます。
そのまえに、設定に必要な情報を集める必要があります。

## 必要な情報を取得

- Twilioの管理コンソールにログインします。
- **Dashboard**の画面にある、**アカウント SID**と**AUTHTOKEN**を控えておきます（AUTHTOKENは、Viewリンクをクリックすると表示されます）。
![ACCOUNT_SID.png](https://qiita-image-store.s3.amazonaws.com/0/86046/36845fa7-82ae-f9a4-6710-1be7a14fdc29.png)

- 先程購入したTwilioの050番号を控えてない方は、管理コンソールの**Phone Numbers**メニューから先程購入した番号（+81503XXXXXXXX）を控えておきます。
- 同じく管理コンソールの**Studio**を選択し、先ほど作成した「MorningCall」フローを選択します。
- **Trigger**ウィジェットを選択して、表示されたプロパティページの**REST API URL**欄にあるコピーアイコンをクリックして、URLを控えます（WEBHOOK URLではないので注意してください）。
![FLOW_RESTAPI_URL.png](https://qiita-image-store.s3.amazonaws.com/0/86046/9fecc0a7-0da2-01ec-e720-90ebe45f3eda.png)

- モーニングコールをかけたい電話番号をE.164形式（先頭の0を削除し、+81を付加したもの）で控えておきます。トライアルアカウントでは、アカウント作成時に認証した電話番号にしか電話はかけられませんのでご注意ください。

## cron-job.orgの設定

- [こちらのURL](https://cron-job.org/en/members/)から、cron-job.orgにログインします。
- **Cronjobs**メニューを開きます。
![cron-job.org_Cronjobs.png](https://qiita-image-store.s3.amazonaws.com/0/86046/cd2e3543-bca4-7508-9aca-d2777b38dc0a.png)

- 右上に表示されている**Create cronjob**ボタンを押します。
- 以下の内容を設定します。
![cron-job.org_CreateJob.png](https://qiita-image-store.s3.amazonaws.com/0/86046/969337ea-1354-3aea-094b-a45e9115332c.png)


|項目名|説明|
|:--|:--|
|Title|「MorningCall」とします|
|Address|StudioフローのREST API URLを指定します|
|Requires HTTP authentication|チェックを入れます|
|Username|アカウント SIDを指定します|
|Password|AUTHTOKENを指定します|

- 発信したいスケジュールを設定します。
<img width="709" alt="スクリーンショット 2019-03-17 10.22.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/c7ee934a-3075-7558-bce4-cf2a269720cb.png">

上の例は、平日の朝7時に発信するための設定です。該当する部分をすべて選択するのがポイントです。

- **Create cronjob**ボタンを押して設定を保存します。
- 一覧画面に戻ったら、**Edit**ボタンを押して、再度編集画面に入ります。
<img width="855" alt="スクリーンショット 2019-03-17 10.31.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/1befa6b4-f4fc-beb5-b696-5599834242fe.png">

- **Advanced**セクションの**Request method**を「POST」に変更します。
- **Request body**欄に`From=[購入した050番号]&To=[ご自分の電話番号]`と指定します。電話番号はどちらもE.164形式で指定してください。
<img width="700" alt="スクリーンショット 2019-03-17 10.34.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/ac113ae7-5b03-4308-23e0-25b3dea1716f.png">

- **Save**ボタンを押して設定を保存します。

以上で設定はすべて完了です。
もし事前にテストをしたい場合は、スケジュールのところを変更して試してみてください。

# まとめ

- Twilioには定期的に実行するための機能がないですが、今回のように外部のサービスと連携することで定期実行が可能です。
- Twilio StudioをREST API経由で呼び出すことができますが、そのときにはFromとToパラメータが必須となります。
- 同じくREST APIを呼ぶためには、アカウントSIDとAUTH TOKENを使ったベーシック認証が必要です。

---
### Twilio（トゥイリオ）とは

https://twilio.kddi-web.com
Twilioは音声通話、メッセージング（SMS/チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウドAPIサービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。