如何利用WebEx API呼叫分机并播放音频文件?
解决方案:通过WebEx API或第三方工具实现PA系统音频播放
一、WebEx官方API正确实现步骤
你之前尝试的端点有误,WebEx Telephony API中不存在playsound/invoke接口,正确流程是先建立呼叫,待接通后调用媒体播放接口:
1. 发起呼叫到PA分机
使用/v1/telephony/calls/dial端点发起呼叫,需确保请求包含身份标识(如fromExtension),且AccessToken拥有spark:telephony_calls_write权限。
C#示例代码:
using System.Net.Http; using System.Text; using System.Text.Json; public async Task<string> InitiateWebExCall(string accessToken, string fromExtension, string paExtension) { var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}"); var requestBody = new { from = new { extension = fromExtension }, destination = new { extension = paExtension }, mediaType = "AUDIO" }; var content = new StringContent(JsonSerializer.Serialize(requestBody), Encoding.UTF8, "application/json"); var response = await client.PostAsync("https://webexapis.com/v1/telephony/calls/dial", content); response.EnsureSuccessStatusCode(); var responseData = await JsonSerializer.DeserializeAsync<JsonElement>(await response.Content.ReadAsStreamAsync()); return responseData.GetProperty("callId").GetString(); }
2. 监听呼叫状态,等待接通
轮询/v1/telephony/calls/{callId}端点,直到呼叫状态变为connected:
public async Task WaitForCallConnected(string accessToken, string callId) { var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}"); while (true) { var response = await client.GetAsync($"https://webexapis.com/v1/telephony/calls/{callId}"); response.EnsureSuccessStatusCode(); var responseData = await JsonSerializer.DeserializeAsync<JsonElement>(await response.Content.ReadAsStreamAsync()); var status = responseData.GetProperty("status").GetString(); if (status == "connected") break; await Task.Delay(1000); // 每秒轮询一次 } }
3. 呼叫接通后播放音频
使用/v1/telephony/calls/{callId}/actions/play/invoke端点播放音频,音频需为WebEx支持的格式(如16kHz单声道WAV),且URL需公网可访问:
public async Task PlayAudioOnWebExCall(string accessToken, string callId, string audioUrl) { var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}"); var requestBody = new { play = new { url = audioUrl, loop = false // 是否循环播放,按需设置 } }; var content = new StringContent(JsonSerializer.Serialize(requestBody), Encoding.UTF8, "application/json"); var response = await client.PostAsync($"https://webexapis.com/v1/telephony/calls/{callId}/actions/play/invoke", content); response.EnsureSuccessStatusCode(); }
4. 播放完成后挂断呼叫
调用/v1/telephony/calls/{callId}/actions/hangup/invoke端点挂断:
public async Task HangupWebExCall(string accessToken, string callId) { var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}"); var response = await client.PostAsync($"https://webexapis.com/v1/telephony/calls/{callId}/actions/hangup/invoke", null); response.EnsureSuccessStatusCode(); }
二、第三方方案:使用Twilio实现
如果WebEx API流程过于繁琐,Twilio可更简洁实现需求:
1. 核心逻辑
- 用Twilio呼叫API发起呼叫到PA分机
- 通过TwiML指定呼叫接通后播放的音频URL
- Twilio自动处理呼叫接通、播放音频、挂断流程
2. C#示例代码
using Twilio; using Twilio.Rest.Api.V2010.Account; using Twilio.Types; public void InitiateTwilioCall(string twilioAccountSid, string twilioAuthToken, string twilioPhoneNumber, string paExtension, string audioUrl) { TwilioClient.Init(twilioAccountSid, twilioAuthToken); var twiml = new Twilio.TwiML.VoiceResponse(); twiml.Play(new Uri(audioUrl)); twiml.Hangup(); // 播放完成后自动挂断 var call = CallResource.Create( to: new PhoneNumber(paExtension), // 需添加正确区号或前缀 from: new PhoneNumber(twilioPhoneNumber), twiml: new Twilio.Types.Twiml(twiml.ToString()) ); }
注意:需确保Twilio号码可呼叫到WebEx PA分机,且音频URL为公网可访问的WAV/MP3文件。
内容的提问来源于stack exchange,提问作者B-Ray
相关产品推荐
相关产品推荐

