В этом посте я расскажу вам об основах интеграции Twilio с вашим приложением на Rails 4. Мы рассмотрим регистрацию в Twilio, покупку телефонного номера и подключение этого номера к вашему Rails-приложению. Но сначала я хотел бы рассказать вам одну историю.
Задолго до того, как я присоединился к Twilio и стал евангелистом разработчиков, я был владельцем малого бизнеса, которому нужно было создать достаточно сложное веб-приложение, и время поджимало. Это было в 2005 году, и я недавно уволился с работы Java-разработчика, чтобы открыть лигу любительского спорта. Почему я решил заняться этим — тема для отдельного поста, но мне нужно было быстро создать программное обеспечение, которое позволило бы людям регистрироваться в моей новой лиге, присоединяться к команде и совершать онлайн-платежи. Это были лишь начальные требования. Я знал, что могу создать это программное обеспечение с использованием Java-стека (Struts, Hibernate, MySQL), но меня беспокоило, как быстро я смогу все это реализовать. Мне нужно было запустить проект и открыть регистрацию в течение нескольких недель, чтобы начать рекламную кампанию перед предстоящим весенним сезоном.
На помощь пришел Ruby on Rails, который вышел в версии 1.0 13 декабря 2005 года. С помощью Rails я смог быстро создать необходимое программное обеспечение, и регистрация открылась вовремя. После запуска я мог продолжать быстро вносить изменения, легко мигрировать изменения в схеме базы данных и в целом сосредоточиться на своих клиентах, а не на мелочах. Справедливо будет сказать, что Rails стал одной из самых влиятельных технологий для веба за последнее десятилетие и с тех пор остается частью моего инструментария.
А теперь вернемся к нашей основной теме, где мы переносимся в 2014 год и интегрируем Twilio с веб-приложением на Rails 4. Первое, что нам нужно сделать, — это зарегистрироваться в бесплатной учетной записи Twilio.
После регистрации Twilio отправит вам SMS или позвонит, чтобы подтвердить, что вы реальный человек, а не вредоносный спам-бот.
Вы получите либо SMS, либо телефонный звонок с кодом подтверждения. Введите этот код, и мы сможем перейти к самой интересной части: получению телефонного номера.
Twilio назначит вам случайный телефонный номер, но вы можете свободно поискать и посмотреть, какие еще номера доступны. Для целей этого руководства подойдет любой номер.
Теперь вы стали счастливым обладателем программируемого телефонного номера. Здорово! Нажмите «Начать». На следующей странице нажмите на красную кнопку «Перейти в ваш аккаунт».
Когда вы войдете в панель управления, вы можете нажать на вкладку «Номера», чтобы увидеть все телефонные номера, которыми вы владеете.
При нажатии на номер вы попадете на страницу конфигурации номера. Когда кто-то отправляет сообщение или звонит на ваш номер, Twilio нужно знать, **что делать**. Для обработки таких входящих событий Twilio использует конструкцию, известную как вебхук. Вебхук — это просто URL, к которому Twilio обращается, чтобы получить инструкции по обработке входящего сообщения или звонка.
Каждый телефонный номер имеет два настраиваемых вебхука:
— URL запроса голосовых вызовов для входящих звонков
— URL запроса сообщений для входящих SMS или MMS
В этом посте мы создадим простое приложение, которое позволит человеку позвонить на ваш номер Twilio. Поскольку это входящий звонок, нам нужно установить URL запроса голосовых вызовов, чтобы он указывал на маршрут в нашем Rails-приложении. Давайте углубимся в это.
Если у вас уже есть существующее приложение на Rails 4, можете сразу переходить к шагу 4. Для тех, кто только начинает, вот несколько простых шагов по созданию приложения. Сначала вам нужно установить Rails на вашу систему. После этого откройте терминал и перейдите в каталог, где вы храните свои проекты. Создание нового веб-приложения на Rails так же просто, как:
Чтобы упростить интеграцию с Twilio, мы будем использовать гем twilio-ruby. Откройте Gemfile и добавьте следующую строку:
Вы увидите, что этот контроллер имеет действие voice. Назначение действия voice — сообщить Twilio, что делать, когда кто-то звонит на ваш номер Twilio. В данном случае мы используем вспомогательную библиотеку twilio-ruby для создания объекта ответа, а затем рендерим этот объект как TwiML. Здесь происходит много всего, так что давайте разберемся.
#### Отключение проверки CSRF
Rails поставляется с отличной функцией, которая помогает предотвратить CSRF-атаки. Это достигается путем автоматического внедрения случайно сгенерированного токена в веб-формы приложения и последующей проверки наличия и корректности этого токена при отправке формы. Эта функция обычно включается в файле app/controllers/application.rb с помощью строки protect_from_forgery with: :exception. Эта строка указывает всем контроллерам включать проверку CSRF и выбрасывать исключение при ее обнаружении.
Однако, если ваше приложение должно предоставлять конечную точку POST для внешних сторонних сервисов (например, Twilio), вам нужно отключить проверку CSRF для этих конечных точек. К счастью, Rails позволяет легко отключить проверку CSRF для контроллера или даже для конкретных действий в контроллере. В нашем случае мы используем следующую строку в app/controllers/twilio_controller.rb для отключения проверки CSRF: skip_before_action :verify_authenticity_token
#### TwiML
Я уже несколько раз упоминал, что Twilio использует вебхуки для определения «что делать». Инструкции, которые ваше приложение отправляет Twilio, закодированы в TwiML, который представляет собой XML-словарь Twilio.
В приведенном выше коде мы используем вспомогательную библиотеку twilio-ruby для программного создания TwiML. Это очень похоже на то, как можно использовать Builder для генерации XML. Имейте в виду, что использование вспомогательной библиотеки не обязательно, это просто удобный способ генерации TwiML.
#### Concern Webhookable
Rails 4 представил встроенную поддержку Concerns. Concerns — это способ поощрения повторного использования кода в контроллерах и моделях, и вы увидите подкаталог concerns как в каталоге controllers, так и в каталоге models.
Поскольку все вебхуки Twilio требуют схожей функциональности, это стало отличным кандидатом для Concern. Давайте создадим файл webhookable.rb и поместим его в app/controllers/concerns:
Этот Concern предоставляет две простые возможности:
— Установка типа содержимого HTTP-ответа в «text/xml»
— Рендеринг объекта TwiML в необработанный XML
#### Добавление маршрута
Последнее, что нам нужно сделать, — это отредактировать config/routes.rb и связать путь URL с нашим контроллером и действием:
Вы можете протестировать twilio_controller из командной строки с помощью cURL:
Вы должны получить следующий XML:
Теперь нам просто нужно вывести наше Rails-приложение в интернет. Для этого обычно есть два варианта:
— Развернуть ваше Rails-приложение на вашем VPS или PaaS по выбору.
— Использовать сервис туннелирования, чтобы сделать сервер, работающий на вашей машине разработки, доступным по адресу в публичном интернете.
Для целей этого поста я выберу второй вариант, используя замечательный инструмент под названием Ngrok. Мой коллега Кевин Уиннери написал отличный пост о том, как начать работу с Ngrok.
После установки Ngrok вы можете запустить его и подключить к вашему серверу Rails следующим образом:
Когда Ngrok запущен, он получит уникальный URL для вашего веб-приложения:
Вы можете проверить, работает ли это, вставив этот URL в браузер. Если вы видите сообщение «Welcome Aboard», самое время поднять кулак в воздух! Ваше приложение доступно в интернете и готово к последнему шагу.
Вернитесь в панель управления Twilio, нажмите на вкладку «Номера» и выберите ваш номер Twilio. Вы увидите экран, похожий на этот. В поле для URL запроса голосовых вызовов введите URL вашего сервера Ngrok плюс путь к действию voice (/twilio/voice).
Теперь настал момент истины: позвоните на ваш номер Twilio. Следите за Ngrok, вы должны увидеть следующее, когда звонок соединится:
Если вы услышите сообщение, за которым последует отличная музыка, все готово! Вы успешно интегрировали Twilio в ваше приложение на Rails 4.
*[Благодарность Майклу Саллису за его ремикс на тему кантины из «Звездных войн», который распространяется под лицензией CC 3.0]*
Если вы переключитесь на терминал, где запущено ваше Rails-приложение, вы также увидите следующее:
Twilio не только отправляет HTTP POST-запрос вашему приложению, но и передает большое количество параметров. Эти параметры содержат всю информацию, которую Twilio знает о номере, совершающем звонок (звонящий), и номере, на который звонят (адресат), включая географическую информацию, такую как город. Ваше приложение может по желанию использовать эту информацию, чтобы более разумно реагировать на такие запросы.
И это все! Теперь вы успешно:
— Зарегистрировались в Twilio
— Приобрели телефонный номер
— Настроили приложение на Rails 4
— Подключили Twilio к вашему Rails-приложению
— Обработали входящий звонок
Весь код, который я показал сегодня, размещен на Github, не стесняйтесь делать форк. В следующем посте я расскажу вам о:
— Защите ваших вебхуков, чтобы к ним мог обращаться только Twilio
— Использовании REST API Twilio для отправки исходящих SMS
А пока — счастливого кодинга!
**ОБНОВЛЕНИЕ:** Ознакомьтесь с частью 2 этой серии постов.