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

如何在Node.js中通过Call SID获取Twilio语音通话录音媒体文件

获取Twilio通话录音的正确方法(Node.js)

我明白你现在的困扰——已经成功开启了通话录音,但不知道怎么通过Call SID拿到对应的录音文件或URL。其实twilio-node包完全兼容Twilio的API,只是你需要查询通话关联的录音资源,而不是只获取通话本身的日志。下面一步步帮你解决:


第一步:通过Call SID获取关联的录音列表

每个通话的录音是独立的资源,不会直接包含在通话日志的fetch()结果里。你需要调用calls(callSid).recordings.list()来获取该通话下所有的录音(一个通话可能有多个录音,比如双向录音场景)。

示例代码:

const twilio = require('twilio');
const client = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);

async function fetchRecordingsForCall(callSid) {
  try {
    // 获取该通话下的所有录音
    const recordings = await client.calls(callSid).recordings.list();
    
    if (recordings.length === 0) {
      console.log("这个通话没有生成录音,请检查录音配置是否生效");
      return [];
    }

    // 提取关键信息返回
    return recordings.map(rec => ({
      recordingSid: rec.sid,
      mediaUrl: rec.mediaUrl, // 录音的原始媒体URL
      duration: rec.duration, // 录音时长(秒)
      createdAt: rec.dateCreated
    }));
  } catch (err) {
    console.error("获取录音失败:", err);
    throw err;
  }
}

// 使用示例
// fetchRecordingsForCall("你的Call SID").then(recordings => console.log(recordings));

第二步:处理录音媒体URL的访问权限

拿到mediaUrl后,你会发现直接在前端使用这个URL会返回401错误——因为Twilio的媒体URL需要HTTP基本认证(用你的Account SID和Auth Token)。有两种常用的解决方案:

方案1:生成临时签名URL(推荐前端直接使用)

利用Twilio的createSignedUrl方法,生成一个带有效期的公开可访问URL,不需要前端处理认证:

async function getPublicRecordingUrl(mediaUrl) {
  // 生成有效期为1小时的签名URL(可根据需求调整expires参数)
  const expiresAt = Math.floor(Date.now() / 1000) + 3600; 
  const signedUrl = client.createSignedUrl(mediaUrl, { expires: expiresAt });
  return signedUrl;
}

// 使用示例
// fetchRecordingsForCall("你的Call SID")
//   .then(recordings => getPublicRecordingUrl(recordings[0].mediaUrl))
//   .then(publicUrl => console.log("可直接播放的URL:", publicUrl));

方案2:服务器代理请求

如果你不想暴露签名URL,也可以在自己的Node.js服务器上创建一个代理路由,转发对录音文件的请求并带上认证信息:

const express = require('express');
const http = require('http');
const app = express();

// 代理录音请求的路由
app.get('/api/recording/:recordingSid', (req, res) => {
  const recordingSid = req.params.recordingSid;
  const twilioUrl = `https://api.twilio.com/2010-04-01/Accounts/${process.env.TWILIO_ACCOUNT_SID}/Recordings/${recordingSid}.mp3`;

  // 配置请求选项,带上Twilio认证
  const options = {
    hostname: 'api.twilio.com',
    path: `/2010-04-01/Accounts/${process.env.TWILIO_ACCOUNT_SID}/Recordings/${recordingSid}.mp3`,
    auth: `${process.env.TWILIO_ACCOUNT_SID}:${process.env.TWILIO_AUTH_TOKEN}`
  };

  // 转发请求
  http.get(options, (twilioRes) => {
    res.writeHead(twilioRes.statusCode, twilioRes.headers);
    twilioRes.pipe(res);
  }).on('error', (err) => {
    res.status(500).send(`获取录音失败:${err.message}`);
  });
});

app.listen(3000, () => console.log("服务器运行在端口3000"));

前端可以直接请求http://你的服务器地址/api/recording/录音SID来播放录音。


额外检查点

  1. 确认录音已生成:如果调用recordings.list()返回空数组,检查你的录音参数是否正确——比如record: true是否生效,通话是否成功接通(未接通的通话不会生成录音)。
  2. 更新twilio-node包:如果遇到API兼容性问题,执行npm install twilio@latest更新到最新版本,确保和Twilio官方API同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:02:30