В начале этого месяца вы узнали об Иэне Вебстере, который создал приложение для звонков вашим федеральным представителям. Общение может быть мощной силой для перемен. Сегодня мы научимся расширять возможности других, создавая приложение, похожее на приложение Иэна, но с использованием SMS.
С помощью C#, ASP.NET и Azure мы создадим приложение для обмена сообщениями, которое будет отвечать на почтовый индекс списком федеральных представителей для данного региона:
Инструменты, которые мы будем использовать, — это основные компоненты стека Microsoft, а также API Twilio и API Конгресса от Sunlight Foundation. Вот что вам понадобится прямо сейчас:
— Аккаунт Twilio
— Visual Studio 2015 – подойдет бесплатная Community Edition
— Аккаунт Azure
— Ключ API для Sunlight Foundation Congress API
Мы также будем использовать ASP.NET MVC 5 и библиотеку-помощник Twilio для C#.
Сначала создайте новый пустой проект ASP.NET MVC, который сможет обрабатывать входящие SMS-сообщения от Twilio. Пошаговые инструкции можно найти в нашей документации по настройке нового проекта.
Назовите ваш проект TwilioCongressBot.Web, а решение — TwilioCongressBot. Как только вы увидите, что ваше веб-приложение Azure готово, можно продолжать.
Для завершения структуры нашего проекта необходимо установить несколько зависимостей через NuGet Package Manager. В меню выберите Tools > NuGet Package Manager > Package Manager Console. Затем выполните следующие команды:
Когда Twilio получает SMS-сообщение на номер телефона, которым вы владеете, он вызывает специальный URL, называемый Webhook. Давайте создадим пустой контроллер MVC 5 и назовем его LegislatorController. В нашем ранее упомянутом руководстве есть подробности о создании нового контроллера.
Обновите пространства имен, которые вы импортируете в свой контроллер, следующим образом:
Затем убедитесь, что ваш LegislatorController наследуется от TwilioController:
Если у вас еще нет ключа API, перейдите на сайт Sunlight Foundation и зарегистрируйтесь, чтобы получить бесплатный ключ. На их сайте также есть документация по API.
Нам нужно где-то хранить этот ключ API, и типичное место для этого в приложении ASP.NET — файл Web.config, а именно раздел appSettings:
Добавьте выделенную строку в ваш файл web.config и используйте ключ API, который вы получили в процессе регистрации.
Мы будем вызывать конечную точку /legislators/locate, передавая ей почтовый индекс и наш ключ API. Шаблон URL, который мы будем использовать, можно назначить частному полю нашего контроллера следующим образом:
Мы будем использовать функцию String.Format() в C# для замены {0} на почтовый индекс и {1} на наш ключ API из файла web.config. Как только мы построим URL, мы сможем использовать RestSharp (уже включенный как зависимость библиотеки-помощника Twilio) для выполнения вызова и Json.Net для разбора результата:
Класс CongressApiResult определяет все ожидаемые свойства результата API. Нам нужно создать файл исходного кода для хранения этого класса и зависимых классов. Поместите его в папку «Models» нашего решения.
Совет профессионала: Этот класс был автоматически сгенерирован в Visual Studio путем копирования ожидаемого JSON-результата (полученного здесь) из API Конгресса и использования команды: Edit… Paste Special… Paste JSON as Classes. Затем сгенерированный класс Result был вручную переименован в Legislator:
Как видно здесь, Twilio передаст нам параметр Body, содержащий текст отправленного нам сообщения. Также он может передать параметр FromZip, если сможет определить географические данные на основе исходного номера телефона (не геолокация). Например, если SMS было отправлено из кода региона 415, Twilio может сообщить, что этот код региона находится в Сан-Франциско, штат Калифорния.
Давайте сначала проверим параметр Body, чтобы узнать, указал ли пользователь почтовый индекс, и в случае неудачи используем FromZip:
Обратите внимание, что мы добавляем сообщение о помощи, если используем FromZip, чтобы сообщить пользователю, что ему, возможно, нужно отправить нам свой конкретный почтовый индекс, если тот, который связан с его номером телефона, не соответствует месту его проживания.
Теперь нам просто нужно, чтобы действие контроллера использовало написанный нами код для получения почтового индекса, передачи его в API Конгресса и форматирования результатов:
В коде форматирования выше есть два момента, которые мы еще не рассмотрели. Во-первых, мы создаем следующий словарь как частное поле:
Это помогает нам перевести свойство «chamber» из API в более дружелюбное текстовое описание. Также у нас есть простая вспомогательная функция для объединения имени, отчества и фамилии представителя:
Полный исходный код контроллера и модели можно найти на GitHub.
Запустите ваше приложение из Visual Studio, чтобы просмотреть его в браузере. В случае пустого проекта ASP.NET у нас нет домашней страницы для нашего приложения:
Вместо использования браузера для тестирования откройте новое окно PowerShell и выполните следующую команду:
Замените XXXXX на случайный номер порта, который Visual Studio назначил вашему веб-приложению. Вы можете увидеть его в URL браузера, когда Visual Studio впервые запустит ваше приложение.
Это вернет объект PowerShell с ответом от вашего контроллера:
Вы должны увидеть необработанный XML-ответ, который мы возвращаем, в свойстве Content. Совет профессионала: вы можете увидеть только свойство Content с помощью одной команды:
После завершения публикации вы можете снова протестировать свое приложение из PowerShell:
Замените congressbot01 на имя, которое вы выбрали для своего веб-приложения Azure.
Если это сработает, мы можем перейти к привязке вашего Webhook к номеру телефона в Twilio.
Если вы еще не приобрели номер телефона Twilio, сделайте это сейчас. После этого вы можете настроить Webhook для сообщений следующим образом:
Используйте тот же URL для вашего веб-приложения Azure, который вы тестировали ранее в PowerShell. Обязательно нажмите кнопку SAVE, чтобы сохранить конфигурацию для номера телефона.
После подтверждения вашего номера телефона Twilio вы можете просто отправить SMS, чтобы протестировать его:
Вы можете скачать все решение с GitHub. Если вы хотите опубликовать это готовое приложение в Azure, щелкните правой кнопкой мыши на веб-приложении CongressBot в Solution Explorer и выберите «Publish».
Теперь все, что вам нужно сделать, — это сообщить номер телефона Twilio своим коллегам, друзьям, семье и т.д., и позволить их голосам быть услышанными! Или попросите их отправить SMS на номер (646) 8USA-REP (+1-646-887-2737), который работает на этом приложении.
Меня зовут Дэвид Протеро, и я работаю в команде Twilio Developer Education. Если у вас есть какие-либо вопросы или отзывы об этом проекте, дайте мне знать в комментариях ниже, напишите мне в Twitter @dprothero или отправьте письмо на dprothero@twilio.com.