twilio App to App调用无效

时间:2017-07-14 06:29:04

标签: python heroku twilio twilio-api twiml

我在Python上使用eroku设置了TwiMl。 当我从用户B呼叫用户A时,用户A也没有接到电话和VOIP,而用户B得到了像“感谢呼叫”这样的机器人消息。

当我尝试placeCall来自PostMan的用户B时,用户B会接到电话,并且还会收到类似“感谢您致电”的机器人消息。

PostMan网址:https://myapp.herokuapp.com/placeCall

我的要求是,当我从应用程序中调用用户A时,用户B将接到电话并且两者都能够进行通信。

要求

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)

错误记录

enter image description here

twilio仪表板上的TwiML设置

请求网址:https://myapp.herokuapp.com/outgoing

请告诉我有什么我错过了配置或我做错了什么。

我配置TwiML的教程是Here

2 个答案:

答案 0 :(得分:2)

Twilio开发者传道者在这里。

我不确定您是在构建iOS还是Android应用,但这个想法是一样的。当您拨打电话时,就像iOS quickstart in Swift中的示例一样,使用以下代码:

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

您应该使用该调用发送一些参数,例如您正在调用的客户端标识。 e.g。

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

然后,Twilio将调用您在TwiML应用程序中设置的URL。在快速入门中,网址应为/outgoing,并在快速入门应用程序中提供示例语音邮件。要调用另一个应用程序,您需要从/outgoing返回不同的响应。在这种情况下,您需要使用<Dial>与嵌套<Client>一起使用调用时传递的To参数。

在Python / Flask中,这看起来像是:

@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)

我注意到在问题的评论中,您将TwiML应用网址更改为/placeCall。请务必将其更改回/outgoing

让我知道这是否有帮助。

答案 1 :(得分:0)

placeCall返回语句

上尝试此代码
return str(
        '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Client>' + IDENTITY + '</Client></Dial></Response>')