Сегодня я был полон решимости написать свое #представление о мастодонте. Для начала я использовал поиск по тегам на панели инструментов, которую я создаю.
Идея заключалась в том, чтобы просмотреть кучу других постов #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 является домашней страницей для этого варианта тега. Там вы можете увидеть вводные сообщения от людей, использующих этот тег. Эти сообщения обычно включают другие теги. На панели инструментов, показанной выше, вы можете видеть, что Кэти Никелс использует следующие элементы: #Музыка #Искусство #Конный спорт #Природа #Животные. Теги появляются в ее вступительном посте.
Я не сразу понял, как захватить их для использования в приборной панели. Затем я вспомнил, что некоторые классы страниц 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!
Эта серия:
- Автономность, размер пакета, трение, разветвление и скорость
- Mastodon, Steampipe и RSS
- Просмотр федиверса
- Терминал Bloomberg для Mastodon
- Создайте свой собственный Mastodon UX
- Списки и люди на Mastodon
- Сколько людей в моей ленте Mastodon также написали сегодня в Твиттере?
- URL-адреса Mastodon с указанием экземпляра
- Графики взаимоотношений мастодонтов
- Работа со списками мастодонтов
- Изображения считаются вредными (иногда)
- Картирование более широкой федеральной сети
- Протоколы, API и соглашения
- Новости в федерации
- Сопоставление людей и тегов в Mastodon
- Визуализация модерации сервера Mastodon
- Сроки Mastodon для команд
- Плагин Mastodon теперь доступен на Steampipe Hub.