如何在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来播放录音。
额外检查点
- 确认录音已生成:如果调用
recordings.list()返回空数组,检查你的录音参数是否正确——比如record: true是否生效,通话是否成功接通(未接通的通话不会生成录音)。 - 更新twilio-node包:如果遇到API兼容性问题,执行
npm install twilio@latest更新到最新版本,确保和Twilio官方API同步。
内容的提问来源于stack exchange,提问作者Pankaj Bhandarkar
相关产品推荐
相关产品推荐

