Плагин ActivityPub

Возможно, мне придется объяснить это так, будто мне пять лет.

Если моя организация представлена в Mastodon по адресу https://example.social/@MyOrganization,

могу ли я создать категорию в Discourse, которая отображает все посты организации в Mastodon?

https://discourse.example.org//c/fediverse/67

И будут ли все взаимодействия с этими постами (лайки или ответы) в Mastodon отображаться в постах Discourse в этой категории?

И будут ли все взаимодействия с этими постами в Discourse видны в Mastodon?

Я подожду вашего подтверждения или опровержения, прежде чем задавать свои уточняющие вопросы.

1 лайк

Я отвечаю за всех, в ком я уверен.

Да, можете. Тогда эта категория будет синхронизироваться с вашим аккаунтом Mastodon.

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

Это моя текущая проблема: нет, в том смысле, что комментарии, написанные под темой в категории, не передаются в Mastodon.

Однако, если вы разрешите, эту категорию можно будет подписать из Mastodon, и тогда всё написанное будет публично в Mastodon — в зависимости от ваших настроек: будут ли это темы и посты целиком или только первое сообщение темы. Реакции в Mastodon не передаются.

Вкратце:

  • если категория подписана на пользователя Mastodon: Discourse получает данные из Mastodon
  • если пользователь Mastodon подписан на категорию: Mastodon получает данные из Discourse

Таким образом, упрощённо говоря:

  • если главная цель — донести информацию до пользователей форума, а пользователи Mastodon увидят это только при подписке, то публикация происходит в темах, и пользователи Mastodon увидят её только если кто-то подписан на эту категорию (или если они, как пользователи ActivityPub, знают, как её найти)
  • если главная цель — донести информацию до пользователей Mastodon, а пользователи форума увидят это, если подпишутся на эту категорию, и федеративное участие от категории не требуется, то эта категория подписана на вашего пользователя Mastodon

По сути одно и то же, но сообщения в Mastodon отображаются по-разному.

Один момент: из-за ограничений Mastodon практически все теги Markdown отображаются как есть. Например, жирный шрифт в Mastodon не применяется, и подписчики видят **жирный** вместо жирный. Также теги не передаются ни туда, ни сюда.

2 лайка

У меня есть песочница Discourse, если вам нужен бета-тестер.

1 лайк

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

Это, по-видимому, связано с тем, что на mastodonapp.uk включена функция авторизованной выборки (Authorized fetch) в Mastodon. Я еще раз изучу этот вопрос в ближайшие дни.

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

Чтобы я мог рассказать больше, вам нужно поделиться самим сообщением (то есть не только трассировкой стека). Когда включено подробное логирование, плагин будет регистрировать сбои при обработке входящих объектов. Сбоев при обработке может быть много, и многие из них не связаны с Discourse. В федеративной вселенной постоянно летает множество объектов. Возможно, я изменю уровень логирования этих сбоев обработки на «info», так как считаю, что они создают у людей впечатление проблемы с самим плагином, хотя в большинстве случаев проблемы на стороне Discourse нет.

Да, они должны отображаться как ответы в Mastodon. Конкретные примеры всегда лучше, так как я могу проанализировать, что произошло, и устранить любые проблемы (если они вообще есть).

Да, именно так работает настройка «Полная тема» (Full Topic). Подробнее см.

1 лайк

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

Теги, боты и т.д. — спасибо, это многое прояснило.

Как мне это сделать? Потому что это происходит с каждым сообщением, а не с некоторыми.

редактирование

Не знаю, поможет ли это, но за минуту до этого предупреждения появилось следующее:

[Discourse Activity Pub] Не удалось обработать https://mastodon.social/users/fesshole: Объект не поддерживается

Это было сообщение, которое я репостнул.

А с тем же временным меткой, что и это предупреждение, появилось вот что:

[Discourse Activity Pub] Не удалось обработать https://mastodon.social/users/moa333#delete: Объект не готов

Если мне нужно предположить, то последнее связано с handlers::warning, и оба сообщения носят информационный характер, так что мне вообще не стоит беспокоиться о них?

редактирование 2

Да, проблема была в HTTP-подписи. Плагин требовал её, но мой Mastodon её не использовал. Когда я отключил её на обоих концах (возможно, включение на обоих сайтах дало бы тот же эффект), сообщения начали путешествовать сюда, туда и повсюду.

Мне нужно глубже разобраться в реальных плюсах и минусах использования этой настройки.

Спасибо, что направили меня в верном направлении!

1 лайк

