2017-02-04 17 views
2

私はに従っており、ヘロクのPythonデプロイメントを使用しており、電話をかけることができます。それは私が問題を抱えているという受け取りです。私はTVOIncomingCallインスタンスまたはPKPushRegistryのinitまたはdelegateロジックのいずれも変更していません。そして実際にコンパイルすると、ログに"pushRegistry:didUpdatePushCredentials:forType""Successfully registered for VoIP push notifications."と表示されます。これは私のserver.pyでの受信ハンドラが問題だと思います。TwilioプログラマブルボイスSDKを使用して電話を受ける

私の質問は次のとおりです:着信コールをユーザーに通知するためにVoIPプッシュ通知を発射する適切な方法は何ですか?私のアプリでVoIPサービスを有効にし、VoIPサービス証明書(.p12)を生成し、有効なPUSH_CREDENTIAL_SIDを受け取ったが、どうすればよいのだろうか?

クイックスタートがサーバーの「placeCall」エンドポイントに到達すると言うので、Twilio番号の着信パスを更新し、それをダッシュ​​ボードでポイントしますが、Twilio番号を呼び出すたびに「アプリケーションエラーが発生しました。

import os 
from flask import Flask, request 
from twilio.jwt.access_token import AccessToken, VoiceGrant 
from twilio.rest import Client 
import twilio.twiml 

ACCOUNT_SID = 'ACxxxxxxxx' 
API_KEY = 'SKxxxxxxxxxxxxxxxx' 
API_KEY_SECRET = 'xxxxxxxxxxxxxxxx' 
PUSH_CREDENTIAL_SID = 'CRxxxxxxxxxxxxxxxx' 
APP_SID = 'APxxxxxxxxxxxxxxxx' 
ACCOUNT_AUTH = 'xxxxxxxxxxxxxxxx' 

IDENTITY = 'MyApp' #not literally 

app = Flask(__name__) 

@app.route('/accessToken') 
def token(): 
    account_sid = os.environ.get("ACCOUNT_SID", ACCOUNT_SID) 
    api_key = os.environ.get("API_KEY", API_KEY) 
    api_key_secret = os.environ.get("API_KEY_SECRET", API_KEY_SECRET) 
    push_credential_sid = os.environ.get("PUSH_CREDENTIAL_SID", PUSH_CREDENTIAL_SID) 
    app_sid = os.environ.get("APP_SID", APP_SID) 

    grant = VoiceGrant(
    push_credential_sid = push_credential_sid, 
    outgoing_application_sid = app_sid 
) 

    token = AccessToken(account_sid, api_key, api_key_secret, IDENTITY) 
    token.add_grant(grant) 

    return str(token) 


@app.route('/placeCall', methods=['GET', 'POST']) 
def placeCall(): 
    account_sid = os.environ.get("ACCOUNT_SID", ACCOUNT_SID) 
    api_key = os.environ.get("API_KEY", API_KEY) 
    api_key_secret = os.environ.get("API_KEY_SECRET", API_KEY_SECRET) 
    push_credential_sid = os.environ.get("PUSH_CREDENTIAL_SID", PUSH_CREDENTIAL_SID) 
    app_sid = os.environ.get("APP_SID", APP_SID) 

    CALLER_ID = request.values.get('From') 
    IDENTITY = request.values.get('To') 

    #client = Client(api_key, api_key_secret, account_sid) 
    client = Client(api_key, api_key_secret, account_sid, app_sid, push_credential_sid) 
    call = client.calls.create(to='client:' + IDENTITY, from_= 'client:' + CALLER_ID) 
    return str(call.sid) 

マイIdentity値は明らかに間違っている:

は、ここに私のserver.pyから関連するコードです。私はそれがアプリインスタンスへの参照と何とか等しい必要があると思います。クイックスタートのPythonの例では、IDENTITY = 'voice_test'また、PUSH_CREDENTIAL_SIDはどこに出るのですか?

ありがとうございます。

UPDATE
______ @ philnashさんのコメントを1として

