Текстовые трансляции всё больше входят в нашу жизнь. Благодаря современным технологиям, они становятся всё более привлекательным способом доносить информацию в реальном времени до большой аудитории. Даже здесь, на Хабре, уже не раз проводились текстовые трансляции различных мероприятий. Реализуют такие трансляции все по разному. Кто-то использует внутренний функционал сайта, другие используют готовые сервисы, третьи – вовсе редактируют обычные текстовые посты, вынуждая своих пользователей постоянно обновлять страницу или делая это за них простейшими скриптами.

Мне давно не давала покоя мысль, что подобные трансляции очень похожи на то, как мы делимся своими впечатлениями в мессенджерах с друзьями и знакомыми. И это действительно удобно. Мы просто рассказываем им свою историю. Так родилась идея создать сервис текстовых трансляций, основным и единственным интерфейсом которого является Telegram бот. Встречайте – Journalist.

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

После создания трансляции бот выдаст ссылки на публичную страницу трансляции и на страницу предпросмотра, а также html-код для вставки трансляции на сайт и команду для приглашения других редакторов к ведению трансляции.

Взаимодействие с ботом построено таким образом, чтобы это был действительно удобный способ ведения трансляции. Конечно же, комфортнее всего это будет делать сидя за компьютером, имея под рукой быстрый интернет и неспешно попивая любимый горячий напиток. Но в то же время, для полноценной работы достаточно телефона или планшета и, благодаря нетребовательности Telegram'a к качеству соединения, хоть какого-нибудь интернета. Это даёт возможность работать в полевых условиях и оставаться продуктивным, радуя своих читателей интересным материалом с места события.

В связи с этим я с гордостью могу назвать JournalistBot одним из первых Telegram ботов предназначенных для создания профессионального контента.

Возможности


Сервис уже предоставляет весь необходимый функционал для ведения современных текстовых трансляций. В тексте сообщений поддерживается Markdown разметка, соответственно посты можно красиво форматировать. Фотографии можно отправлять непосредственно в чат, как изображение или как ссылку. В обоих случаях оно будет правильно вставлено в трансляцию. Также поддерживаются ссылки на встраиваемые ресурсы: YouTube, Vimeo, Twitter, Instagram и т.п. У редактора нет необходимости идти на сайт целевого сервиса и получать код для вставки, бот берёт эту задачу на себя. Кроме того, у редактора есть возможность отправить в чат голосовое сообщение, видео с камеры, местоположение или даже стикер. Всё это будет мгновенно доставлено читателям трансляции.

Посты собираются из сообщений и не видны читателям до нажатия кнопки «Опубликовать». При этом редакторы могут видеть составляемый пост на странице предпросмотра. Если опечатка всё же осталась незамеченной до самой публикации или опубликовали не то, что хотели – это не беда, можно исправить сообщение, отредактировав его стандартными средствами или удалить его из трансляции, отправив команду «Удалить» в качестве ответа (Reply) на это сообщение. Изменения автоматически отобразятся у всех читателей трансляции.

Для работы в команде есть возможность подключения нескольких редакторов к одной трансляции. Для этого после создания трансляции, бот, вместе с остальной информацией, присылает команду /join <токен>. Отправив эту команду боту, другой редактор присоединится к ведению трансляции. Сообщения от каждого редактора формируют отдельные посты, поэтому, работая параллельно, они не будут мешать друг другу. Для таких трансляций существует возможность отображения автора каждого поста, которая включается в настройках.

Целевая аудитория


В качестве целевой аудитории в первую очередь рассматриваются сайты СМИ и блогеры. В данном случае сценарии использования очевидны, а выгода от использования сервиса состоит в том, что не нужно беспокоиться о технической составляющей трансляции и можно быть уверенным, что сотни и тысячи пользователей получат обновления максимально быстро. Как выглядит реальная трансляция, встроенная в блог, можно посмотреть тут.

Однако ничего не мешает обычным пользователям, не занимающимся на регулярной основе проведением подобных трансляций, взять и попробовать, ведь у трансляции есть публичная страница (пример), ссылку на которую достаточно распространить среди своих читателей. Поэтому, если взять совершенно противоположный СМИ пример, можно, поехав на отдых, создать трансляцию и отправить ссылку на неё своим друзьям, чтобы держать их в курсе своих приключений.

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

Под капотом


Сервис полностью реализован на node.js и спроектирован таким образом, чтобы его можно было легко горизонтально масштабировать. Это позволяет наложить на него модель: есть аудитория > есть деньги > добавляем сервера. Как показала практика, такой подход очень удобен из-за того, что нет необходимости стартовать на дорогом оборудовании и так и не дождаться своего highload, при этом при росте нагрузки иметь возможность быстро на это отреагировать, без необходимости «переписывать всё с нуля». Вся система развёрнута в Docker-контейнерах, которые автоматически собираются в GitLab CI, это очень сильно упрощает деплой системы и делает её обновление и расширение ещё более тривиальным процессом. Хранилище файлов также реализовано таким образом, чтобы в любой момент можно было легко мигрировать на сервисы вроде Amazon S3 и внедрить CDN. Клиенты получают обновления через Websocket.