Спасибо за информацию. В ближайшие дни я ещё раз изучу нашу реализацию HTTP-подписей в контексте функции авторизованной выборки Mastodon. Возможно, они изменили способ обработки подписей, или нам потребуется скорректировать наше решение.

Потому что я предполагал (на уровне воображения, без фактов), что если у меня включены подписи в Discourse и отключены в Mastodon, то сообщения будут идти из Discourse в Mastodon (так как инстанс не использует HTTP-подписи), но не из Mastodon в Discourse (так как форум требует HTTP-подписей). Однако произошло ровно наоборот.

Но аккаунт Mastodon (мой аккаунт) связан с моим пользователем Discourse, и я являюсь администратором — может ли это что-то означать?

В любом случае, когда HTTP-подписи не используются ни там, ни там, всё работает как ожидается. Меня это устраивает, но для вас, как для разработчика, ситуация может быть иной :smirking_face:

Не уверен, насколько сильны и обоснованы преимущества HTTP-подписей. Некоторое время назад у Pixelfed возникли проблемы с Mastodon, когда подписи были включены. У нас также есть третий участник — WordPress.

В любом случае, я сейчас ушёл от темы.

1 лайк

Этот аккаунт должен стать доступным для обнаружения после слияния и последующего развертывания на вашем сервере.

3 лайка

@Jagster Все ваши ответы также будут корректно отображаться в Mastodon после слияния этого запроса.

(Mastodon внес некоторые изменения в свою обработку)

4 лайка

Это уже исправлено, @tvavrda. Извините за это, я пропустил шаг в процессе.

2 лайка

Пытаюсь подписаться на аккаунт в Peertube по категории, но статус остаётся «в ожидании».

Вот что записано в логах:

POST-запрос к https://spectra.video/accounts/spoilerdiacre/inbox не удался: Ожидалось ([200, 201, 202]), а получено (403 Forbidden)
https://community.derpandchill.com/ap/actor/ca233d6f9d47cde558877fb7609a6b3a не удалось доставить на https://spectra.video/accounts/spoilerdiacre/inbox

Я пробовал несколько раз. Понимаю, что это разные вещи, но было бы здорово автоматически публиковать видео в моём сообществе.

Спасибо за отчёт, я более внимательно изучу это в конце этой недели.

О федерации между Discourse и Mastodon. Есть несколько вещей, которые я не понимаю: либо я чего-то не могу, либо ожидаю слишком многого. Я привёл несколько ссылок. Контент на финском, но, думаю, сам контент не так важен.

Акторы форума и репосты (boosting)

Если я всё правильно понимаю, актор категории федератирует тему через репост (boost), потому что реальным пользователем является актор, но пока что вещи работают не совсем так. Значит, репост — это единственный способ федерации?

Но это создаёт ситуацию, когда пользователь Mastodon видит это как репост, а оригинальным отправителем, например, является мой @Jagster@foorumi.katiska.eu. Однако они никогда не подписываются на аккаунт, сделавший репост, а на оригинальный — мой личный аккаунт форума. Но они не могут этого сделать, потому что видят запрос на одобрение, а я не могу его обработать. Так что они никогда никого не подписываются.

Статья против заметки (Article vs. Note)

Я не до конца понимаю, чего ожидать, но мне кажется, что они работают противоположным образом.

Если я использую формат Note, Discourse федератирует первый пост как есть. Вот пример: Sokeriton kofeiini voi olla terveellistä - Ihminen, luonto & maailma - Katiskan foorumi (и, как обычно, ссылки ActivityPub находятся корректно; BTW, мне нравится новый способ отображения, даже если я не использую его полностью).

Там показывается «Читать далее», но при клике контент открывается в Mastodon.

А вот это — Статья: Onko koiran peitsaaminen aina merkki ongelmasta? - Koiramaailma - Katiskan foorumi
Там показывается только заголовок и ссылка на тему. Так что чтение в Mastodon невозможно.

Редактирование: извините за путаницу после правки, но я только что понял, что этот тип статьи отображался как исходящий от моего аккаунта форума, а не как репост от актора категории. Он делает это каждый раз; это два разных сценария: оригинал и репост :man_facepalming: Это было приятно, кстати. Но подписка на моего аккаунта форума всё ещё невозможна из-за требования одобрения; он ведёт себя как заблокированный аккаунт.

Я попытался прочитать эту (мега)тему и даже написал в ask.discourse.com. Это возможность показывать полную статью реализована именно через ссылки, а не через отображение самого контента? Если да, то это излишне для Mastodon, поскольку он может показывать и более длинные материалы, поэтому я буду использовать формат Note вместо Article.

