You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以编程方式控制Twilio号码接听来电?

实现编程控制Twilio号码接听来电的方案

当然可以实现!Twilio完全支持通过代码来控制来电的接听时机——默认自动接听是因为Twilio收到来电后,会执行你配置的Webhook返回的TwiML指令,只要调整这个逻辑,就能实现手动控制接听的效果。下面是具体的实现步骤:

1. 先将来电放入队列,避免自动接听

当Twilio号码收到来电时,不要直接返回<Dial>或<Say>这类会触发接听的指令,而是用<Enqueue>把来电放到等待队列里,同时配置状态回调来跟踪来电的实时状态,这样来电会处于振铃等待状态,不会被自动接听。

举个Node.js的示例代码:

const express = require('express');
const twilio = require('twilio');
const app = express();
app.use(express.urlencoded({ extended: false }));

// 处理来电的Webhook路由
app.post('/incoming-call', (req, res) => {
  const twiml = new twilio.twiml.VoiceResponse();
  // 将来电放入指定队列,同时监听全生命周期状态
  twiml.enqueue({
    waitUrl: '/wait-music', // 可选,给来电者播放等待音乐
    statusCallback: '/call-status',
    statusCallbackEvent: 'initiated ringing answered completed'
  }, 'user-call-queue');
  
  res.type('text/xml');
  res.send(twiml.toString());
});

// 等待音乐的响应路由
app.post('/wait-music', (req, res) => {
  const twiml = new twilio.twiml.VoiceResponse();
  twiml.play('https://example.com/your-wait-music.mp3'); // 替换成你的等待音乐URL
  res.type('text/xml');
  res.send(twiml.toString());
});

2. 在UI触发“接听”操作时,连接来电

当你的UI上收到等待来电的通知(通过状态回调),用户点击“接听”按钮后,调用Twilio的REST API发起一个新的呼叫,将队列中的来电连接到指定的终端(比如你的个人手机、软电话客户端)。

示例代码:

const accountSid = '你的Twilio账户SID';
const authToken = '你的Twilio认证Token';
const client = require('twilio')(accountSid, authToken);

// 用户点击UI上的接听按钮时执行这个函数
async function handleAnswerCall() {
  try {
    const newCall = await client.calls.create({
      url: '/connect-queued-call', // 这个路由用来连接队列
      to: '+1234567890', // 替换成你要接听的终端号码或Twilio Client ID
      from: '你的Twilio号码'
    });
    
    // 这里可以把Call SID传给前端,用来跟踪后续状态
    console.log(`接听呼叫已发起,SID: ${newCall.sid}`);
  } catch (error) {
    console.error('接听失败:', error);
  }
}

// 连接队列来电的路由
app.post('/connect-queued-call', (req, res) => {
  const twiml = new twilio.twiml.VoiceResponse();
  const dial = twiml.dial();
  dial.queue('user-call-queue'); // 要和之前的队列名称一致
  
  res.type('text/xml');
  res.send(twiml.toString());
});

3. 实时跟踪通话状态更新UI

通过之前配置的statusCallback路由,你可以接收Twilio发送的通话状态变更通知,然后用WebSocket或Server-Sent Events推送到前端,实现UI上的状态动态更新。

示例状态回调处理:

app.post('/call-status', (req, res) => {
  const callSid = req.body.CallSid;
  const callStatus = req.body.CallStatus;
  const fromNumber = req.body.From;
  
  // 这里把状态推送到前端UI,比如用Socket.io发送事件
  // io.emit('call-status-update', { callSid, status: callStatus, from: fromNumber });
  
  console.log(`来电 ${fromNumber} 状态更新为: ${callStatus}`);
  res.sendStatus(200);
});

注意事项

  • 开发阶段可以用ngrok这类工具把本地服务暴露成公网可访问的URL,供Twilio调用Webhook。
  • 队列名称要保持一致,否则无法正确连接到来电。
  • 如果使用Twilio Client(软电话),to参数要写成client:你的客户端ID的格式,并且确保客户端已完成注册。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:58:56