Создание автоматического ассистента с использованием .NET MVC6, Entity Framework и Twilio на Mac

Автор: | 01.08.2026

Несколько месяцев назад я показал, как использовал Twilio для создания собственного личного ассистента, который следил за моим Google Календарем и звонил на все мои встречи для меня.

С тех пор как я начал его использовать, мне удавалось не только успевать на все конференц-звонки, но и тратить больше времени на то, чтобы помнить о других вещах, которые я пока не могу автоматизировать.

У меня есть довольно надежный способ убедиться, что я присутствую на всех конференц-звонках, но что происходит, когда кто-то звонит мне? Если вы разработчик, вы знаете, что концентрация — довольно сложная задача, а убедиться, что вы сохраняете концентрацию, почти невозможно. На самом деле, график ниже показывает это очень хорошо.

Имея это в виду, я подумал, что мне пора заняться тем фактом, что ответ на звонки довольно высок в списке приоритетов личного ассистента, а мой просто этого не делал. В этот раз мы создадим автоматического ассистента с .NET MVC6, Entity Framework и Twilio на Mac, который будет обрабатывать все наши входящие звонки и решать, что с ними делать, на основе номера звонящего.

Таким образом, я могу, например, решить принимать звонки только от определенных людей, которые затем будут автоматически перенаправлены на выбранный мной номер, или полностью игнорировать эти звонки, воспроизводя личное сообщение и прося звонящего перезвонить позже.

Если вы предпочитаете сразу перейти к финальному приложению, не стесняйтесь скачать его из репозитория Github.

— Аккаунт Twilio и один номер телефона Twilio с поддержкой голосовых вызовов. – Зарегистрируйтесь бесплатно!

— Visual Studio Code, ASP.NET 5 и .NET MVC 6, установленные на Mac. Вы можете узнать, как их установить, прочитав мой пост в блоге Начало работы с ASP.NET 5 и Visual Studio Code на Mac

— Ngrok

Мы начнем с получения номера Twilio, который мы затем будем раздавать нашим друзьям или контактам.

Откройте ваше любимое приложение терминала и создайте новый проект *Web Application Basic [without Membership and Authorization]* с помощью Yeoman под названием *PhonePA*.

После создания откройте Visual Studio Code и откройте файл *project.json*. Добавьте зависимости для Twilio и Entity Framework 7, которые мы будем использовать для создания структуры нашей базы данных через миграции.

Мы будем использовать SQLite в качестве базы данных для этого примера, чтобы все было автономным. Мы также добавили запись под *commands* под названием *ef*. Это чтобы мы могли вызывать миграции Entity Framework прямо из Терминала позже.

Сохраните этот файл, и VS Code предложит вам восстановить пакеты. Нажмите Restore, и после завершения проверьте, что Entity Framework установлен и настроен правильно, выполнив следующий код на том же экране терминала.

На том же экране создайте новый каталог с названием *Models* и выполните в него *cd*.

Вернувшись в VS Code, создайте новый файл в *Models* под названием *Contact.cs* и добавьте в него следующее.

Теперь, когда мы создали нашу модель, вернитесь в Терминал и заставьте Entity Framework создать для нас миграцию. Мы сможем проверить все, что он собирается сделать, прежде чем применить нашу миграцию, открыв сгенерированные классы.

После выполнения вы заметите, что в VS Code был автоматически создан новый каталог с названием *Migrations*. Этот каталог будет содержать все миграции, которые мы создаем. Откройте файл с названием [timestamp]_InitialMigration.cs. Обратите внимание, что временная метка будет зависеть от того, когда вы создали миграцию.

В этом файле вы сможете увидеть все, что будет сделано при применении этой миграции. Начиная с версии 7.0.0-beta6, в Entity Framework есть ошибка, которая помешает вам успешно запустить миграции, если вы не закомментируете аннотацию *AutoIncrement*. Так что давайте закомментируем эту строку, как показано.

Мы готовы к созданию структуры нашей базы данных. Запустите следующую команду в терминале.

После завершения вы увидите, что в корневом каталоге вашего проекта был создан новый файл с названием *contacts.db*. Наша база данных создана и готова к использованию.