Федерация обсуждений

Когда я федератирую тему, и кто-то комментирует её, это красиво отображается под этой темой. Но если я комментирую эту тему на форуме, это тоже будет федератировано, однако никто не увидит это как комментарий к этой теме (или треде в Mastodon), потому что оно отправлено как репост актором категории?

Это такой случай, когда (официальное) приложение Mastodon говорит, что, возможно, не все комментарии есть на этом инстансе, и нужно открыть оригинал — но никто этого никогда не делает.

Вот тема, где у меня было два независимых обсуждения: форум видел всё, но Mastodon не знал о комментариях, оставленных на форуме: Pikkulasten ruuat? - Retkeily & Melonta - Katiskan foorumi

Редактирование: на момент написания этого текста той теме около 5 дней, и она была репостнута и опубликована актором категории, а не моим пользователем форума. Что-то изменилось с тех пор до настоящего времени (да, я почти каждый день делаю пересборку).

1 лайк

Это не единственный способ, но это основной метод, используемый платформами, похожими на форумы, для федерации групп тем/веток (например, с определённым тегом или категорией). Процесс описан в спецификации FEP-1b12, которой мы следуем и над которой работаем совместно с другими разработчиками.

Извините, я не совсем понял, в чём именно проблема. Не могли бы вы переформулировать?

Причина этого в том, что Mastodon прекратил преобразование содержимого статей и теперь просто показывает ссылку на оригинальный контент. Учитывая рост популярности форумов в федеративной сети, например, нашего, возможно, скоро появится новый PR в Mastodon, чтобы вернуть эту поддержку.

Да, недавно в этом отношении произошли некоторые изменения, поскольку Mastodon внес ряд правок на своей стороне. Скорее всего, в будущем последуют ещё изменения, так как мы стремимся усовершенствовать наш подход. Если бы вы привели конкретные примеры того, что не соответствует вашим ожиданиям, например, Пост 1 (Discourse), Ответ 1 (Mastodon), Ответ 2 (Discourse) и т. д., или что-то подобное, это было бы очень полезно.

1 лайк

У меня не так много ожиданий, но есть некоторые пожелания :joy:. Всё остальное теперь понятно, кроме этой штуки с «boost/writer». Возможно, у меня больше нет проблем.

Речь о том, как это отображается в Mastodon.

  • ретвит от актора категории
  • оригинальный пост — от моего пользователя на форуме

Когда я кликнул на своего актора с форума, появилось следующее (скриншот из приложения Mona, хотя официальная PWA показывала то же самое, но по-другому):

Красная иконка — это запрос на подписку, как в случае с закрытым профилем.

Затем я выполнил пересборку.

Теперь официальная PWA отображает всё как надо:

Но в Mona всё ещё отображается та красная иконка.

По какой-то причине я или кто-либо другой не мог подписаться на моего актора с форума из-за этого. Но теперь проблема исправлена (какой-то странный сбой между двумя системами :man_shrugging:). Теперь используемое приложение Mastodon не обновляет свой контент, но это уже не ваша головная боль.

Так что этот пост был лишь информационным, чтобы показать… что-то :joy:

1 лайк

Одно небольшое предложение по косметическому улучшению: можно ли добавить графический индикатор, чтобы показывать, что пост пришёл от участника ActivityPub? Как мы видим значок конверта, когда кто-то использует электронную почту.

Причина в том, что мои пользователи путаются, потому что не видят разницы между локальными пользователями форума и пользователями Mastodon.

Почему им это нужно знать? Не знаю. Люди просто так себя ведут, и я хочу, чтобы они были спокойны. К тому же мы уже показываем и электронную почту, хотя это тоже не обязательно и не является важной деталью.

Если пост от удалённого участника, рядом с датой публикации (в том же месте, где значок почты) отображается синий значок AP.

Для ответов это просто синий значок AP. Для оригинального поста (OP) под картой темы отображается тот же синий значок вместе с дополнительной информацией.

1 лайк

Теперь, когда вы это сказали, я вижу разницу, едва заметно :joy:

Вы помните CSS для изменения одного из этих цветов, чтобы сделать его более заметным?

Редактирование

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

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

.activity-pub-topic-status,
.activity-pub-post-status {

  &.published .d-icon-discourse-activity-pub,
  &.updated .d-icon-discourse-activity-pub {
    color: #808080;
  }
  &.published-remote .d-icon-discourse-activity-pub {
    color: #008000;
  }
}
2 лайка

