Как сделать из Telegram видеосервис нового типа?

Вы наверняка замечали, что видеоблогеры из YouTube последнее время просят подписаться на их Telegram канал. Но почему? Ведь смотреть видео в Telegram крайне неудобно - нет возможности продолжить просмотр, нет рекомендаций, нет полноценного избранного, нет монетизации и продвижения блогеров, нет приложения для телевизоров и ТВ-приставок. Да, много еще чего нет, что есть в любом мало-мальски уважающем себя видеохостинге. При всем при том, что Telegram - это, по моему мнению, лучший в мире мессенджер. Но он не создавался для видеоконтента и не может полноценно удовлетворить всё возрастающий запрос от блогеров.

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

Чтобы пояснить нашу мотивацию, отмечу, что у нашей компании имеется более 10 лет опыта в разработке платформы для интерактивного телевидения, которой пользуются компании в 90 странах мира. Иными словами, платформа у нас уже была и все, что требовалось, - это интеграция с Telegram API. На деле это оказалось не так просто, как нам показалось, и в процессе разработки у нас возникло несколько интересных проблем, о которых я расскажу ниже.

Первая мысль - нужно сделать бот, который блогеры будут добавлять к себе в канал, а тот будет получать уведомления о новых видео, выкачивать эти видео к нам на серверы, если нужно - перекодировать согласно стандарту HLS (HTTP Live Streaming - протокол компании Apple для передачи видеоданных через сеть Интернет) и раздавать через нашу сеть доставки контента. Первое ограничение, с которым мы столкнулись, - бот не умеет скачивать файлы больше 20МБ. Это можно обойти через установку локального Telegram Bot API Server. Его можно установить на свой сервер и обращаться к нему, а не напрямую к серверам Telegram. Казалось бы проблема решена, но, изучив задачу глубже и поразмыслив немного, стало понятно, что этот вариант не рабочий по нескольким причинам:

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

  • не весь контент из сети Telegram будет доступен пользователям, а только тот, где блогеры добавили бота в свой канал, что на начальном этапе сильно усложнит мотивацию для прихода новых пользователей;

  • да и с точки зрения эффективности: зачем дублировать контент, который уже есть в сети?

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

Так как наш фронтэнд написан на React и React Native, т.е. язык разработки - JavaScript, мы взяли библиотеку GramJS (https://www.npmjs.com/package/telegram) и принялись изучать, как работает web-версия Telegram, которая, кстати, тоже open source. Выяснилось, что авторизация и получение списка каналов и видео сообщений делается достаточно просто.

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

Как сделать из Telegram видеосервис нового типа?

Перечислю лишь некоторые из проблем:

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

  • если каналы в поиске можно найти, то поиск по видео сообщениям, прямо скажем, слабоват.

Основные же наши проблемы с интеграцией начались, когда мы дошли до передачи файлов. Дело в том, что передача данных в Telegram работает по защищенному протоколу MProto и прямые http/s ссылки на файлы получить невозможно. Нужно было создавать прокси, который конвертирует MProto в http/s причем на самом устройстве, без участия сервера, т.е. этот прокси будет недоступен вне устройства. На мобильных платформах iOS и Android можно поднять локальный http-сервер с локальной авторизацией, и, когда объект видеоплеера обратится по ссылке к этому локальному прокси-серверу, последний “сходит” по протоколу MProto в дата-центр Telegram, скачает нужную порцию данных и вернет ее по http/s. Для web-версий приложения такой фокус не пройдет, потому что попросту невозможно поднять веб-сервер в странице браузера. Выход мы нашли в исходниках web-версии Telegram. Можно зарегистрировать так называемый ServiceWorker и переопределить нативную функцию fetch, которой браузер пользуется при скачивании картинок и видео, и подменить ответ, полученный опять же через MProto.

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

Как сделать из Telegram видеосервис нового типа?

Единственная проблема, которую нам пока не удалось решить, - это запуск на платформе Samsung Tizen для SmartTV. Проблема заключается в следующем. Т.к. политика Tizen требует, чтобы приложение запускалось как веб-страница внутри их браузера и файлы должны находиться непосредственно на устройстве, то контекст браузера создается с протоколом “file://”. В этом протоколе из-за политики безопасности браузера невозможно зарегистрировать вышеупомянутый ServiceWorker, а можно только в “https://”. Если открывать через https, все прекрасно работает на телевизоре. Мы получаем противоречащие друг другу две политики безопасности. Возможно, кто-то сталкивался с аналогичной проблемой и знает, как ее решить. Напишите в комментариях.

Сервис доступен по адресу t.video или через мобильное приложение в AppStore или Google Play.

11
Начать дискуссию