Большой упор сделан на производительность. Загружая страницу, пользователь не замечает отдельной подгрузки трансляции, страница выглядит монолитно. Пока это работает не в 100% случаев, но после расширения сети серверов и гео-распределения запросов, всё должно стать ещё намного лучше. Однако уже сейчас задержка минимальна. Это в свою очередь влияет на SEO-оптимизацию. Трансляции, вставленные на сайт, будут индексироваться всеми современными поисковыми системами, т.к. производится лишь необходимый минимум манипуляций с DOM и поисковые системы готовы их дождаться при индексировании страницы.

Известные проблемы


Т.к. клавиатуры ботов в Telegram появились относительно не так давно, ещё не все с ними гладко. Например, есть проблема в клиенте под Android – при ответе на сообщение (Reply) клавиатура бота пропадает и нет возможности её вызвать. Это делает затруднительным изменение типа поста и его удаление. Пока в качестве workaround можно отправить эту команду кнопкой в чат, а потом скопировать его в ответ на сообщение. Надеюсь, что в ближайшее время это будет исправлено разработчиками клиента. Под iOS и Mac OS этой проблемы нет.

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

Будущее


Сейчас я хочу получить отклик от потенциальных пользователей сервиса, понять, насколько он востребован, какие функции они хотели бы в нём видеть. Конечно же при этом у меня есть свой план развития функционала, который я постепенно реализовываю параллельно с внесением изменений по отзывам первых пользователей. Например, одним из ближайших крупных обновлений должно стать получение статистики по читателям трансляции в интерфейсе бота.

Неделю назад, неожиданно для меня, проект был зафичерен на ProductHunt, попал на главную страницу и собрал неплохое количество голосов, хотя если бы это был подготовленный запуск, можно было бы достичь гораздо лучшего результата. С одной стороны, такой спонтанный запуск немного сорвал мои планы, но с другой – это означает, что проект всё же востребован.

Жду ваших отзывов и ваших трансляций. С удовольствием отвечу на вопросы в комментариях, так же можно писать на почту mail@journali.st. Спасибо за внимание.
Поделиться с друзьями
-->

