«Алло, Skype? Это .NET… Могу я записать тебя?»

Грэг Дункан

Не знаю, как вы, а мне иногда нравится побыть кодером. Обычно это происходит тогда, когда я вижу приложение, которое я могу расширить, подключиться к нему, соединиться с ним или улучшить. Тогда я говорю себе: «Я действительно хочу это приложение, ведь можно сделать X», и затем осознаю, что я на самом деле в состоянии самостоятельно заставить программу делать X! Творческий порыв заставляет вернуться за клавиатуру …

Сегодняшнее сообщение как раз такого сорта. Гэл Ратнер (Gal Ratner) поглядел на Skype и, кажется, произнес: «Хотелось бы иметь возможность записывать звонки, которые я делаю с помощью Skype… Уверен, это будет клевый код…»

Он не только сделал это, но и поделился с нами. clip_image002

Как записывать голосовые разговоры по Skype

clip_image004

Skype предоставляет общедоступный API для прослушивания и передачи сообщений всем программам на вашем ПК. Сообщения передаются через естественный оконный API и требуют использования внешних методов вызова.

В этой статье мы собираемся построить WPF-клиента, который будет взаимодействовать со Skype, регистрировать голосовые вызовы, перенаправлять входящие и исходящие потоки в файлы и, наконец, создавать полный файл беседы.

Давайте начнем с включения необходимых внешних методов:

...

Вот снимок кода из сообщения… Что я нашел интересным, так это как команды посылаются Skype. Это не способ, который обычно можно увидеть в COM или .NET API .

 public static string RecordOutputCommand = @"ALTER CALL {0} SET_OUTPUT FILE=""{1}.output""";
 public static string RecordInputCommand = @"ALTER CALL {0} SET_CAPTURE_MIC FILE=""{1}.input""";
 private void RecordButton_Click(object sender, RoutedEventArgs e)
 {
     // Fill in the new conversation file name
     string conversationFile = String.Format(Utils.SkypeConversationsFile, Utils.SkypeConversationsFolder, Utils.CurrentCallNumber);
     FileNameTextBox.Text = conversationFile;
     try
     {
         if (!Directory.Exists(Utils.SkypeConversationsFolder))
             Directory.CreateDirectory(Utils.SkypeConversationsFolder);
     }
     catch (Exception ex)
     {
         MessageBox.Show("Cannot create directory " + Utils.SkypeConversationsFolder + ". " + ex.Message);
     }
     // Start recording
     if (RecordButton.Content.ToString() == "Start Recording")
     {
         string recordOutputCommand = String.Format(Utils.RecordOutputCommand, Utils.CurrentCallNumber, conversationFile);
         string recordInputCommand = String.Format(Utils.RecordInputCommand, Utils.CurrentCallNumber, conversationFile);
         NativeCalls.SendSkypeMessage(recordOutputCommand);
         NativeCalls.SendSkypeMessage(recordInputCommand);
         RecordButton.Content = "Stop Recording";
     }
     else
     {
         // Stop recording
         string recordEndOutputCommand = String.Format(Utils.RecordEndOutputCommand, Utils.CurrentCallNumber);
         string recordEndInputCommand = String.Format(Utils.RecordEndInputCommand, Utils.CurrentCallNumber);
         NativeCalls.SendSkypeMessage(recordEndOutputCommand);
         NativeCalls.SendSkypeMessage(recordEndInputCommand);
         RecordButton.Content = "Start Recording";
         MakeConversationFile();
     }
 }

Снимок решения:

clip_image006

clip_image008

Заключение

Открытый API Skype содержит много более полезных команд, полную документацию можно найти здесь. С вашего разрешения я присоединил весь код к этому примеру и установщик msi для работы демонстрационной программы [Грег Дункан: щелкните здесь для загрузки…]

Если вы заинтересованы в расширении Skype, то можете начать с этой статьи…

Вот несколько ссылок, которые могут оказаться интересными: