[Twilio] Twilio + S3で電話にメッセージを送る (クライアント環境: Twilio PHP SDK)

ローカル環境+PHPで、Twilioから携帯電話などにメッセージを送ってみます。

ここでは、S3を利用して、日本語メッセージを送ってみます。


* 参考ドキュメント：https://jp.twilio.com/docs/api/twiml/say


# 前提条件


## Twilioのアカウント

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


## Twilio+PHP環境

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

(参考) Twilioで電話にメッセージを送る (クライアント環境: Twilio PHP SDK): http://qiita.com/tcsh/items/d0449909f20916fff159


## S3への権限

S3バケットに対してオブジェクトのread/write権限があること。


## AWS CLIのバージョン

以下のバージョンで動作確認済

* AWS CLI 1.8.11
* AWS CLI 1.7.40

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.8.11 Python/2.7.5 Darwin/13.4.0
```



# 0. 事前準備


## 0.1. リージョンの決定

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


## 0.2. 変数の確認

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile        s3Full-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region           ap-northeast-1              env    AWS_DEFAULT_REGION
```

profileが '<not set>' と表示される場合は、以下を実行してください。

```bash:コマンド:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```


## 0.3. ファイル公開用S3バケットの指定

```bash:変数の設定:
ORG=<組織名>
S3_BUCKET_NAME="${ORG}-handson-`date +%Y%m%d`"

echo ${S3_BUCKET_NAME}
```

まだファイル公開用S3バケットを作成していない場合は以下の手順を実施します。

* ハイレベルS3コマンドで静的Webホスティング: http://qiita.com/tcsh/items/70694da357c1738c6bf8

また、コンテンツを閲覧できるように、バケットポリシーも設定します。

* コンテンツ用バケットの設定 (バケットポリシ): http://qiita.com/tcsh/items/bcf93244b675faecd6c4#6-コンテンツ用バケットの設定-バケットポリシ

ファイル公開用S3バケットのWebホスティングendpointを取得します。

```bash:コマンド:
S3_BUCKET_ENDPOINT="${S3_BUCKET_NAME}.s3-website-`aws s3api get-bucket-location --bucket ${S3_BUCKET_NAME} --output text`.amazonaws.com" \
        && echo ${S3_BUCKET_ENDPOINT}
```

```text:結果(例):
      example-handson-20151008.s3-website-ap-northeast-1.amazonaws.com
```

```bash:コマンド:
HOST_DEF="${S3_BUCKET_ENDPOINT}" \
  && echo ${HOST_DEF}
```


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

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

* ACCOUNT SID

* AUTH TOKEN

* 電話番号

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

## 0.5. コール先電話番号の指定

Twilioからの通知を受信したい電話(携帯など)の番号を指定します。

```bash:変数の設定:
TEL_DEST_ORIGIN=<宛先の電話番号>
```

間違い電話をしないように慎重に指定してください。


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

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

```bash:変数の設定:
DIR_TWILIO_APP="${HOME}/app/twilio-s3-app" \
  && echo ${DIR_TWILIO_APP}
```

```bash:コマンド
mkdir -p ${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="${DIR_TWILIO_APP}/vendor/twilio/sdk/Services/Twilio.php"
```


## 1.4. 送信メッセージの作成

```bash:変数の設定:
DIR_TWILIO_XML="${DIR_TWILIO_APP}/config" \
  && echo ${DIR_TWILIO_XML}
```

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

```bash:変数の指定:
FILE_TWILIO_XML='say.xml'
MSG_TWILIO='テキストを音声に変換します。'
```

```bash:コマンド:
cat << EOF > ${FILE_TWILIO_XML}
<?xml version="1.0" encoding="UTF-8"?>
<Response>
   <Say language="ja-jp">${MSG_TWILIO}</Say>
</Response>
EOF

cat ${FILE_TWILIO_XML}
```

XMLを作成したときは、なるべくxmllintでチェックしましょう。

```bash:コマンド:
xmllint ${FILE_TWILIO_XML} --noout
```

何も表示されなければOKです。



## 1.5. メッセージファイルのS3への転送

```bash:コマンド:
aws s3 sync . s3://${S3_BUCKET_NAME}/xml/ \
        && aws s3 ls ${S3_BUCKET_NAME}/xml/
```

```text:結果(例):
upload: ./say.xml to s3://example-handson-20151008/xml/say.xml
2015-10-08 21:34:26        136 say.xml
```

```bash:コマンド:
echo "http://${S3_BUCKET_ENDPOINT}/xml/${FILE_TWILIO_XML}"
```

## 1.6. 送信スクリプトの作成

```bash:コマンド:
cd ${DIR_TWILIO_APP}
```

```bash:変数の設定:
FILE_PHP='say.php'
URL_DEF="http://${HOST_DEF}/xml/say.xml"
```

```bash:変数の設定:
TEL_DEST=$( \
  echo ${TEL_DEST_ORIGIN} |\
  sed 's/^0/81/') \
  && echo ${TEL_DEST}
```

```bash:変数の設定:
TEL_TWILIO=$( \
  echo ${TEL_TWILIO_ORIGIN} |\
  sed 's/^0/81/') \
  && echo ${TEL_TWILIO}
```

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

        FILE_PHP:           ${FILE_PHP}
        FILE_LIB_TWILIO:    ${FILE_LIB_TWILIO}
        TWILIO_ACCOUNT_SID: ${TWILIO_ACCOUNT_SID}
        TWILIO_AUTH_TOKEN:  ${TWILIO_AUTH_TOKEN}
        TEL_TWILIO:         ${TEL_TWILIO}
        TEL_DEST:           ${TEL_DEST}
        URL_DEF:            ${URL_DEF}

ETX
```

```bash:コマンド:
cat << EOF > ${FILE_PHP}
<?php

require( '${FILE_LIB_TWILIO}' );

\$account_sid = '${TWILIO_ACCOUNT_SID}';
\$auth_token  = '${TWILIO_AUTH_TOKEN}';

\$client = new Services_Twilio( 
    \$account_sid, 
    \$auth_token
);

\$call = \$client->account->calls->create(
    '+${TEL_TWILIO}',
    '+${TEL_DEST}',
    '${URL_DEF}',
    array("Method" => "GET")
);
echo \$call->sid;
EOF

cat ${FILE_PHP}
```


# 2. 電話メッセージの発信

${TEL_DEST}宛にメッセージを電話します。

```bash:コマンド:
php ${FILE_PHP}
```

# 完了