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


ローカル環境+PHPで、Twilioから携帯電話などにメッセージを送ってみます。
ここでは、Twimletを利用して、短文(英語)メッセージを送ります。

参考: https://twilio-php.readthedocs.org/en/latest/


前提条件
=====================================

## [推奨] UNIX環境

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


## PHP環境

phpがインストールされていること (5.4以上推奨)

```bash:コマンド:
which php
```

```text:結果(例/AmazonLinux):
/usr/bin/php
```

```bash:コマンド(バージョン確認)
 php -v
```

```text:結果(例/AmazonLinux):
PHP 5.4.45 (cli) (built: Sep 11 2015 21:23:18) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
```

```bash:インストール(yumパッケージの場合):
sudo yum install php54 -y
```

## curlコマンド

curlがインストールされていること

```bash:コマンド:
which curl
```

```text:結果(例/AmazonLinux):
/usr/bin/curl
```

# 0. 事前作業

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

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

* ACCOUNT SID

* AUTH TOKEN

* 電話番号

```bash:変数の設定:
TWILIO_ACCOUNT_SID="ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
TWILIO_AUTH_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
TEL_TWILIO_ORIGIN=<Twilioで取得した電話番号 ハイフンなし 例:050xxxxxxxx>
```



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

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

```bash:変数の設定:
TEL_DEST_ORIGIN=<電話番号 ハイフンなし  例:090xxxxxxxx>
```

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


# 1. メッセージ送信アプリケーションの作成
 
## 1.1. アプリケーションディレクトリの作成

```bash:変数の設定:
DIR_TWILIO_APP="${HOME}/app/twilio-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:変数の指定:
MSG_TWILIO='Hello! Joe.'
```

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

表示されたXMLを https://www.twilio.com/labs/twimlets/echo の'Twimlet Configuration'フォームに貼付して、Resulting URLに表示されたURLを変数に取り込みます。

```bash:変数の設定(例):
URL_DEF='http://twimlets.com/echo?Twiml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3CResponse%3E%0A%20%20%20%3CSay%3EHello!%20Joe.%3C%2FSay%3E%0A%3C%2FResponse%3E&'
```



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

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

```bash:変数の設定:
FILE_PHP='say.php'
```

```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}
```


完了
====

日本語での送信は今のところうまくいっていません。

原因としては、以下が考えられそうです。

- Twimletが日本語のメッセージをURLエンコードしてくれない。(nkfでデコードすれば良いかも。)
- - GETのURLが長くなりすぎる