Доставляйте XKCD на свой телефон с помощью Node и Twilio

Автор: | 29.07.2026

Кто не любит XKCD? Я точно обожаю. Этот комикс привлекает нас, инженеров, так как его юмор основан на самых нишевых темах из математики и науки. Как бы я ни любил читать XKCD, он часто теряется среди множества RSS-лент в моем ридере, и я пропускаю новые комиксы сразу после их публикации. Когда Twilio добавил поддержку MMS для номеров в США и Канаде, я подумал: что может быть лучше, чем отправлять комиксы XKCD прямо на мой телефон, как только они публикуются.

В этой статье я покажу, как я создал простое приложение на Node, которое позволяет доставлять комиксы XKCD на мой телефон через Twilio MMS. Приложение позволяет запрашивать и получать конкретные комиксы XKCD, а также автоматически отправляет новые опубликованные комиксы на мой телефон.

Хотите попробовать? Отправьте SMS с ID вашего любимого комикса XKCD на номер +1 201-654-3624. Нужны идеи? Попробуйте отправить 325, 285 или 149.

Для создания приложения я буду использовать Node.js и веб-фреймворк Express, чтобы объединить несколько различных сервисов:

— Twilio – для отправки комикса XKCD на мой телефон я буду использовать номер с поддержкой MMS от Twilio. Нет аккаунта в Twilio? Зарегистрируйтесь бесплатно!

— SuperFeedr – для отслеживания Atom-ленты XKCD на предмет новых комиксов я буду использовать Superfeedr. Superfeedr будет уведомлять меня о добавлении новой записи в ленту, отправляя запрос на URL, который я предоставлю в своем приложении.

— Firebase – наконец, чтобы хранить список номеров телефонов, которые хотят получать новые комиксы XKCD по мере их публикации, я буду использовать Firebase.

Не терпится увидеть код? Заберите готовое приложение с GitHub и начните отправлять XKCD уже сегодня. Или читайте дальше, и я расскажу, как я его создал.

Я начал разработку приложения для доставки комиксов с создания эндпоинта, который принимает строку с ID конкретного комикса XKCD из входящего SMS, ищет этот комикс на xkcd.com и возвращает изображение комикса, его название и альтернативный текст в виде MMS-сообщения.

Давайте начнем создание приложения с выполнения команды npm init:

npm init

Это создаст новый файл `package.json` с базовой конфигурацией для нашего приложения.

Теперь добавим набор зависимостей, которые будет использовать приложение. Это можно сделать с помощью npm, выполнив следующую команду:

npm install express body-parser request twilio —save

Эта команда устанавливает пакеты express, body-parser, request и twilio из npm и заполняет раздел зависимостей в файле package.json.

После установки зависимостей пора писать код приложения.

Начнем с создания нового файла `app.js` и объявления необходимых библиотек в этом файле:

С подключенными библиотеками создадим новый экземпляр Express. Поскольку входящие запросы в приложение могут содержать данные в формате JSON и формы, настроим приложение Express на использование библиотеки body-parser для их парсинга:

Наконец, запустим экземпляр приложения Express:

На этом этапе вы можете запустить приложение и убедиться, что сервер стартовал. Вы поймете, что он работает правильно, если увидите текст «Server started!» в консоли.

После настройки и запуска приложения Express создадим новый маршрут с именем process. Как следует из названия, этот маршрут будет обрабатывать входящие SMS от Twilio.

Код в этом маршруте проверяет, содержит ли текстовое сообщение число, и если да, использует HTTP-клиент Request для получения JSON-представления этого конкретного комикса XKCD:

Если JSON-представление для этого ID найдено, приложение использует библиотеку Twilio Node для генерации и возврата TwiML, который указывает Twilio ответить на входящее SMS MMS-сообщением с изображением комикса, его названием и текстом.

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

Вот и все! Весь необходимый код для запроса доставки конкретного комикса XKCD теперь на месте. Осталось только направить номер телефона Twilio на этот вновь созданный URL. Для этого мы купим новый номер с поддержкой MMS в США или Канаде и настроим его URL запроса сообщений на URL нашего приложения.

Но подождите! Как Twilio сможет отправить запрос на сайт Node, работающий на вашем локальном компьютере? С помощью магии ngrok, который позволит нам открыть наш недавно созданный сайт для интернета через публичный URL.

Отлично! Если вы следуете инструкциям, то теперь должны иметь возможность получать комиксы XKCD на свой телефон. Отправьте SMS с номером вашего любимого комикса XKCD на ваш номер Twilio, и если это допустимый ID комикса XKCD, вы получите ответ с изображением комикса, его названием и альтернативным текстом.

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

Для этого нам нужно добавить две новые части в приложение. Во-первых, нам нужен способ хранить список пользователей, которые хотят получать новые комиксы. Для этого мы будем использовать Firebase. Во-вторых, нам нужен способ отслеживать и получать уведомления о публикации нового комикса XKCD. Для этого мы будем использовать классный сервис под названием SuperFeedr.

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

npm install firebase —save

После установки пакета Firebase в нашем приложении подключим его в файле app.js:

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

Обратите внимание, что я также добавил обработчик событий, который будет вызываться всякий раз, когда в Firebase добавляется новый номер телефона.

Получив список номеров телефонов, мы можем модифицировать существующий маршрут process, чтобы он принимал новую команду «subscribe», которая говорит приложению сохранить номер телефона пользователя в Firebase, если его там еще нет.

Замечательно. Теперь у нас есть список номеров телефонов, на которые мы будем отправлять новые комиксы по мере их публикации. Теперь нужно настроить SuperFeedr, чтобы он уведомлял нас об этом.

Настройка SuperFeedr проста. После входа на сайт откройте инструмент PubSubHubbub Console и убедитесь, что режим установлен на «Subscribe». Вставьте URL Atom-ленты XKCD, а затем добавьте URL, указывающий на новый маршрут в нашем приложении с именем relay. Мы создадим этот новый маршрут чуть позже. Наконец, отметьте флажок «Convert to JSON».

Задача маршрута relay — принимать данные уведомлений о новых комиксах от SuperFeedr, парсить их и отправлять MMS-сообщения всем подписчикам из нашего списка номеров телефонов.

Хотя мы настроили SuperFeedr отправлять нам JSON, часть содержимого Atom, которая нам нужна, остается в формате XML. Чтобы парсить этот оставшийся XML, нам нужно добавить в наше приложение последний пакет под названием xml2js:

npm install xml2js —save

В файле app.js подключим библиотеку:

С установленным xml2js мы можем добавить новый маршрут relay в приложение.

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

Затем мы перебираем все номера телефонов, хранящиеся в Firebase, и используем библиотеку Twilio Node для отправки каждому из них MMS с изображением комикса, его названием, текстом и постоянной ссылкой.

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

Поздравляю! Объединив немного Node и несколько классных сервисов, таких как Firebase, SuperFeedr и Twilio, мы создали службу доставки XKCD. Теперь я больше никогда не пропущу новый опубликованный комикс XKCD, и вы тоже!

Заберите код с GitHub и разместите свою собственную службу доставки или просто отправьте SMS на номер +1 201-654-3624, чтобы подписаться на мою. И когда сделаете это, напишите мне на почту или свяжитесь в Twitter и расскажите, какой ваш любимый комикс XKCD.