I have setup TwiMl on eroku in Python. When I call user A from user B, user A didn't get call and VOIP also, while user B is got bot message like "thanks for calling".
When I try to placeCall
to user B from PostMan
, user B gets call and also got bot message like "thanks for calling".
PostMan URL : https://myapp.herokuapp.com/placeCall
My requirement is when I call user A from application user B will get call and both can able to communicate.
Requirement
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
Here is my Python TwiMl Code.
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)
Error Logs
TwiML setting on twilio dashboard
Request URL : https://myapp.herokuapp.com/outgoing
Please let me know is there anything that I missed to configure or something that I have done wrong.
Tutorial that I followed to configure TwiML is Here
Configure Your Twilio NumberClick the Twilio number you want to use for your calls in your Active Numbers here. Scroll down to the A CALL COMES IN dropdown in the Voice section and select Studio Flow. Select your new Flow in the Select a Flow dropdown to the right.
An 'application error' means that the code Twilio is trying to fetch at the URL specified on your servers is either unavailable or has errors in it. You can check the URL for a given phone number via your console or within your application's instructions for handling a call.
Call Status Callbacks There are two ways to tell Twilio which URL to use. You can: Set the StatusCallback parameter on a Call resource for an outgoing phone call that uses the REST API. Set the statusCallback attribute on the <Number> element in TwiML.
Make an outbound call For any Function using the built-in Twilio Client, the "Add my Twilio Credentials (ACCOUNT_SID) and (AUTH_TOKEN) to ENV" option on the Settings > Environment Variables tab must be enabled. You can use a Function to make a call from your Twilio phone number via Programmable Voice.
Twilio developer evangelist here.
I'm not sure whether you're building an iOS or Android app, but the idea is the same. When you place a call, like in the example here from the iOS quickstart in Swift, using code like this:
TwilioVoice.sharedInstance().call(accessToken, params: [:], delegate: self)
you should send some parameters with that call, for example the client identity that you are calling. e.g.
TwilioVoice.sharedInstance().call(accessToken, params: ["To": "ClientIdentity"], delegate: self)
Then, Twilio will call the URL you set in your TwiML application. In the quickstart the url should be /outgoing
and in the quickstart application you get an example voice message. To make the call to another application you need to return a different response from /outgoing
. In this case, you need to use <Dial>
with a nested <Client>
using the To
parameter passed when making the call.
In Python/Flask this would look like:
@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)
I notice that in the comments on the question you changed the TwiML App URL to /placeCall
. Make sure you change that back to /outgoing
.
Let me know if this helps at all.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With