2017-07-14 8 views
6

PythonでerokuでTwiMlをセットアップしました。 私はユーザBからユーザAに電話をかけたときに、ユーザAはコールとVOIPも取得しませんでしたが、ユーザBは「お電話ありがとう」のようなボットメッセージを受け取りました。twilioアプリケーションからアプリケーションへの呼び出しが機能しない

ユーザBにPostManからplaceCallを送信しようとすると、ユーザBは電話をかけられ、「お電話ありがとう」のようなボットメッセージも表示されます。

郵便配達のURL:私は呼んでしまいますアプリケーションユーザBからユーザAを呼び出し、両方ができるように通信することができるときhttps://myapp.herokuapp.com/placeCall

私の要件があります。

Flask==0.10.1 
Jinja2==2.7.3 
MarkupSafe==0.23 
Werkzeug==0.9.6 
httplib2==0.9 
itsdangerous==0.24 
six==1.* 
twilio 
wsgiref==0.1.2 

要件は、ここに私はPython TwiMlコードです。

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

ACCOUNT_SID = 'ACxxxxxxxx' 
API_KEY = 'SKxxxxxxxx' 
API_KEY_SECRET = 'TSxxxxxxxx' 
PUSH_CREDENTIAL_SID = 'CRxxxxxxxx' 
APP_SID = 'APxxxxxxxx' 


app = Flask(__name__) 

@app.route('/test', methods=['GET', 'POST']) 
def test(): 

    req_json = request.get_json(force=True) 
    UserName = req_json['username'] 
    Password = req_json['password'] 
    return str(UserName) 

@app.route('/accessToken') 
def token(): 

    IDENTITY = request.args.get('identity') 
    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('/outgoing', methods=['GET', 'POST']) 
def outgoing(): 

    req_json = request.get_json(force=True) 
    CALLER_ID = req_json['callerid'] 
    resp = twilio.twiml.VoiceResponse() 
    dial = Dial() 
    dial.client(CALLER_ID) 
    resp.append(dial) 
    #resp.say("Congratulations! You have made your first oubound call! Good bye.") 
    #resp.say("Thanks for Calling.",voice='woman',) 
    return str(resp) 

@app.route('/incoming', methods=['GET', 'POST']) 
def incoming(): 
    resp = twilio.twiml.VoiceResponse() 
    #resp.say("Congratulations! You have received your first inbound call! Good bye.") 
    #resp.say("Thanks for Calling.",voice='woman',) 
    return str(resp) 

@app.route('/placeCall', methods=['GET', 'POST']) 
def placeCall(): 

    req_json = request.get_json(force=True) 
    IDENTITY = req_json['identity'] 
    CALLER_ID = req_json['callerid'] 
    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) 
    client = Client(api_key, api_key_secret, account_sid) 
    call = client.calls.create(url=request.url_root + 'incoming', to='client:' + CALLER_ID, from_='client:' + IDENTITY) 
    return str(call.sid) 

@app.route('/', methods=['GET', 'POST']) 
def welcome(): 
    resp = twilio.twiml.VoiceResponse() 
    resp.say("Welcome") 
    return str(resp) 

if __name__ == "__main__": 
    port = int(os.environ.get("PORT", 5000)) 
    app.run(host='0.0.0.0', port=port, debug=True) 

エラーログtwilioダッシュボードの上に

リクエストURLに設定

enter image description here

TwiML:https://myapp.herokuapp.com/outgoing

私に知らせてくださいと私は設定するために逃したものはありますか私が間違って行ったこと。私はTwiMLを設定するには、続い

チュートリアルHere

答えて

2

Twilioの開発者エバンジェリストplaceCall return文では、このコードを試しています。

iOSアプリかAndroidアプリかは分かりませんが、アイデアは同じです。あなたはこのようなコード使用して、iOS quickstart in Swiftから、ここでの例のように、電話をかけるとき:

TwilioVoice.sharedInstance().call(accessToken, params: [:], delegate: self) 

をあなたには、例えば、そのコールで呼び出しているクライアントIDをいくつかのパラメータを送信する必要があります。例えば

TwilioVoice.sharedInstance().call(accessToken, params: ["To": "ClientIdentity"], delegate: self) 

Twilioは、TwiMLアプリケーションで設定したURLを呼び出します。クイックスタートでは、URLは/outgoingで、クイックスタートアプリケーションでは音声メッセージの例が表示されます。別のアプリケーションを呼び出すには、/outgoingから別の応答を返す必要があります。この場合、<Dial><Client>を入れ子にして、呼び出し時にToパラメータを渡す必要があります。

これは次のようになりパイソン/フラスコ内の

@app.route('/outgoing', methods=['GET', 'POST']) 
def outgoing(): 
    resp = twilio.twiml.Response() 
    dial = Dial() 
    dial.client(request.form['To']) 
    response.append(dial) 
    return str(resp) 

私は質問のコメントにあなたが/placeCallにTwiMLのApp URLを変更したことに気づきます。それを/outgoingに戻してください。

これがまったく役に立ったら教えてください。

+0

私の更新された質問とエラーログを確認してください、それは本当に私の問題を解決するのに役立ちます – PinkeshGjr

+0

それは新しいエラーですので、通常は新しい質問を開くのが最善です。この場合、問題はあなたが間違った場所から 'VoiceGrant'をインポートしていることです。 Twilio.jwt.access_token.grantsからVoiceGrantをインポートする必要があります。 [アクセストークンのドキュメント](https://www.twilio.com/docs/api/rest/access-tokens?code-sample=code-creating-an-access-token-voice&code-language=py&code-sdk-バージョン= 6.x)を参照してください。 – philnash

+0

別のエラーが発生しました更新された質問をエラーログで確認してください ありがとう – PinkeshGjr

0

はここ

return str(
        '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Client>' + IDENTITY + '</Client></Dial></Response>') 
+0

twillioダッシュボードでリクエストURLを変更する必要がありますか? – PinkeshGjr

+0

必要はありません。ハッシュマップが正しく送信されていることを確認してください。 –

+0

OKですが、placeCallについてはわかりません。リクエストURLは/発信しているので、 – PinkeshGjr

関連する問題