РЕДАКТИРОВАНИЕ

Эта проблема связана с пользователем @a.gup.pe. Все федеративные категории находят пользователя @koirat@a.gup.pe и начинают его подписку, показывая статус «ожидание». После перехода на другую страницу и возврата ничего не отображается — подписка исчезла.

Категории, однако, могут подписываться на реальных людей.

Этот актор по сути является ботом, а Discourse не может подписываться на ботов — но, насколько мне известно, он не идентифицирует себя как бот. И даже если проблема заключается в «ботовости» (есть ли такое слово вообще :flushed_face:), Discourse не должен позволять мне подписываться на него в первую очередь (если только Discourse в тот момент не знал об этом). В любом случае, он не должен разрывать подписку без уведомления. Или сделал это… Я не проверял логи, моя вина.

РЕДАКТИРОВАНИЕ 2

Вот всё, что я смог найти.

не удалось доставить на https://a.gup.pe/u/koirat/inbox
[Discourse Activity Pub] https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd не удалось доставить на https://a.gup.pe/u/koirat/inbox
--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
id: https://foorumi.katiska.eu/ap/activity/e05428a3d5d0d9637c8b191bc4556063
type: Follow
to: https://a.gup.pe/u/koirat
published: '2025-02-23T07:11:19Z'
updated: '2025-02-23T07:11:19Z'
actor: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  id: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd
  type: Group
  updated: '2025-02-20T08:03:45Z'
  url: https://foorumi.katiska.eu/c/koiramaailma/33
  name: 'Katiska.eu: koiramaailma'
  inbox: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd/inbox
  outbox: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd/outbox
  followers: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd/followers
  preferredUsername: koiramaailma
  publicKey: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
    id: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd#main-key
    owner: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd
    publicKeyPem: |
      -----BEGIN PUBLIC KEY-----
     (Это, думаю, не имеет значения. Просто занимает место)
      -----END PUBLIC KEY-----
  icon: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
    type: Image
    mediaType: image/png
    url: https://cdnfoorumi.katiska.eu/original/1X/c51c0a678551648d73e3f8729ec95ecd1fc0bb73.png
  "@context": https://www.w3.org/ns/activitystreams
"@context": https://www.w3.org/ns/activity...

Webfinger находит пользователя a.gup.pe, так что это не может быть причиной.

Это частный случай, или я снова пытаюсь сделать что-то странное?

Discourse не может подписываться на списки Mastodon (и у самих списков в Mastodon есть свои проблемы). Поэтому я попробовал использовать «псевдопользователя» a.gup.pe.

Я создал @koirat@a.gup.pe, подписавшись на того же пользователя в своём экземпляре — он будет собирать твиты, где используется тег #koirat (по-фински «собаки», кстати). Всё прошло успешно.

Затем я отправил сообщение из Mastodon, и в нём были упомянуты как тег, так и пользователь. Оно появилось в списке подписок на пользователя guppe.

В своём Discourse я попросил категорию X подписаться на пользователя @koirat@a.gup.pe. У меня есть ещё категория Y, подписанная на моего актора @jagster@kvarkki.nexus, и она находилась в статусе «ожидание». Поэтому я ожидал получить сообщение дважды: одно от меня и одно через guppe (о, чёрт, не в этом ли проблема :thinking:).

Сообщение, отправленное моим актором, было опубликовано в категории Y, как и ожидалось. Категория X ничего не получила от актора guppe.

Когда я открыл федерацию категории X, оказалось, что она больше не подписана на @koirat@a.gup.pe.

Так что мои предположения:

  • @a.gup.pe работает немного иначе, и Discourse не может это понять
  • Я попытался опубликовать две идентичные темы из Mastodon (это я могу легко проверить, займёт пару минут)

Это не чисто академическая проблема, так как это могло бы решить проблемы со списками в Mastodon.

Причина, по которой это не работает, заключается в том, что когда Discourse пытается отправить Follow на a.gup.pe/u/koirat/inbox, в ответ приходит ошибка 500 Internal Server Error.

HTTP/1.1 500 Internal Server Error\r\n

Другими словами, в Guppe есть ошибка.

Стоит отметить, что коллективный подход Fediverse к группам в настоящее время немного развивается. Я обсуждаю это, а также несколько других связанных вопросов, с представителями NodeBB, WordPress, Mastodon и других проектов. Например, см.:

Другая проблема, с которой столкнётся Guppe, заключается в том, что сам Mastodon уже некоторое время работает над функцией «Группы», которая может конфликтовать с подходом Guppe.

4 лайка