Использование Google Glass, Twilio, Ruby и Sinatra для отправки и получения SMS-сообщений

Автор: | 27.07.2026

Сегодня я хотел бы представить первый учебник по созданию приложений Twilio для Google Glass, где вы узнаете, как получать SMS-сообщения через номер Twilio на ваших Google Glass и как отвечать на них с помощью голосовых команд Glass.

Glass может отправлять и получать SMS по умолчанию через приложение MyGlass для Android. Однако я часто использую номера Twilio для людей, которым не хотел бы давать свой реальный номер телефона. Я хотел иметь возможность получать SMS только через устройство Glass, а не через телефон, и получать SMS только от определенных людей.

Если вы хотите увидеть конечный результат, посмотрите видео ниже, прежде чем начать:

Первый шаг — следовать руководству по быстрому старту Mirror API. Хотя это руководство предназначено для Python, шаги по созданию нового приложения Mirror в консоли API Google такие же, как и для Ruby. Как только вы получите свой Client ID и Secret, мы можем продолжить.

Еще несколько базовых вещей перед началом: если вы раньше не использовали Sinatra, я рекомендую быстро просмотреть их README. Для тех из вас, кто пришел из Python, это похожий на Flask фреймворк. Если вы новичок в Twilio, убедитесь, что вы зарегистрировали аккаунт и обновили его, чтобы иметь возможность отправлять исходящие SMS на неподтвержденные номера. Я также рекомендую прочитать некоторые из наших руководств по быстрому старту.

Теперь давайте перейдем к коду! Сначала настроим наш Gemfile и config.ru:

Далее нам нужно настроить хранилище данных. Нам потребуется хранить учетные данные OAuth и номер телефона пользователя в Twilio. Для этого я решил использовать отличный гем data_mapper. Давайте создадим новый файл и настроим схему базы данных:

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

Наш блок before пока выполняет базовую настройку различных библиотек API Google и Twilio. Мы вставляем наш Client ID и Secret из консоли API Google, а также Account Sid и Auth Token из панели управления Twilio. Нам также нужно указать base_url нашего приложения. В моем случае я загрузил свое приложение на Heroku, но вы можете разместить его на любом сервере, способном запускать Ruby. Я рекомендую использовать хостинг, поддерживающий SSL.

Обратите внимание, что мы авторизуем наше приложение с областями glass.timeline и userinfo.profile — это дает нам доступ к базовым данным аккаунта Google пользователя, а также к их устройству Glass. Для этого приложения нам больше ничего не понадобится, но если вы захотите расширить его в будущем, вы определенно можете добавить здесь больше сервисов Google, таких как GMail или G+. Мы также инициализируем наши объекты @glass и @oauth2 на основе документов обнаружения гема Google.

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

Здесь мы обрабатываем три различных входящих запроса к нашему приложению. Первый — /subcallback, маршрут, на который Google будет отправлять ответы, инициированные пользователем — в этом случае мы ищем токен авторизации пользователя на основе данных, переданных из обратного вызова Mirror API. Следующий — if session[:token_id] — эта ситуация возникает, когда пользователь уже вошел в наш сервис, поэтому мы смотрим его cookie сессии. И последний — если мы получаем SMS — в этом случае мы получаем токен авторизации пользователя, ища его номер телефона в POST-параметрах Twilio. Мы завершаем этот блок обновлением токена, если это необходимо, и перенаправлением пользователя на экран входа Google OAuth, если он еще не авторизовал свой аккаунт. Теперь мы можем перейти к созданию маршрутов для аутентификации OAuth.

Наш первый маршрут, /oauth2authorize, перенаправляет пользователя в Google для авторизации. Наш второй маршрут, /oauth2callback, — это место, куда пользователь перенаправляется после завершения процесса авторизации. Сначала мы создаем новую запись TokenPair в базе данных для пользователя, чтобы сохранить его учетные данные OAuth, а также сохраняем их в cookie сессии на случай его возвращения на сайт.

Затем мы делаем запрос к API Twilio для поиска доступных телефонных номеров США. Затем мы покупаем первый доступный номер и назначаем его пользователю для сохранения с его TokenPair.

И, наконец, мы делаем запрос к Mirror API, чтобы подписаться на уведомления о вставке карточек в timeline (INSERT). Мы получим уведомление INSERT, когда пользователь нажмет кнопку «Ответить» на своих Glass, чтобы ответить на SMS. После завершения всего этого мы перенаправляем их на корневой маршрут.

Здесь мы проверяем, что они аутентифицировали свой аккаунт, запрашивая Google Userinfo API для получения имени пользователя, приветствуем его и сообщаем о новом номере телефона Twilio, который мы купили ранее. Теперь, когда весь наш код аутентификации написан, мы можем написать маршруты, обрабатывающие входящие и исходящие SMS-сообщения. Первый из этих двух маршрутов — /receivesms — Twilio будет делать запрос к этому маршруту каждый раз, когда получает входящее SMS-сообщение на ваш номер телефона.

Когда мы получаем входящее SMS, мы создаем новую карточку в timeline на устройстве пользователя Glass. Этой карточке дается действие меню REPLY, которое позволяет пользователю продиктовать ответ на сообщение. Мы также добавляем действие меню READ_ALOUD, чтобы Glass прочитал SMS-сообщение вслух пользователю.

Затем мы устанавливаем HTML-блок для отображения, а также текст, который мы хотим, чтобы Glass произнес пользователю. Самое главное, мы устанавливаем sourceItemId в наш SmsSid — это позволяет нам передать идентификатор SMS-сообщения Twilio, чтобы мы знали, кому отвечать позже. Мы завершаем возвратом пустого ответа Twilio, хотя при необходимости вы можете добавить здесь свой собственный автоответчик SMS.

Когда пользователь «Отвечает» на сообщение на своих Glass, Google делает запрос к /subcallback. Первое, что нам нужно сделать, — извлечь элемент timeline, который был создан для нового ответа пользователя. Этот элемент timeline содержит расшифрованный текст из речи пользователя на Glass. Затем мы ищем карточку timeline, на которую пользователь отвечал, которая представляет наше входящее сообщение, созданное в предыдущем методе (/receivesms). Эта карточка содержит SmsSid, чтобы мы могли найти сообщение и узнать, кто был отправителем. Затем мы делаем запрос к Twilio для отправки SMS с номера телефона пользователя Twilio отправителю исходного сообщения с текстом, который он продиктовал Glass.

Теперь наше приложение завершено. Вы должны иметь возможность запустить bundle install и загрузить это прямо на Heroku или на хостинг по вашему выбору, перейти по базовому URL-адресу, а затем начать отправлять и получать SMS-сообщения Twilio на вашем устройстве Glass. Вы можете посмотреть полное приложение на Github здесь.

Чтобы начать работу над более сложным приложением, я рекомендую мой стартовый проект GlassRails, который представляет собой очень базовую настройку для работы с OAuth и Mirror API с Ruby on Rails.

Если у вас есть какие-либо вопросы, отзывы или теории заговора о Скайнете, пожалуйста, пишите в Twitter @jonmarkgo или на электронную почту jonmarkgo@twilio.com