[twilio] Twilioメッセージ登録受付アプリを作る (AmazonLinux + nginx + php-fpm + Twilio PHP SDK)


Twilioでメッセージ録音システムを構築してみます。

音声メニューに従ってメッセージを録音します。


# 前提条件

## 公開サーバ環境

* (参考) Amazon Linux環境の構築
   * キーペアの作成 (新規): http://qiita.com/tcsh/items/59303d9506ca7d13f744
   * インスタンスの作成 (Public): http://qiita.com/tcsh/items/ae8f1f0d706237327c5a


## Webサーバ + PHP環境

* PHP (5.4以上を想定)
* Twilio PHP SDK

(参考) Twilioで番号入力を受け付けてみる (AmazonLinux + nginx + php-fpm): 



## Twilioのアカウント

* Twilioのアカウントを保有していること。
  * Twilioの電話番号
  * Twilioの認証情報 (ACCOUNT SID / AUTH TOKEN)



# 0. 事前準備

## 0.1. Twilioアカウント情報の設定

Twilioの「はじめよう」画面から以下の情報を取得して変数に格納します。

* ACCOUNT SID

* AUTH TOKEN

* 電話番号

```bash:変数の設定:
TWILIO_ACCOUNT_SID='ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
TWILIO_AUTH_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
TEL_TWILIO_ORIGIN=<Twilioで取得した電話番号>
```

## 0.2. ファイル置き場の作成

```bash:変数の設定
DIR_HTML='/usr/share/nginx/html'
DIR_TWIML="${DIR_HTML}/sysadm/xml"
DIR_PHP_SCRIPT="${DIR_HTML}/php"
URL_PHP_SCRIPT=$(echo ${DIR_PHP_SCRIPT} | sed "s|${DIR_HTML}||" )
```

```bash:コマンド:
sudo mkdir -p ${DIR_TWIML} ${DIR_PHP_SCRIPT} \
  && ls ${DIR_TWIML} ${DIR_PHP_SCRIPT}
```



# 1. メッセージ録音アプリケーションの作成

## 1.1. アプリケーションディレクトリの作成

```bash:変数の設定:
DIR_TWILIO_APP="${HOME}/app/twilio-record-app" \
  && echo ${DIR_TWILIO_APP}
APP_NAME=$(echo ${DIR_TWILIO_APP} | sed 's|^.*/||') \
  && echo ${APP_NAME}
```

```bash:コマンド
mkdir -p ${DIR_TWILIO_APP} \
  && cd ${DIR_TWILIO_APP}
```



## 1.2. composerのインストール

```bash:コマンド:
cd ${DIR_TWILIO_APP} \
        && mkdir bin \
        && curl -sS https://getcomposer.org/installer | \
          php -- --install-dir=bin --filename=composer
```

```text:結果(例):
      #!/usr/bin/env php
      All settings correct for using Composer
      Downloading...

      Composer successfully installed to: /Users/taro/app/twilio-php/composer.phar
      Use it: php bin/composer
```


## 1.3. Twilio PHP SDKの導入

参考: https://jp.twilio.com/docs/php/install


```bash:コマンド:
cd ${DIR_TWILIO_APP} \
        && ./bin/composer require twilio/sdk
```

```text:結果(例):
      Using version ^4.2 for twilio/sdk
      ./composer.json has been created
      Loading composer repositories with package information
      Updating dependencies (including require-dev)
        - Installing twilio/sdk (4.2.1)
          Downloading: 100%

      Writing lock file
      Generating autoload files
```

```bash:コマンド
ls ${DIR_TWILIO_APP}/vendor/twilio/sdk/Services/Twilio.php > /dev/null 2>&1 \
  && echo $?
```

```text:結果(例:
0
```

Twilio PHPライブラリファイルの位置を変数に取り込みます。

```bash:変数の設定:
FILE_LIB_TWILIO="vendor/twilio/sdk/Services/Twilio.php" \
  && ls ${FILE_LIB_TWILIO} > /dev/null 2>&1 \
  && echo $?
```

```text:結果(例):
0
```


## 1.4. Twilioで録音受付をするスクリプトの作成

```bash:変数の設定:
FILE_PHP_SCRIPT='announce-record.php'
```

```bash:変数の確認"
cat << ETX

  FILE_PHP_SCRIPT:    ${FILE_PHP_SCRIPT}

ETX
```

```bash:コマンド:
cat << EOF > ${FILE_PHP_SCRIPT}
<?php
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
?>
<Response>
<?php echo "<Say language=\"ja-jp\">お客さまは、" . \$_REQUEST['Digits'] . "を押されました。</Say>" ?>
<?php if (\$_REQUEST['Digits'] == '1') { ?>
    <Say language="ja-jp">ビープおんのあとに、20秒以内で、ご契約についてのメッセージをおねがいします。終了したら、シャープボタンを押してください。</Say>
    <Record
        method="GET"
        maxLength="20"
        finishOnKey="#"
        action="${URL_PHP_SCRIPT}/${APP_NAME}/thankyou.php"
    />
    <Say language="ja-jp">録音できませんでした。</Say>

<?php } elseif (\$_REQUEST['Digits'] == '2') { ?>
    <Say language="ja-jp">ビープおんのあとに、20秒以内で、料金についてのメッセージをおねがいします。終了したら、シャープボタンを押してください。</Say>
    <Record
        method="GET"
        maxLength="20"
        finishOnKey="#"
        action="${URL_PHP_SCRIPT}/${APP_NAME}/thankyou.php"
    />
    <Say language="ja-jp">ろくおんできませんでした。</Say>

<?php } else { ?>
    <Say language="ja-jp">ありがとうございました。</Say>
<?php } ?>
</Response>
EOF

cat ${FILE_PHP_SCRIPT}
```

