company_banner

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

    Привет, Хабр! Однажды один человек, сильно заинтересованный в .NET Core, решил начать вести свой блог. И тут же перед ним встал вопрос: «Какой ресурс использовать?». Существующие Facebook и Telegram оказались совершенно неприспособленными для структуризации публикаций. В итоге, было решено с помощью того же самого .Net Core создать свой сайт блэкджеком и структуризацией.



    Передаю слово автору.

    С момента анонса .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-странице
    • Поток, к которому относится ссылка

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

    Об авторе


    Андрей Губский — Специалист в области разработки и архитектуры программного обеспечения. Основатель .NET Core Ukraininan User Group. CTO проекта Торф ТВ, разработчик, ИТ-консультант. Visual Studio and Development Technologies MVP.
    • +17
    • 8,3k
    • 6

    Microsoft

    288,00

    Microsoft — мировой лидер в области ПО и ИТ-услуг

    Поделиться публикацией
    Комментарии 6
      0

      А можно вакансию в вашем Xamarin канале разместить?

      +1

      Если вдруг вам понадобится больше 5К определений языка в месяц (или в "Text Analytics API" решат "закрутить гайки"), есть ещё вот такая библиотека: https://github.com/CLD2Owners/cld2

        0

        Если вдруг кому интересен код проекта сайта, то он здесь

          +1
          Как подставляются всякие секретные данные (ключи, строки подключения), которых нет в гитхабе, но которые должны быть при деплое?
            0

            Через раздел Application Settings в панели управления сервисом Microsoft Azure Web Apps

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

          Самое читаемое