如何在Python Django应用中通过Twilio实现常规语音通话?
实现Django + Twilio 常规语音通话的正确姿势
嘿,我来帮你搞定这个问题~你现在的代码其实已经能发起通话了,但用的是Twilio的demo TwiML,那个只是播放语音提示,要实现双向语音通话,核心是要让Twilio知道接通后该把通话转接到你朋友的号码,这就得用到TwiML里的<Dial>动词。
咱们分两种方式来实现,一种是快速测试的简易方案,另一种是贴合你Django应用的集成方案:
一、快速测试:用Twilio TwiML Bin
如果只是想先验证通话功能,不用改Django代码,直接用Twilio自带的TwiML Bin就行:
- 登录Twilio控制台,找到「TwiML Bins」(在左侧菜单「Tools」下面)
- 点击「Create TwiML Bin」,给它起个名字,然后在内容里输入:
<Response> <Dial>+你朋友的完整号码(带国家代码,比如+8613xxxxxxxxx)</Dial> </Response>
- 保存后,复制这个Bin的URL(类似
https://handler.twilio.com/twiml/xxxxxx) - 把你代码里的
url='http://demo.twilio.com/docs/voice.xml'替换成这个新的URL,运行代码就能发起通话,接通后Twilio会帮你桥接到你朋友的号码,实现正常对话。
二、Django集成方案(适合正式项目)
如果要把通话逻辑整合到你的Django应用里,需要自己写一个返回TwiML的视图:
1. 安装Twilio的Django相关依赖(可选,但更方便)
pip install twilio django-twilio
2. 编写Django视图
在你的app里新建一个视图函数,用来返回Twilio需要的TwiML指令:
from django.http import HttpResponse from twilio.twiml.voice_response import VoiceResponse, Dial def call_bridge(request): # 创建TwiML响应 resp = VoiceResponse() # 指定要转接的号码 dial = Dial() dial.number('+你朋友的完整号码') resp.append(dial) # 返回XML格式的响应 return HttpResponse(str(resp), content_type='application/xml')
3. 配置URL路由
在你的项目urls.py里添加路由:
from django.urls import path from .views import call_bridge urlpatterns = [ # 其他路由... path('twilio/call-bridge/', call_bridge, name='call_bridge'), ]
4. 让Twilio能访问到你的Django服务
如果是本地开发,Twilio没法直接访问你的localhost,所以需要用ngrok把本地端口暴露到公网:
# 假设你的Django运行在8000端口 ngrok http 8000
运行后会得到一个公网URL(类似https://xxxx-xx-xx-xx-xx.ngrok.io),把这个URL和你的路由拼接起来,就是Twilio要调用的地址:https://xxxx-xx-xx-xx-xx.ngrok.io/twilio/call-bridge/
5. 调整发起通话的代码
把你原来的代码里的url参数替换成上面的公网URL:
import os from twilio.rest import Client account_sid = os.environ['TWILIO_ACCOUNT_SID'] auth_token = os.environ['TWILIO_AUTH_TOKEN'] client = Client(account_sid, auth_token) call = client.calls.create( url='https://xxxx-xx-xx-xx-xx.ngrok.io/twilio/call-bridge/', to='+你的号码(已验证的)', # 这里是拨打你的号码,接通后Twilio会帮你转接到朋友的号码 from_='+你的Twilio号码' ) print(call.sid)
(注意:免费Twilio账号只能拨打已验证的号码,所以to参数填你自己验证过的号码,接通后Twilio会自动转接到朋友的号码)
关键注意事项
- 所有号码必须带国家代码(比如中国是+86,美国是+1),格式不能错
- 确保你的Twilio账号里的
Account SID和Auth Token正确配置到环境变量 - 如果是正式部署,要把Django服务放到公网可访问的服务器上,不用再依赖ngrok
- 免费账号有通话时长限制,超出后需要升级付费计划
内容的提问来源于stack exchange,提问作者Andi Maier
相关产品推荐
相关产品推荐