Комментарии (9)


  1. Kondra007
    19.12.2016 23:52
    +3

    Приветствую! Довольно интересный сервис, спасибо, обязательно воспользуюсь. Вы хотели фидбек? Пожалуйста.

    Давайте поговорим о багах и не-фичах. Как только я увидел слово Markdown, решил проверить одну догадку…
    Во-первых, в «Журналисте» используется один маркдаун, а в телеграме — другой.
    Простой пример: Test *bold* сделает слово «bold» жирным в Telegram, в то время как на сайте это же слово будет курсивом. Нестандартный маркдаун — зло, но приходится мириться.
    Прочтите вот этот раздел Bot API: https://core.telegram.org/bots/api#formatting-options

    Во-вторых, iOS, Web и даже Android (через популярный Plus Messenger) поддерживают нативное форматирование текста без помощи ботов.
    Попробуйте отправить сообщение "*жирный тест*" через web.telegram.org и посмотреть, будет ли оно жирным в Журналисте (спойлер — нет). Решение проблемы: парсить объекты MessageEntity в сообщениях (https://core.telegram.org/bots/api#messageentity). Да, это усложняет задачу, но более «правильно» в целом.

    В-третьих, мне всегда казалось, что прямые текстовые трансляции нужны, чтобы быстро доставлять актуальную информацию. В этом свете кажется немного нелогичным требование каждый раз нажимать на кнопку «Опубликовать». Можно банально забыть это сделать, отвлёкшись на новое событие «реального времени», да и чтение своих же сообщений (для быстрого поиска чего-либо) становится труднее из-за постоянного мельтешения сообщений «Опубликовать». Предпросмотр перед отправкой для прямых трансляций — имхо, немного лишнее. В конце концов, можно сделать оба варианта в настройках :)

    Редактирование отправленных сообщений — очень круто! Мало кто прикручивает обработку edited_message, респект.

    Для «Горячих постов» можно добавить специальный тег, например, два восклицательных знака в начале сообщения или какой-нибудь хэштег (кстати, хэштеги удобно попадают в MessageEntity).

    Итог: после 10 минут использования впечатления приятные. Сервис оригинальный (чёрт, начинаю говорить штампами, я не специально), но хотелось бы, чтобы проблемы с Markdown были исправлены :)


    1. BVadim
      20.12.2016 00:24

      Спасибо за развёрнутый ответ. Отвечаю по порядку.

      На счёт Markdown Вы правы — в Telegram и Journalist формат немного различается. Но как раз в Journalist используется его стандартная реализация. Если провести тот же самый опыт на GitHub, Ghost или на Хабре, поведение будет идентично используемому в Journalist. Т.к. сервис позиционируется для использования сотрудниками СМИ и блогерами, я считаю более правильным использовать реализацию поддерживаемую во многих инструментах публикации текста, т.к. к ней уже все привыкли.

      На счёт парсинга MessageEntity я думал, но пока не пришел к однозначному выводу о том, нужно ли это делать и смешивать их с поддержкой Markdown, это может создать дополнительную путаницу, т.к. может получиться ситуация, когда будет разметка в разметке. И это всё очень сильно усложнит, если появится (я думаю рано или поздно это произойдёт, в зависимости от требований пользователей) иной способ доступа к редактированию/написанию постов, например web-интерфейс. Тогда смешанная разметка может принести ещё больше бед, чем пользы.

      На счёт кнопки опубликовать. Как показала практика, без неё очень сложно. Посты чаще всего состоят из нескольких сообщений. Могут содержать разные типы данных и кнопка опубликовать является логическим завершением целостного поста. Плюс, это ещё один рубеж для предотвращения ошибок. Хоть возможность редактирования и существует, но очень не приятно, если случайное сообщение прилетит нескольким тысячам пользователей. В данном случае я убеждён, что без явной команды на публикацию серьёзные посты с действительно большой аудиторией формировать будет на много сложнее и опаснее.

      Горячие посты и удаление — это то, что мне пока не нравится. С удалением лучше и быстрее способ, чем ответ на сообщение командой я не вижу, пока боты не научатся это событие ловить. А вот с типом поста — об этом можно подумать. Сейчас они с удалением образуют единый UX, не нужно вспоминать, как делать одно, а как другое. Замена обозначения горячего поста на некий набор символов может упростить задачу в некотором плане, но иногда может затруднить вхождение в процесс. Хотя идея с тегами — не плохая. Об этом можно подумать. Но тут стоит помнить также про возможную реализацию иных клиентов в будущем.

      Рад, что в целом сервис нравится. На будущее есть ещё много планов по улучшению функционала.


      1. Kondra007
        20.12.2016 01:16

        На счёт парсинга MessageEntity я думал, но пока не пришел к однозначному выводу о том, нужно ли это делать и смешивать их с поддержкой Markdown

        Это не смешивание. MessageEntity показывают все форматированные элементы (ссылки, упоминания, курсив, жир...) в сообщениях. В итоге, если человек отправил жирный текст через Web-версию, то он увидит жирный текст и в Журналисте (сейчас у него это не получится, проверьте сами).
        Подробнее, конечно, в документации по Bot API


  1. gudvinr
    20.12.2016 02:35

    Хотелось бы побольше технических подробностей и кода.
    Как вы справляетесь с лимитами на число ответов бота, например?


    1. BVadim
      20.12.2016 03:51

      Хороший вопрос. Чтобы не натыкаться на лимиты — всё общение с ботом проходит через специальную прослойку, ограничивающую количество запросов к api в секунду до разрешенных параметров. Для приложения это выглядит прозрачно, при превышении лимита результат вернётся из метода чуть позже (как только очередь выполнится). Учитывая специфику бота, а именно то, что количество сообщений в чат минимально, в сам лимит упереться в данном случае довольно сложно. Эта проблема более остро стоит для ботов с большей интерактивностью, например игр. Но если всё-таки ситуация случится, то пользователь получит ответ на 1-2 секунды позже. При большом количестве пользователей обход лимитов возможен только увеличением их со стороны Telegram.


      1. gudvinr
        20.12.2016 12:49

        Сейчас бот присылает 7 отдельных сообщений при старте публикации, что довольно расточительно.


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


        Ссылки можно и в markdown завернуть, а вместо /join <код> использовать inline keyboard (см @like) или deep linking (встроить в inline-кнопку или как гиперссылку добавить в текст сообщения).


        1. BVadim
          20.12.2016 16:35

          Там 5 сообщений. Ссылки объединены в одно. А сообщение с командой и кодом для вставки сделаны отдельными, чтобы, как вы правильно заметили, их было удобно копировать и вставлять. На счёт ссылки на /join надо подумать, что удобнее. Т.к. сейчас нет возможности лишний раз случайно по ней кликнуть, а тот, кому её пришлют, легко отправит её боту и присоединится к трансляции.


          1. gudvinr
            21.12.2016 18:25

            Всё-таки 7. Это, впрочем, не принципиально. Однако, первое, второе и последнее можно было бы объединить в одно.
            Визуальное разделение можно реализовать и с помощью Markdown.


            image


            1. BVadim
              21.12.2016 18:30

              В этом месте согласен. Недосмотрел. 5 имел ввиду — блок информации. Они же выводятся при её повторном запросе с клавиатуры. Первое и последнее тут касается непосредственно старта трансляции. Их можно объединить, согласен.