Jak pobrać listę ostatnich postów dla grupy Guppe Groups

Czyli wstęp do własnego #backfiller-a dla #Mastodon-a

Grupa na @a.gup.pe zasubskrybowana, ale nie widzisz, co ludzie ciekawego w niej wczesniej pisali. To naturalne, niestety, zobaczysz jedynie nowe posty, czyli “od teraz”.

Ale co ze starymi? Przecież gdzieś są?

No oczywiście, że są. Twoja instancja mogłaby, gdyby chciała, zapytać serwer grup o ostatnie posty. To samo dotyczy zresztą nowo obserwowanych osób – też nie widzisz ich starszych postów. Ale instancja “nie chce”, bo ActivityPub “tak ma”. W zasadzie to Gargron nie chce tego zaimplementować ;) (żarcik)

Skoro ustaliliśmy, że starsze posty z grupy są pamiętane, to gdzie?

Tam, gdzie zwykle w ActivityPub, czyli w “outbox” aktora, jakim jest konto grupy. Przyjmijmy, że sprawdzamy grupę “rower”. Jej outbox to:

https://a.gup.pe/u/rower/outbox

Jak go pobrać?

Najpierw pytamy o kolekcję:

curl https://a.gup.pe/u/rower/outbox -H 'Accept: application/ld+json;'

W odpowiedzi dostajemy adres “first” do naszej OrderedCollection:

{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1"],"id":"https://a.gup.pe/u/rower/outbox","type":"OrderedCollection","first":"https://a.gup.pe/u/rower/outbox?page=true","totalItems":94}

No i teraz już z górki, dostaniemy w odpowiedzi ostatnie posty na grupie:

curl https://a.gup.pe/u/rower/outbox?page=true -H 'Accept: application/ld+json;

W zasadzie wiemy już wszystko, w naszej tablicy orderedItems[] mamy interesujące dane, adres url posta z grupy jest w polu object.

A jak wyciągnąć całą listę postów? Posłużmy się skryptem #bash z wykorzystaniem niezawodnego #jq, odpytując w pętli o wszystkie adresy postów:

#!/usr/bin/env bash

instance="https://a.gup.pe"
group="rower"

json=$(curl -s -H "Accept: application/activity+json" $instance/u/$group/outbox?page=true)
echo "$json" | jq -r .orderedItems[].object | xargs -I% echo "%"
next=$(echo "$json" | jq -r .next)

while true; do
        json=$(curl -s -H "Accept: application/activity+json" "$next")
        echo "$json" | jq -r .orderedItems[].object | xargs -I% echo "%"
        next=$(echo "$json" | jq -r .next)
        if [ -z "$next" ]; then
                break
        fi
done

Dobra, mamy listę adresów postów z grupy. Co można z nimi zrobić?

Możesz każdy z nich wkleić w pole “szukaj” twojej web apki mastodona. Instancja go znajdzie, pobierze, wyświetli, “sfederuje”, pojawi się on na liście “ostatnich” postów profilu grupy. Będzie od teraz widoczny nie tylko dla ciebie, ale dla wszystkich użytkowników twojej instancji.

Można to zautomatyzować? Tak. Ale musisz mieć token, żeby autoryzować się na twojej instancji. Api search wymaga “zalogowania”. Wcześniej pytaliśmy o dane publiczne i autoryzacja nie była wymagana.

Ja używam #python-owego narzędzia toot do pracy z mastodonem z linii poleceń. Polecam go. To również cały tekstowy klient mastodona, odpal: toot tui

Po zainstalowaniu toot i zalogowaniu przez:

toot login

Możesz znaleźć token przez:

toot auth

i sprawdzić wskazany plik.

Są inne sposoby, by pozyskać token. Najprościej chyba to podejżeć w przeglądarce, co wysyła w nagłówku twoja apka do instancji mastodona w nagłówku request-u Authorization: Bearer.

Jak już masz token, to wywołanie API jest proste:

curl "https://twoja.instancja/api/v2/search?q=adresPostaDoWyszukania&resolve=true&limit=20&type=statuses" -H "Accept: application/json" -H "Authorization: Bearer TWÓJ_TOKEN"

A czy można wykorzystać ten mechanizm do backfill-owania tootków również nowo obserwowanych użytkowników? Myślę, że tak.

Jak?

Napiszę o tym w następnym poście, stay tuned.

Ten wpis to trochę notatki na szybko, zanim pójdę spać :)

Udanego backfill-owania postów z grupy!

Masz pytania? Uwagi? Komentarz? Zapraszam do rozmowy pod tootkiem: https://mastodon.social/@m0bi13/109515778432111992

— Chcesz wesprzeć moje pisanie i działania? Wpłać datek na fundację FTdL @ftdl@pol.social, z którą współpracuję :) Jednorazowo: https://ftdl.pl/wplaty/ Cyklicznie: https://ftdl.pl/wsparcie/ Fedi: m0bi13@pol.social E-mail: m0bi@e.email