動作確認をします。

```bash:コマンド:
php ${FILE_PHP_SCRIPT} > announce-record.xml \
  && xmllint announce-record.xml --noout \
  && echo $? \
  && rm announce-record.xml
```

```text:結果(例)
PHP Notice:  Undefined index: Digits in /home/ec2-user/app/twilio-record-app/thankyou.php on line 5
PHP Notice:  Undefined index: Digits in /home/ec2-user/app/twilio-record-app/announce-record.php on line 6
PHP Notice:  Undefined index: Digits in /home/ec2-user/app/twilio-record-app/announce-record.php on line 16
0
```


## 1.5. 録音完了後にメッセージを伝える処理するスクリプトの作成

```bash:変数の設定
FILE_PHP_SCRIPT='thankyou.php'
MSG_THANKYOU='ごれんらく、ありがとうございました。'
```

```bash:変数の確認
cat << ETX

  FILE_PHP_SCRIPT: ${FILE_PHP_SCRIPT}
  MSG_THANKYOU: ${MSG_THANKYOU}

ETX
```


```bash:コマンド(日本語の場合):
cat << EOF > ${FILE_PHP_SCRIPT}
<?php
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
?>
<Response><Say language="ja-jp">${MSG_THANKYOU}</Say></Response>
EOF

cat ${FILE_PHP_SCRIPT}
```

動作確認をします。

```bash:コマンド:
php ${FILE_PHP_SCRIPT} > thankyou.xml \
  && xmllint thankyou.xml --noout \
  && echo $? \
  && rm thankyou.xml
```

```text:結果(例)
0
```




# 2. Webサーバの公開ドキュメントディレクトリにスクリプトを配置

```bash:コマンド:
sudo cp -R ${DIR_TWILIO_APP} ${DIR_PHP_SCRIPT}/ \
  && cat ${DIR_PHP_SCRIPT}/${APP_NAME}/${FILE_PHP_SCRIPT}
```


# 3. スクリプトの動作確認

ブラウザでアクセスしてみましょう。

- http://<ホスト>/php/twilio-record-app/announce-record.php
- http://<ホスト>/php/twilio-record-app/thankyou.php

'404 Not Found'が表示されなければOKです。



# 4. TwiMLファイルの作成

## 4.1. TwiMLファイルの作成

```bash:変数の設定
FILE_TWIML="${APP_NAME}.xml"
MSG_SAY='。ようこそ。ごけいやくの型は、1番とシャープを。料金のおといあわせは、2番とシャープを。そのほかのごようのかたわ、9番とシャープを、おしてください。'
MSG_ERROR="番号がわかりませんでした。ありがとうございました。"
MAX_LENGTH_RECORD='20'
```

```bash:変数の確認
cat << ETX

  FILE_TWIML:        ${FILE_TWIML}
  MSG_SAY:           ${MSG_SAY}
  MSG_ERROR:         ${MSG_ERROR}
  MAX_LENGTH_RECORD: ${MAX_LENGTH_RECORD}

ETX
```

```bash:コマンド(日本語版):
cat << EOF > ~/${FILE_TWIML}
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Gather action="${URL_PHP_SCRIPT}/${APP_NAME}/announce-record.php"
method="GET">
        <Say language="ja-jp">${MSG_SAY}</Say>
    </Gather>
    <Say language="ja-jp">${MSG_ERROR}</Say>
</Response>
EOF

cat ~/${FILE_TWIML}
```

```bash:コマンド:
xmllint ~/${FILE_TWIML} -noout
```

## 4.2. Webサーバの公開ドキュメントディレクトリにTwilioMLファイルを配置

TwilioMLを配置場所は、GETで取得できる環境であれば良いのでS3上でもかまいませんが、今回は上記の公開Webサーバ上に配置します。

```bash:コマンド:
sudo cp ~/${FILE_TWIML} ${DIR_TWIML}/ \
  && cat ${DIR_TWIML}/${FILE_TWIML}
```



## 4.3. TwilioMLファイルへのアクセス確認

ブラウザで http://<ホスト>/sysadm/xml/twilio-record-app.xml にアクセスして、XMLが表示されればOKです。



# 5. Twilioの設定変更

- ログイン: http://twilio.kddi-web.com
- 画面: 'Voice, SMS & MMS' > '電話番号: 'https://jp.twilio.com/user/account/voice-sms-mms/phone-numbers
   - 電話番号のリンクをクリックします。
   - ポップアップで「音声通話」タブを選択します。
   - Request URLにTwiML(XMLファイル)のURLを貼り付けます。
      - 例: http://username:password@<ホスト名>/sysadm/xml/twilio-record-app.xml
      - username:passwordには、ベーシック認証のユーザ名(例:sysadm)とパスワード(例:#userPass123)を記述します。
   - URLを貼り付けた欄の右のプルダウンから'HTTP GET'を選択します。

![スクリーンショット 2015-10-10 9.07.33.png](https://qiita-image-store.s3.amazonaws.com/0/48158/256e0f27-d3d1-9e45-8498-2bbad919fa5e.png)

- 「保存」ボタンをクリックします。


# 6. 電話アプリの動作確認

- Twilioから割り当てられた電話番号に電話します。

  - twilio-record-app.xmlに記述したメッセージが流れます。

- 番号を入力します。
- アナウンスに従って、メッセージを録音します。

  - しばらく待つ、もしくは#キーを押します。

- thankyou.phpに記述したメッセージが流れて、電話が切れます。



# 7. Twilioのログ確認

- ログイン: http://twilio.kddi-web.com
- 画面: https://jp.twilio.com/user/account/log/calls
   - 録音データが存在することを確認します。



# 完了