Publications / Facebook или Telegram? История украинского .NET Core Community

Habr

Habr.com is a unique online community for IT professionals. This platform hosts in-depth articles, industry news, and engaging discussions, serving as a key resource for tech enthusiasts, developers, and IT specialists looking to stay ahead in the rapidly evolving world of technology.


Wednesday, 21 February 2018
С момента анонса .NET Core я начал внимательно следить за этой технологией. Когда произошел релиз первой версии, несколько моих проектов было переведено на эту платформу. Результаты порадовали – все работало стабильно и даже быстрее чем на классической версии фреймворка. Через некоторое время я решил организовать интернет-комьюнити программистов, интересующихся разработкой под .NET Core. Первой площадкой для общения стал Facebook.

Через некоторое время, я решил создать еще и канал в Telegram, где стал публиковать ссылки на различные новости, связанные с разработкой под .NET Core. Спустя где-то полгода, я сделал вывод, что, хотя Telegram очень удобен для новостных рассылок, он абсолютно не подходит для поиска и структуризации публикаций. Со временем, если новости на канале публикуются достаточно часто, в ленте практически невозможно быстро найти публикацию, которую читал хотя бы на прошлой неделе.

Группа в Facebook также не очень хорошо справлялась с этой задачей. Поэтому, чтобы структурировать информацию и сделать навигацию по публикациям удобнее, я решил создать сайт-аггрегатор, в итоге получивший название //devdigest.

В качестве платформы для разработки естественно был взят .NET Core. Сам проект размещен в публичном репозитории на GitHub и все желающие могут ознакомиться с его внутренним устройством и исходным кодом.

О том, как работает //devdigest я и хоу рассказать в этой статье.

Формирование виджетов для веб-страниц


Главная задача сайта – это хранить все публикации в удобном виде. За образец я взял то, как генерирует описание для внешних ссылок Facebook: для каждой ссылки формируется небольшой виджет из заголовка, фото и краткого описания.

Для формирования описания ссылок я написал небольшую библиотеку (исходный код которой доступен на GitHub, а сама библиотека опубликована на nuget.org). Логика работы библиотеки довольно простая и состоит в том, что, получив ссылку, при помощи HtmlAgilityPack формируется объектная модель документа (то самое DOM-дерево) и затем, из этой модели извлекаются:

  • стандартные мета-теги (title, keywords, description),
  • мета-теги OpenGraph протокола (этот протокол использует, например, Facebook): og:title, og:image, og:description
  • ссылки на изображения
  • Затем, из полученных данных формируется экземпляр класс Metadata, с которым и работает веб-приложение:



Интеграция с Telegram


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



Все. Теперь у бота есть возможность публикации постов, а у нас возможность управления ботом через API.

Для взаимодействия с ботом я рекомендую использовать официальный SDK. Код отправки сообщения на канал будет выглядеть так:



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

Хостинг


У меня было два варианта где можно разместить проект – на одном из серверов, которые я использую для коммерческих проектов, или в облаке Microsoft Azure. Вариант размещения в облаке оказался предпочтительнее по нескольким причинам:

  • возможность настройки Continuous Delivery – как вы знаете, Azure Web Apps позволяет настроить автоматическую публикацию из GitHub, Bitbucket, Visual Studio Team Services, собственного git-репозитория, и даже из Dropbox и OneDrive! Впечатляющий список, правда? Поскольку devdigest изначально задумывался как проект с открытым исходным кодом и был размещен в публичном репозитории нашего комьюнити, то настройка Continuous Delivery в этом случае для нас составит буквально 10 секунд.
  • интеграция с Applications Insight’s – сервисом, который позволяет отслеживать всю активность приложения, собирать различные метрики и отправлять письма в случае, если что-то пошло не так

Cognitive Services


Со временем было принято решение отображать в основной ленте на сайте публикации только на английском языке, поскольку их большинство, а чередующийся на различных языках контент выглядел довольно странно. Чтобы реализовать такую фильтрацию, конечно же можно было сделать в интерфейсе администратора сайта еще один комбобокс, с выбором языка публикации. Но это как минимум банально и не интересно. Особенно учитывая, какое количество готовых сервисов, основанных на машинном обучении существует сейчас. Поэтому я решил использовать Text Analytics API который входит в состав Microsoft Azure Cognitive Services. Text Analytics API позволяет извлекать из текста ключевые слова, а также определять язык, переданного текста. Это как раз то, что было мне нужно.

Цены на сервис достаточно гуманные – как видим, даже бесплатный тарифный план дает достаточно богатые возможности по анализу текста: извлечение ключевых фраз и определение языка текста. Это как раз, то что нам нужно!

image4

Работать с Text Analytics API можно как через SDK, который устанавливается как nuget-пакет, так и через REST API. Для себя я выбрал вариант работы через REST API с использованием библиотеки RestSharp.

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



После того, как вы получили ключ, можно подготовить клиент:



Сам API достаточно прост и очевиден. Например, запрос, позволяющий определить язык текста будет выглядеть так:



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

Бесплатный сертификат, SSL, Let’s Encrypt и nginx


Поскольку сайт размещен в рамках тарифного плана shared, который не поддерживает подключение SSL сертификатов, а использовать HTTPS все же хотелось, я решил воспользоваться одним из своих серверов на Digital Ocean, в качестве прокси, на котором и будет настроен сертификат. Описывать процедуру получения сертификата через Let’s Encrypt я не буду, так как она прекрасно описана, например, тут. Процедуру настройки проксирования также можно найти довольно быстро, но те, кому особенно интересно, как же у нас там все устроено – могут скачать конфигурационный файл, который доступен на GitHub.

Итоги


И так, что есть на данный момент? Общая архитектура проекта выглядит на данный момент следующим образом:



С точки зрения информационных площадок с которыми у нас настроена интеграция, мы можем выделить три различных telegram канала, каждый из которых привязан к соответствующему потоку на сайте:


Еще есть страница в Facebook, которая также привязана к потоку devdigest // net core

С точки зрения администратора сайта UI выглядит максимально просто:



Панель администратора состоит всего из 4 элементов ввода:

  • Поле для ссылки
  • Ключ безопасности (генерируется уникальный для каждого из администраторов)
  • Комментарий, который будет размещен в Telegram канале и Facebook-странице
  • Поток, к которому относится ссылка

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


Read publication