Запустите приложение и проверьте, что оно работает должным образом. Позже мы изменим *Home*Controller и добавим несколько представлений, чтобы позволить нам создавать и обновлять контакты. В терминале выполните следующее:

Обратите внимание, что мы также добавили некоторые зависимости к *Twilio .NET Libraries*, которые мы будем использовать позже.

Теперь, когда мы создали нашу конечную точку, откройте *Views/Home/Index.cshtml* и замените его содержимое следующей разметкой для отображения информации о наших контактах.

Вернувшись в Терминал, остановите запущенное приложение с помощью CTRL C, запустите его снова и перейдите к нему. Вы должны увидеть страницу, которая выглядит как на изображении ниже.

Там еще нет никаких результатов, так как мы не создали функциональность, которая позволит нам создавать, редактировать и удалять контакты.

Вернитесь к файлу *HomeController.cs* и добавьте в него следующие четыре метода действия:

Теперь, когда мы добавили нужные конечные точки, давайте создадим для них представления. Создайте новый файл под названием *Create.cshtml* в */Views/Home* и добавьте в него следующее:

В том же каталоге создайте новый файл под названием *Edit.cshtml* и добавьте в него следующее.

Время для еще одного запуска. Снова запустите приложение в Терминале и создайте новый контакт. Вы увидите, что каждый новый контакт отображается на главной странице, и что теперь вы можете обновлять или удалять их данные.

Теперь, когда мы можем создавать и редактировать наши контакты, пришло время сообщить Twilio об их существовании и о том, что делать с каждым из них, когда они звонят на наш номер Twilio.

Поскольку Twilio нуждается в доступе к вашему приложению, мы будем использовать ngrok, чтобы сделать нашу локальную среду доступной извне. Мой коллега Кевин Уиннери написал отличный пост в блоге о том, как начать работать с ngrok.

Вернувшись в терминал, откройте новую вкладку и выполните следующее, чтобы создать туннель к вашей локальной среде. Обязательно скопируйте URL переадресации.

Вернитесь к номеру, который вы купили ранее, и в разделе *Voice* измените *Request URL*, чтобы он указывал на URL переадресации и новую конечную точку, которую мы создадим. URL должен выглядеть так:

http://{my-ngrok-forwarding-url}/Home/HandleCall

Сохраните это и вернитесь к *HomeController.cs*. Теперь мы добавим последнюю конечную точку под названием *HandleCall*, которая будет содержать логику для ответа на запросы, поступающие от Twilio.

Логика выше очень проста, но мощная. Она проверяет базу данных на наличие номера при каждом входящем звонке и сообщает Twilio, что делать, через TwiML. Есть три возможных исхода:

**Входящий номер не существует в базе данных**: Звонящий получает стандартное сообщение о том, что этот номер только для контактов. **Входящий номер существует и не заблокирован**: Звонящий перенаправляется на наш реальный номер телефона. Я использовал для этого переменную окружения, но вы можете просто заменить ее на свой собственный мобильный номер, например. Для получения дополнительной информации о создании и управлении переменными окружения на Mac, ознакомьтесь с этой статьей. **Входящий номер существует, но заблокирован**: Звонящему воспроизводится персонализированное сообщение.

Чтобы проверить это, вы можете создать новый контакт с другим мобильным или стационарным номером, который у вас есть, и попробовать позвонить на ваш номер Twilio с него. В зависимости от статуса, вы увидите, что будут воспроизводиться разные сообщения.

Мы начали с необходимости отвечать на каждый наш звонок, а теперь у нас есть полностью автоматизированная система, которая будет обрабатывать каждый звонок на наш номер Twilio. Она не только будет отвечать на них, но и решать, важен ли нам звонок в данный момент.

Есть и другие функции, которые мы могли бы добавить в наше телефонное приложение, такие как запись звонков с помощью глагола , или создание меню опций, которое в конечном итоге даст звонящему автоматический ответ на то, что они ищут, с помощью глагола .

Как насчет того, чтобы заставить его обрабатывать входящие SMS-сообщения и использовать статусы для автоответа на сообщения?

Я был бы рад увидеть, что у вас получится. Свяжитесь со мной в Twitter @marcos_placona или по электронной почте marcos@twilio.com, чтобы рассказать об этом.