You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python 3通过Twilio从笔记本电脑拨打固话的通话问题

解决Twilio通话接通后需触发webhook的问题

我明白你的困扰——你只是想通过Twilio快速发起一个语音通话,结果接通后还要按按键触发webhook,完全打断了原本简单的使用场景。别担心,这是因为Twilio的REST API需要明确知道通话接通后该执行什么操作,默认的提示是因为你没给它清晰的指令。下面我会给你几种简单的解决方案,让你接通后直接开始通话。

为什么会出现这个提示?

当你用Twilio的API创建通话时,Twilio需要一个url参数,这个参数指向一个能返回TwiML(Twilio标记语言)的端点。TwiML是告诉Twilio“接通后要做什么”的指令——比如播放语音、转接号码或者直接建立双向通话。如果没正确设置这个url,Twilio就会触发默认的提示,让你按键触发webhook。

解决方案1:用静态TwiML Bin(无需搭建服务器)

这是最简单的方式,不需要自己写代码搭服务器:

  1. 登录Twilio控制台,找到「TwiML Bins」(在左侧菜单的「Tools」下面)
  2. 创建一个新的TwiML Bin,把下面的代码粘贴进去(把你的手机号换成你用来和固话通话的号码,比如你的手机):
    <Response>
        <Dial>你的手机号</Dial>
    </Response>
    
    这个TwiML的意思是:当固话接通后,Twilio会把通话转接给你的手机号,你接听后就能直接和固话那边通话了。
  3. 保存后,复制这个TwiML Bin的URL(比如https://handler.twilio.com/twiml/xxxxxx
  4. 在你的Python通话代码里,把url参数设置为这个URL:
    from twilio.rest import Client
    
    account_sid = '你的Twilio账户SID'
    auth_token = '你的Twilio Auth Token'
    client = Client(account_sid, auth_token)
    
    call = client.calls.create(
        to='目标固话号码',  # 格式要正确,比如+8612345678901
        from_='你的Twilio号码',  # 格式比如+12345678901
        url='刚才复制的TwiML Bin URL'
    )
    
    print(call.sid)
    

解决方案2:本地搭临时web服务器(适合开发测试)

如果你想自己控制通话逻辑,可以用Flask搭一个简单的本地服务器,返回TwiML:

  1. 先安装Flask:
    pip install flask
    
  2. 创建一个app.py文件,内容如下:
    from flask import Flask, Response
    from twilio.twiml.voice_response import VoiceResponse, Dial
    
    app = Flask(__name__)
    
    @app.route("/answer", methods=['GET', 'POST'])
    def answer_call():
        # 创建TwiML响应:接通后转接你的手机号
        resp = VoiceResponse()
        dial = Dial()
        dial.number("你的手机号")  # 替换成你要用来通话的号码
        resp.append(dial)
        return Response(str(resp), mimetype='application/xml')
    
    if __name__ == "__main__":
        app.run(debug=True)
    
  3. 启动服务器:python app.py,它会在本地的5000端口运行
  4. 用ngrok把本地服务器暴露到公网(Twilio需要能访问到你的webhook):
    ngrok http 5000
    
    运行后会得到一个类似https://xxxx-xx-xx-xx-xx.ngrok.io的URL
  5. 修改你的通话代码,把url设置为ngrok的URL/answer
    call = client.calls.create(
        to='目标固话号码',
        from_='你的Twilio号码',
        url='https://xxxx-xx-xx-xx-xx.ngrok.io/answer'
    )
    
    这样当固话接通后,Twilio会请求这个本地webhook,返回的TwiML会直接把通话转接给你,不需要按键。

解决方案3:直接用Twilio Voice SDK(笔记本端通话)

如果想直接用笔记本的麦克风和扬声器和固话通话,不需要转接手机号,可以用Twilio Voice SDK(推荐用浏览器端的JavaScript SDK,因为Python端没有官方的Voice客户端SDK):

  • 你需要在Twilio控制台创建一个Voice SDK的凭证,然后写一个简单的网页,用SDK连接到Twilio,发起通话到固话。这种方式不需要webhook,因为SDK会直接处理通话连接。

关键说明

Twilio的REST API确实要求url参数(或者twiml参数,不过twiml参数只在特定场景下支持),因为它需要明确的通话流程指令。只要你给它正确的TwiML,就能跳过那个按键提示,直接进入通话。

内容的提问来源于stack exchange,提问作者user9414732

火山引擎 最新活动