Mastodon, Steampipe и RSS

автор vadim


Сегодня я был полон решимости написать свое #представление о мастодонте. Для начала я использовал поиск по тегам на панели инструментов, которую я создаю.

поиск мастодонта по тегу кэти никельс в моде 3 IDG

Идея заключалась в том, чтобы просмотреть кучу других постов #introduction, чтобы понять, как должен выглядеть мой. Когда вы ищете специально хэштеги, поисковый API Mastodon возвращает эту информацию.

"hashtags": [
    {
      "name": "introduction",
      "url": "https://mastodon.social/tags/introduction",
      "history": [
        {
          "day": "1574553600",
          "uses": "10",
          "accounts": "9"
        },
        // ...
      ]
    },

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

select 
  name,
  url
from 
  mastodon_search_hashtag 
where 
  query = 'introduction'

Это создало список ссылок, таких как https://mastodon.social/tags/introduction, на домашние страницы для вариантов тега. Это полезные ссылки! Каждый переходит на страницу, где вы можете увидеть, кто публикует тег.

Чтобы сделать это представление немного более полезным, я коснулся третьего элемента ответа API, historyв пересмотренном запросе.

with data as (
  select 
    name,
    url,
    ( jsonb_array_elements(history) ->> 'uses' )::int as uses
  from 
    mastodon_search_hashtag 
  where 
    query = 'introduction'
)
select
  name,
  url,
  sum(uses)
from
  data
group by
  name, url
order by
  sum desc

Эти результаты помогают мне решить, какой вариант использовать.

+-------------------+---------------------------------------------------+------+
| name              | url                                               | sum  |
+-------------------+---------------------------------------------------+------+
| introduction      | https://mastodon.social/tags/introduction         | 1816 |
| introductions     | https://mastodon.social/tags/introductions        | 218  |
| introductionpost  | https://mastodon.social/tags/introductionpost     | 19   |
| introductionfr    | https://mastodon.social/tags/introductionfr       | 6    |

Но мне все еще нужно посетить страницу каждой ссылки, чтобы узнать, как она используется. Было бы неплохо отображать больше контекста на панели инструментов, и я нашел отличный способ сделать это, но сначала давайте на минутку остановимся на пересмотренном запросе. JSON-функции Postgres очень мощные, и часто сложно (по крайней мере, для меня) представить, как они работают.

Постгрес jsonb_array_elements() функция – это то, что называется набор-возвращающая функция. Здесь он распаковывает JSON-представление Postgres списка history структуры, возвращенные из Mastodon API. В простейшей форме вызов функции jsonb_array_elements(history) создает временную таблицу с данными за день для каждого тега.

select
  name,
  jsonb_array_elements(history) as history
from
  mastodon_search_hashtag 
where 
  query = 'introduction'
+--------------------------------+----------------------------------------------------+
| name                           | history                                            |
+--------------------------------+----------------------------------------------------+
| introduction                   | {"accounts":"16","day":"1670371200","uses":"19"}   |
| introduction                   | {"accounts":"250","day":"1670284800","uses":"269"} |
| introduction                   | {"accounts":"259","day":"1670198400","uses":"274"} |
| introduction                   | {"accounts":"253","day":"1670112000","uses":"270"} |
| introduction                   | {"accounts":"245","day":"1670025600","uses":"269"} |
| introduction                   | {"accounts":"345","day":"1669939200","uses":"383"} |
| introduction                   | {"accounts":"307","day":"1669852800","uses":"339"} |
| introductionsfr                | {"accounts":"0","day":"1670371200","uses":"0"}     |
| introductionsfr                | {"accounts":"0","day":"1670284800","uses":"0"}     |
| introductionsfr                | {"accounts":"0","day":"1670198400","uses":"0"}     |
| introductionsfr                | {"accounts":"0","day":"1670112000","uses":"0"}     |
| introductionsfr                | {"accounts":"0","day":"1670025600","uses":"0"}     |

history — это столбец JSONB, содержащий объект с тремя полями. В пересмотренном запросе используется оператор индексации Postgres JSON. ->> чтобы добраться до этого объекта и поднять количество ежедневных использований в свой собственный столбец, чтобы он мог быть целью SQL SUM функция.

Хорошо, готовы к изящному решению? Напомним, что https://mastodon.social/tags/introduction является домашней страницей для этого варианта тега. Там вы можете увидеть вводные сообщения от людей, использующих этот тег. Эти сообщения обычно включают другие теги. На панели инструментов, показанной выше, вы можете видеть, что Кэти Никелс использует следующие элементы: #Музыка #Искусство #Конный спорт #Природа #Животные. Теги появляются в ее вступительном посте.

поиск мастодонта по тегу кэти никельс в приложенииIDG

Я не сразу понял, как захватить их для использования в приборной панели. Затем я вспомнил, что некоторые классы страниц Mastodon имеют соответствующие RSS-каналы, и задался вопросом, являются ли страницы тегов членами одного такого класса. Конечно, они есть, и https://mastodon.social/tags/introduction.rss — это вещь. Это звено, образованное прихватом .rss на базовый URL-адрес, обеспечивает дополнительный контекст, который я искал. Вот окончательный вариант запроса.

with data as (
  select 
    name,
    url,
    ( jsonb_array_elements(history) ->> 'uses' )::int as uses
  from 
    mastodon_search_hashtag 
  where 
    query = 'introduction'
  ),
  uses as (
    select 
      name,
      url || '.rss' as feed_link,
      sum(uses) as recent_uses
    from 
      data 
    group 
      by connection, name, url
  )
  select
    u.name,
    r.guid as link,
    to_char(r.published, 'YYYY-MM-DD') as published,
    r.categories
  from
    uses u
  join
    rss_item r
  on 
    r.feed_link = u.feed_link
  where
    recent_uses > 1
  order by 
    recent_uses desc, published desc
)

