/
call-transfer.py
56 lines (40 loc) · 1.62 KB
/
call-transfer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from flask import Flask, request, url_for
from flask import render_template
from twilio.util import TwilioCapability
import twilio.twiml
from twilio.rest import TwilioRestClient
app = Flask(__name__)
TWILIO_ACCOUNT_SID = "XXXXX"
TWILIO_AUTH_TOKEN = "XXXXX"
# temporary storage for client to call_sid mapping
# we should use a more persistent storage for production
client_to_incoming_sid = {}
@app.route('/transfer_call/<from_client>/to/<to_client>')
def transfer_call(from_client, to_client):
incoming_sid = client_to_incoming_sid[from_client]
# client_to_incoming_sid[to_client] = incoming_sid
trc = TwilioRestClient(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)
call = trc.calls.get(incoming_sid)
to_client_url = url_for('incoming_voice_url', client_name=to_client)
call.route(url=to_client_url, method='GET')
return 'ok'
@app.route("/incoming_voice_url/<client_name>")
def incoming_voice_url(client_name):
# call sid from twilio
call_sid = request.args.get('CallSid')
# construct the twiml response
resp = twilio.twiml.Response()
dial = resp.dial()
dial.client(client_name)
# store the mapping
client_to_incoming_sid[client_name] = call_sid
# dump the twiml
return str(resp)
@app.route("/client/<client_name>")
def start(client_name):
twilio_capability = TwilioCapability(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)
twilio_capability.allow_client_incoming(client_name)
capability_token = twilio_capability.generate()
return render_template('client.html', capability_token=capability_token, client_name=client_name)
if __name__ == "__main__":
app.run(debug=True)