は、私がdial動詞内部client名詞を入れ子になってきました。これは、現在デバッガ考えられる原因として、「未知または予期しないネストされた要素」を明記の「スキーマ検証警告」になり

@app.route('/incoming', methods=['GET', 'POST']) 
def incoming(): 
    CALLER_ID = request.values.get('From') 
    resp = twilio.twiml.Response() 
    resp.dial(client = IDENTITY, callerId = CALLER_ID, record = "record-from-answer-dual") 
    return str(resp) 

:ここに私の新しい/incomingエンドポイントです。クライアントを間違って登録していますか?古いSDKでは、クライアント名をパラメータとして明示的に渡すことができました。私server.pyで

IDENTITY文字列は次のとおりです。任意のメソッドのスコープの外で定義され

  1. アクセストークンの生成で使用されます。
  2. clientのネスト、dial動詞のネーム。

答えて

1

ここではTwilioの開発者エバンジェリストです。

/placeCallエンドポイントは、Twilio番号の着信コールwebhook用ではありません。この例では、単にクライアントへの呼び出しを生成するために使用されます。

代わりに、着信コールwebhookは、TwiMLを返して、Twilioにクライアントにダイヤルするように指示するエンドポイントを指す必要があります。 TwiMLはXMLのサブセットに過ぎず、必要な要素は<Dial>で、ネストされたものは<Client>です。エンドポイントは次のような内容を返す必要があります。

<Response> 
    <Dial> 
    <Client>YOUR_CLIENT_NAME</Client> 
    </Dial> 
</Response> 

これがまったく役立つかどうか教えてください。問題の更新に基づいて

更新

、我々は今、PythonでこのTwiMLを生成する必要があります。 Pythonのwith構文を使用してnest TwiMLTwilio Python helper libraryにすることができます。これがうまくいくと思います:

@app.route('/incoming', methods=['GET', 'POST']) 
def incoming(): 
    CALLER_ID = request.values.get('From') 
    resp = twilio.twiml.Response() 
    with resp.dial(callerId = CALLER_ID, record = "record-from-answer-dual") as dial: 
     dial.client(IDENTITY) 
    return str(resp) 
+0

返信ありがとうPhil!私は元の質問を更新しました。更新セクションのコメントをご覧ください。 :) –

+0

更新ありがとう。私はあなたが正しく入れ子をしているとは思わない、私の更新された答えを確認してください。 – philnash

+0

OK!今どこかに行くよ!あなたの提案でサーバーを更新しました。現在、「エラー - 52134 - 無効なAPNデバイストークン」が表示されています。新しいVoIPサービス証明書を再生成してアップロードし、プッシュ資格情報SIDを更新します。 Philに感謝します。 –

0

アプリケーションサーバーのserver.pyファイルのPUSH_CREDENTIAL_SIDの値を、新しいプッシュ資格情報SIDで更新します。

ACCOUNT_SID = 'AC***' 
API_KEY = 'SK***' 
API_KEY_SECRET = '***' 
PUSH_CREDENTIAL_SID = 'CR***' 
APP_SID = 'AP***' 

そして、あなたのplaceCall関数内:それは、ファイルの先頭に以下の定数で行く

def placeCall(): 
    account_sid = os.environ.get("ACCOUNT_SID", ACCOUNT_SID) 
    api_key = os.environ.get("API_KEY", API_KEY) 
    api_key_secret = os.environ.get("API_KEY_SECRET", API_KEY_SECRET) 
    push_credential_sid = os.environ.get("PUSH_CREDENTIAL_SID", PUSH_CREDENTIAL_SID) 
    app_sid = os.environ.get("APP_SID", APP_SID) 

それはあなたにもその上からAPP_SIDを逃しているように思えるへの参照ですTwiML appには、いくつかのコール命令が含まれています。

+0

応答ありがとうございました!最初から多くのコードを共有していたはずですが、あなたが言ったことのほとんどは、すでにserver.pyにあります。私は最後の2行を 'placeCall'関数に含めなかった。しかし、今はありますが、私のTwilio番号への呼び出しは、恐らく "アプリケーションエラーが発生しました"という応答メッセージが表示されます。 –

関連する問題