PepperからTwilio経由で電話をかける


はじめに

Twilioには、Pythonのヘルプライブラリがあるので、PepperのPython実行環境からRestAPI経由で電話をかけることができます。
コーディング自体は簡単ですが、準備がかなり多いので、忘れないように記事にしておきます。

前提条件

  • Twilioのアカウントはすでに取得しているものとします。
    • AccountSID、AuthToken、発信用電話番号が必要です。トライアルアカウントでも利用は可能ですが、発信先電話番号は、認証済み電話番号のみとなります。
  • Pepperアプリ(Choregraphe)はすでにセットアップされているものとします。
    • 今回はMac版のVersion2.4.3を使います。Windowsでも動作します。
  • Python2.7.xの環境がセットアップされているものとします。
    • 今回は、2.7.12を利用します。

手順

  • TwilioのPythonヘルパーライブラリの準備します。
  • 上記ライブラリに依存するライブラリの準備します。
  • Choregrapheを使って、Pythonスクリプトを作成します。

TwilioのPythonヘルパーライブラリを準備

  1. TwilioのPythonヘルパーライブラリをダウンロードします。
  2. Zipファイルを解凍します。
  3. 解凍されたフォルダの中のTwilioフォルダをどこかにコピーしておきます。

依存するライブラリを準備します。

Twilioのヘルパーライブラリは、いくつか別のライブラリを利用しています。
そのため、予め依存ライブラリをダウンロードしておきましょう。

httplib2

httplib2のサイトから、最新版のzipファイルをダウンロードします。
今回は、httplib2-0.9.2.zipを利用します。
1. ダウンロードしたzipファイルを適当な場所に展開します。
2. 展開したフォルダに移動し、セットアップを実行します。

python
$ python setup.py install

インストールが完了すると、build¥libフォルダ内に、httplib2フォルダができるので、それをどこかにコピーしておきます。

pytz

pytzのサイトから、最新版のzipファイルをダウンロードします。
今回は、pytz-2016.7.zipを利用します。
1. ダウンロードしたzipファイルを適当な場所に展開します。
2. 展開したフォルダに移動し、セットアップを実行します。

python
$ python setup.py install

インストールが完了すると、build¥libフォルダ内に、pytzフォルダができるので、それをどこかにコピーしておきます。

Choregraphe上でPythonスクリプトを作成

ライブラリフォルダを設定する

Choregrapheのプロジェクトファイルウィンドウの「+」ボタンを押し、「新規フォルダ...」を選択します。

フォルダ名を「lib」にして、「Create」ボタンを押します。

プロジェクトファイルウィンドウの「+」ボタンを押し、「フォルダをインポート...」を選択します。

先程解凍しておいたTwilioフォルダを選択します。
同様の手順で、先程セットアップしておいたhttplib2フォルダとpytzフォルダも追加しておきます。

取り込んだフォルダをすべてlibフォルダの下に移動します。

ライブラリを読み込むスクリプトを作成する

ボックスライブラリのProgramming→Templatesから、「Python Scripts」をパネルにドラッグします。

ドラッグしたボックスをダブルクリックし、スクリプトエディタを開きます。

既存のコードをすべて削除し、以下のコードを貼り付けます。

Python
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        self.pathModified = False

    def onUnload(self):
        if self.pathModified and self.folderName and self.folderName in sys.path:
            sys.path.remove(self.folderName)
        self.folderName = None

    def onInput_onStart(self):
        appFolder = self.behaviorAbsolutePath().replace(self.behaviorRelativePath(), "")
        self.folderName = os.path.join(appFolder, "lib")
        if self.folderName not in sys.path:
            sys.path.append(self.folderName)
            self.pathModified = True

        self.onStopped()

    def onInput_onStop(self):
        self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
        self.onStopped() #activate the output of the box

これで、起動時にライブラリフォルダ(libフォルダ)が参照されるようになります。
2017/1/4 コードに間違いがあったため、一部修正

電話をかけるスクリプトを作成する

先程と同じようにボックスライブラリから2つ目のPython Scriptsボックスをパネルにドラッグします。

ドラッグしたボックスをダブルクリックして、スクリプトエディタ画面を表示します。
すでに書かれているコードは一度すべて消していただき、以下のコードを上書きします。

Python
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        #put initialization code here
        pass

    def onUnload(self):
        #put clean-up code here
        pass

    def onInput_onStart(self):
        #self.onStopped() #activate the output of the box
        from twilio.rest import TwilioRestClient

        # put your own credentials here
        ACCOUNT_SID = 'ACXXXXXXXXXXX'
        AUTH_TOKEN = 'XXXXXXXXXXX'
        client = TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN)

        client.calls.create(to='+8190XXXXXXXX', from_='+8150XXXXXXXX', url='http://twimlets.com/holdmusic?Bucket=com.twilio.music.ambient')
        self.onStopped()

    def onInput_onStop(self):
        self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
        self.onStopped() #activate the output of the box

ACCOUNT_SIDとAUTH_TOKENは、それぞれご自分のTwilioのアカウントSIDとAuthTokenを記載します。
client.calls.create関数の中にある、toは宛先電話番号、fromは発信者番号になります。発信者番号はTwilioで購入した番号を指定します。また、Twilioのトライアルアカウントをご利用の場合は、認証済みの番号にのみ発信が可能です。
urlは、TwiMLを返すためのWebHookになっています。今回は、予め用意してある保留音が流れるようになっています。

以上で準備は終了です。

フローを作成してテストする

フローを作成する

パネル上で、以下の画像と同じようにフローの線を引きます。

テストする

Pepperと接続を行い、テストをしてみましょう。
しばらくすると電話がかかってくれば成功です。