
NexmoとPythonでクリスマス・キャロルをダイヤルしよう
所要時間:1 分
編集部より贈るトニーズダイヤルアキャロルサービスを試してみませんか?12月いっぱい、ダイヤル・ア・キャロルを開催します!ダイヤル??(44)-203-905-1327または??(1)-201-355-3236クリスマスを盛り上げよう
もうすぐクリスマスだというのに、また1年が過ぎようとしている!
Pythonの楽しくて簡単なコードで、クリスマス・キャロルをダイヤルして、あなたの顔をほほえませるか、あるいは憂鬱にさせるかして、今年を締めくくろうと思う。
これが主旨だ:
Nexmo番号にダイヤルする
選択メニューが表示されます。
あなたが選択する
耳に残るキャロル!
素晴らしい!
セットアップ
もしまだNexmoで遊んだことがないのであれば、まず私たちのドキュメントをご覧になることをお勧めします。
また、以下の設定方法を知っていると仮定する。 ウェブフック.また、Webhookサーバーをお好みのプラットフォームでホストすることもできますし、Ngrokを使ってローカルでテストすることもできます。Ngrok を使用したことがない場合は、次のチュートリアルをご覧になることをお勧めします。 チュートリアルブログ記事と ドキュメントをご覧ください。
ウェブフックの設定
これで、Webhookを設定する準備が整いました。ここでは、ローカルで Ngrok を使ってテストしていると仮定して、以下のように設定します:
ウェブフック|URL
---- | ----
アンサー|https://abcdef1.ngrok.io:3000/webhooks/answer
イベント|https://abcdef1.ngrok.io:3000/webhooks/event
注意してください:これは、Webhookサーバーがポート3000で実行されていることを前提としていますが、適切なポートであれば何でもかまいません。
このチュートリアルでは、もう一つ興味のある Webhook がありますが、Answer Webhook や Event Webhook の URL を設定するのと同じようには設定しません。次のセクションで説明する DTMF webhook です。
アンサーウェブフック
Nexmo番号にダイヤルすると、オプションメニューが表示されます。その後、携帯電話のキーパッドのキーを押すことで、キャロルを選択することができます。この入力は POSTこの入力は、DTMFウェブフックの https://abcdef1.ngrok.io:3000/webhooks/dtmf.
では、NexmoはどうやってこのURLにコールバックする方法を知っているのでしょうか?アンサーウェブフックコードにDTMFウェブフックを設定する必要があります。
アンサーウェブフックを見ると、以下のように表示されている:
@app.route("/webhooks/answer")
def answer_call():
params = request.args
input_webhook_url = request.url_root + "webhooks/dtmf"
ncco = [
{
"action": "talk",
"bargeIn": "true",
"text": menu
},
{
"action": "input",
"maxDigits": 1,
"timeOut": 5,
"eventUrl": [input_webhook_url]
}
]
return jsonify(ncco)このコードを見ると、着信コールに応答すると NCCOがNexmoのText-To-Speech機能を使ってオプションメニューを送り、DTMFウェブフックをセットしている。このようにして、Nexmoは電話のキーパッドからの入力でどこにコールバックすべきかを知ることができます。
パラメータもいくつか指定されている。この場合 timeOutパラメーターはデフォルトの3秒より少し長めに設定されている。この場合、システムが入力待ちでタイムアウトになる前に、キーを押して応答できる5秒の時間が与えられます。 maxDigitsこの場合、入力として受け入れられるのは1桁だけになります。
もう1つの特筆すべきパラメータは bargeInである。 trueに設定されていることだ。これにより、お気に入りのキャロルを聴くのが待ちきれないときに、オプションメニューを中断することができる!
また DTMFに関する文書に関するより詳細な文書もありますので、ご自由にお読みください。ここでは基本的なことを説明した。
DTMF ウェブフック
先ほど、アンサーウェブフックがどのように機能するかを見ていただきました。次に、DTMF ウェブフックがどのように機能するかを見てみましょう。
まずはコードだ:
@app.route("/webhooks/dtmf", methods=['POST'])
def dtmf_webhook():
data = request.get_json()
selection = data['dtmf']
if selection == "":
selection = "1"
index = int(selection)-1
if index < 0 or index > len(tunes)-1:
index = 0
carol_url = base_url + tunes[index][1]
print(tunes[index][1])
msg = "Playing Christmas carol " + str(index+1)
ncco = [
{
"action": "talk",
"text": msg
},
{
"action": "stream",
"streamUrl": [carol_url]
}
]
return jsonify(ncco)
このURLの POSTコールバックにしか興味がないことがわかります。このコードのほとんどは、ユーザーがオプションをまったく入力しなかったり、オプションメニューに表示された範囲外のオプションを選択したりした場合の処理を確認するためのものです。実際のアクションはNCCOで再び行われる。
NCCOには、どのキャロルが演奏されるかを知らせる小さなプロンプト・メッセージがある。それから streamアクションを使って、MP3ファイルを通話中に再生する。この機能は、保留中の音楽などにかなり便利だが、今回はお祝いの気分を味わうために使うことができる。URLを指定するだけで、驚くべきNexmoマジックによって、音楽が通話中に再生されます。
コンプリート・コード
コードの最も重要な部分をカバーしました。ご参考までに、ここに完全なコードを掲載する:
#!/usr/bin/env python3
from flask import Flask, request, jsonify
from pprint import pprint
app = Flask(__name__)
base_url = 'https://raw.githubusercontent.com/tbedford/git-testing-repo/master/tunes/xmas/'
# Tunes courtesy http://www.freexmasmp3.com/
tunes = [
["Little Town of Bethlehem", "bethlem-jazz.mp3"],
["Ding Dong Merrily", "ding-dong-merrily.mp3"],
["First Noel", "first-noel-r-and-b.mp3"],
["Jingle Bells", "jingle-bells-country.mp3"],
["Silent Night", "silent-night-piano.mp3"],
["Twelve Days of Christmas", "twelve-days-funk.mp3"]
]
# Build options menu
menu = "Welcome to dial a Christmas carol. You can choose from the following cheesy carols."
i = 1
for t in tunes:
menu = menu + " Option " + str(i) + " is " + t[0] +"."
i = i + 1
menu = menu + " Please make your selection now."
@app.route("/webhooks/answer")
def answer_call():
params = request.args
input_webhook_url = request.url_root + "webhooks/dtmf"
ncco = [
{
"action": "talk",
"bargeIn": "true",
"text": menu
},
{
"action": "input",
"maxDigits": 1,
"timeOut": 5,
"eventUrl": [input_webhook_url]
}
]
return jsonify(ncco)
@app.route("/webhooks/dtmf", methods=['POST'])
def dtmf_webhook():
data = request.get_json()
selection = data['dtmf']
if selection == "":
selection = "1"
index = int(selection)-1
if index < 0 or index > len(tunes)-1:
index = 0
carol_url = base_url + tunes[index][1]
print(tunes[index][1])
msg = "Playing Christmas carol " + str(index+1)
ncco = [
{
"action": "talk",
"text": msg
},
{
"action": "stream",
"streamUrl": [carol_url]
}
]
return jsonify(ncco)
@app.route("/webhooks/event", methods=['POST'])
def events():
data = request.get_json()
pprint(data)
return ("OK")
if __name__ == '__main__':
app.run(port=3000)
アプリケーションを起動したら、Nexmo番号を使ってNexmoにダイヤルし、携帯電話のキーパッドで提供されるオプションから選択するだけで、お祭りのような楽しい音楽を聴くことができます。
さて、このクリスマス・コードを楽しんでいただけただろうか。
この場をお借りして、皆さまにメリー・クリスマスと新年のご挨拶を申し上げます!
次はどこだ?
ソースコードはGitHubで公開されている:
さらに詳しく調べたい場合に役立つリソースをいくつか紹介しよう:
NCCOリファレンス- これには
inputアクションの詳細を説明する。チュートリアル- アプリをローカルでテストするための便利なガイドです。
ウェブフック- Webhooksについて知りたかったけど、なかなか聞けなかったこと。