使用Microsoft Graphs SDK向团队用户发起呼叫

时间:2020-06-23 20:01:04

标签: c# microsoft-graph-sdks microsoft-graph-teams

我正在尝试使用下面的代码示例通过Microsoft Graph SDK Create call API发起调用。尝试失败,出现Not Found异常。

我有registered the bot应用程序,添加了API call permissions,并且能够接收来自团队的来电。

从Microsoft文档中尚不清楚是否可以直接呼叫Teams用户或是否必须为其分配VoIP号码。有没有人能够使用Graph SDK调用团队用户?用户需要进行一些特殊配置才能接听电话吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Microsoft.Graph.Communications.Common.Telemetry;
using Microsoft.Extensions.Logging;
using Microsoft.Graph;
using Microsoft.Graph.Communications.Calls;
using Microsoft.Graph.Communications.Calls.Media;
using Microsoft.Graph.Communications.Client;
using Microsoft.Skype.Bots.Media;

namespace sipbotcaller
{
    class Program
    {
        private static string APP_NAME = "";
        private static string APP_ID = "";
        private static string APP_SECRET = "";
        private static string TENANT_ID = "";
        private static string CALLBACK_URI = "";
        private static string CERTIFICATE_THUMBPRINT = "";
        private static int MEDIA_PORT = 10000;
        private static string PUBLIC_IP = "";
        private static string HOSTNAME = "";

        static async Task Main(string[] args)
        {
            Console.WriteLine("Teams Call Console:");

            GraphLogger graphLogger = new GraphLogger(APP_NAME);
            graphLogger.DiagnosticLevel = System.Diagnostics.TraceLevel.Verbose;
            ILogger logger = new ConsoleLogger(graphLogger);

            AuthenticationProvider authProvider = new AuthenticationProvider(
                APP_NAME,
                APP_ID,
                APP_SECRET,
                TENANT_ID,
                graphLogger);

            GraphServiceClient graphClient = new GraphServiceClient(authProvider);

            var users = await graphClient.Users.Request().GetAsync();

            foreach (var user in users)
            {
                Console.WriteLine($"user Id: {user.Id}.");
                Console.WriteLine($"user Display Name: {user.DisplayName}.");
            }

            var mediaPlatformSettings = new MediaPlatformSettings()
            {
                MediaPlatformInstanceSettings = new MediaPlatformInstanceSettings()
                {
                    CertificateThumbprint = CERTIFICATE_THUMBPRINT,
                    InstanceInternalPort = MEDIA_PORT,
                    InstancePublicIPAddress = IPAddress.Parse(PUBLIC_IP),
                    InstancePublicPort = MEDIA_PORT,
                    ServiceFqdn = HOSTNAME,
                },

                ApplicationId = APP_ID,
            };

            var builder = new Microsoft.Graph.Communications.Client.CommunicationsClientBuilder(
                APP_NAME,
                APP_ID,
                graphLogger);

            builder
                .SetAuthenticationProvider(authProvider)
                .SetNotificationUrl(new Uri(CALLBACK_URI))
                .SetMediaPlatformSettings(mediaPlatformSettings)
                .SetServiceBaseUrl(new Uri(CALLBACK_URI));

            var client = builder.Build();

            AudioSocketSettings audioSockSettings = new AudioSocketSettings { 
                CallId = Guid.NewGuid().ToString(), 
                SupportedAudioFormat = AudioFormat.Pcm16K,
                StreamDirections = StreamDirection.Sendrecv
            };
            AudioSocket audioSock = new AudioSocket(audioSockSettings);
            var mediaConfig = MediaPlatform.CreateMediaConfiguration(audioSock);

            Console.WriteLine($"media config: {mediaConfig}");

            Console.WriteLine($"Attempting to call {users.First().DisplayName}.");

            var call = new Call
            {
                CallbackUri = CALLBACK_URI,
                TenantId = TENANT_ID,
                Targets = new List<InvitationParticipantInfo>()
                {
                    new InvitationParticipantInfo
                    {
                        Identity = new IdentitySet
                        {
                            User = new Identity
                            {
                                DisplayName = users.First().DisplayName,
                                Id = users.First().Id
                            },
                        }
                    }
                },
                RequestedModalities = new List<Modality>()
                {
                    Modality.Audio
                },
                MediaConfig = new AppHostedMediaConfig()
                {
                    Blob = mediaConfig.ToString(Newtonsoft.Json.Formatting.None)
                },
            };

            var callResult = await client.Calls().AddAsync(call);

            Console.WriteLine($"Call result {callResult.Id}.");

            Console.WriteLine("Finished.");
            Console.WriteLine("Press any key to exit...");
            Console.ReadLine();
        }
    }
}

结果:

<snip>
StatefulCall: Verbose
StatefulCall: Info
StatefulCall: Verbose
StatefulCall: Info
StatefulCall: Info
StatefulCall: Error {
  "error": {
    "code": "itemNotFound",
    "message": "Unexpected exception returned from the service.\r\nStatus Code: NotFound"
  }
}
StatefulCall: Info

0 个答案:

没有答案