Новые ингредиенты, любезно предоставленные RSS-каналом, guidкоторый ссылается на индивидуальное введение, такое как у Кэти; published, это день, когда появилось введение; и categories, который имеет теги, используемые во вступительном посте. Сладкий! Теперь я могу сканировать панель инструментов, чтобы понять, какие вводные я хочу проверить.

Первые три запроса используют плагин Steampipe для Mastodon, в частности его mastodon_search_hashtag table, которая инкапсулирует API Mastodon для поиска тегов. Окончательная версия объединяет эту таблицу с таблицей rss_item, предоставленной подключаемым модулем RSS, используя общий базовый URL-адрес в качестве основы для объединения.

Это радует меня во многих отношениях. Когда блогосфера впервые появилась в начале 2000-х годов, некоторые из нас обнаружили, что протокол RSS способен на гораздо большее, чем просто доставка каналов читателям RSS. Другим популярным протоколом того времени были веб-сервисы XML. Как аналитик InfoWorld я должен был приветствовать последнюю как технологию корпоративного уровня, но я не мог не заметить, что RSS продолжает оставаться отличным способом перемещения данных между взаимодействующими системами. Это всегда было правдой, и мне нравится, как этот пример напоминает нам, что это все еще верно.

Я в равной степени рад показать, как Steampipe делает возможным это современное упражнение в интеграции на основе RSS. Первоначально Steampipe был механизмом для сопоставления результатов конечных точек JSON API с таблицами SQL. Однако со временем он расширил свое представление о том, что представляет собой API. Вы можете использовать Steampipe для запроса файлов CSV, файлов Terraform или, как мы видим здесь, RSS-каналов. Данные бывают самых разных вкусов. Steampipe абстрагирует эти различия и объединяет все разновидности в единое пространство, где вы можете рассуждать о них с помощью SQL.

И, наконец, просто замечательно оказаться на пересечении Mastodon, Steampipe и RSS в этот замечательный момент. Я с готовностью признаю, что ностальгия является фактором. Но 20 лет назад RSS разрушил все, Mastodon делает это сейчас, и мне нравится, что RSS может помочь этому случиться снова.

Теперь мне нужно написать это #introduction!

Эта серия:

  1. Автономность, размер пакета, трение, разветвление и скорость
  2. Mastodon, Steampipe и RSS
  3. Просмотр федиверса
  4. Терминал Bloomberg для Mastodon
  5. Создайте свой собственный Mastodon UX
  6. Списки и люди на Mastodon
  7. Сколько людей в моей ленте Mastodon также написали сегодня в Твиттере?
  8. URL-адреса Mastodon с указанием экземпляра
  9. Графики взаимоотношений мастодонтов
  10. Работа со списками мастодонтов
  11. Изображения считаются вредными (иногда)
  12. Картирование более широкой федеральной сети
  13. Протоколы, API и соглашения
  14. Новости в федерации
  15. Сопоставление людей и тегов в Mastodon
  16. Визуализация модерации сервера Mastodon
  17. Сроки Mastodon для команд
  18. Плагин Mastodon теперь доступен на Steampipe Hub.

Related Posts

Оставить комментарий