Featured image of post Monkey Island Bot Stats

Monkey Island Bot Stats

Ich habe da ja diese beiden Mastodon Bots …

Die deutschsprachige Version läuft seit dem 30.10.2022, also seit etwas mehr als einem Jahr. Also Zeit für etwas Statistik.

Die Gesamtzahlen

PostsEindeutigeWiederholungenAntwortenBoostsFavourites⌀ Antworten⌀ Boosts⌀ Favourites
932829703.141223391269400.0240.4190.744

Die Top 10 nach durchschnittlichen Boosts

Dreiköpfige Affen haben es Euch angetan …

  1. HEY! HINTER DIR! EIN DREIKÖPFIGER AFFE!
    (Wiederholungen: 2, durchschnittliche Boosts: 17.0, Summe Boosts: 34.0)
  1. Hinter dir… ein dreiköpfiger Affe.
    (Wiederholungen: 2, durchschnittliche Boosts: 12.5, Summe Boosts: 25.0)
  1. Zahl nie mehr als 50 Mark für ein Computerspiel.
    (Wiederholungen: 5, durchschnittliche Boosts: 9.4, Summe Boosts: 47.0)
  1. Ich bin Guybrush Threepwood, ein mächtiger Pirat.
    (Wiederholungen: 2, durchschnittliche Boosts: 8.0, Summe Boosts: 16.0)
  1. Wie passend. Du kämpfst wie eine Kuh.
    (Wiederholungen: 1, durchschnittliche Boosts: 7.0, Summe Boosts: 7.0)
  1. Bei Loom™ muss man nichts eintippen, Karten zeichnen, oder Gegenstände verwalten. Und im Gegensatz zu vielen anderen Adventures, ist es auch für Anfänger zu empfehlen. Ja, es hat sogar einen Preis für die beste Grafik 1989 gewonnen!
    (Wiederholungen: 3, durchschnittliche Boosts: 6.67, Summe Boosts: 20.0)
  1. Kann ich euch für einen Urlaub auf Monkey Island™ begeistern?
    (Wiederholungen: 5, durchschnittliche Boosts: 5.6, Summe Boosts: 28.0)
  1. Ich glaube nicht, dass Gewalt die Antwort ist … obwohl sie mich jetzt sehr befriedigen würde.
    (Wiederholungen: 3, durchschnittliche Boosts: 5.33, Summe Boosts: 16.0)
  1. Ich habe lediglich dieses Gummihuhn.
    (Wiederholungen: 3, durchschnittliche Boosts: 5.33, Summe Boosts: 16.0)
  1. Hallo! Mein Name ist Guybrush Threepwood und ich will Pirat werden!
    (Wiederholungen: 4, durchschnittliche Boosts: 5.25, Summe Boosts: 21.0)

Etwas Code gefällig?

Posts mit bash und curl lesen

Hier ist mein bash Script, um alle statuses eines Accounts über Mastodons API abzurufen

#!/bin/bash

instance="your.instance.org"
access_token="your_access-token"
account_id="your-account-id"
api_endpoint="https://${instance}/api/v1/accounts/${account_id}/statuses"
min_id="1"

while true; do
    response=$(curl -s -X GET -H "Authorization: Bearer ${access_token}" "${api_endpoint}?min_id=${min_id}&limit=40")

    if [[ "$response" == "[]" ]]; then
        break;
    fi

    statuses=$(jq -r '.[] | {id: .id, content: .content, replies_count: .replies_count, reblogs_count: .reblogs_count, favourites_count: .favourites_count, created_at: .created_at}' <<< "$response")

    echo "$statuses"
    
    min_id=$(jq -r '[.[] | .id] | max' <<< "$response")
done

(Hier auch nochmal als GitHub Gist)

Dinge mal eben mit DuckDB auswerten

Und hier das SQL, um die Ergebnisse in DuckDB einzulesen und auszuwerten. Vielen Dank an Michael, der nicht müde wird, DuckDB zu loben 🙂

-- Tabelle entfernen ...
DROP TABLE IF EXISTS monkeystats;

-- ... und aus der JSON-Datei neu anlegen
CREATE TABLE monkeystats AS
SELECT *
FROM read_json_auto('statuses.json');

-- Mastodon Posts sind in ein <p> Tag verpackt ...
UPDATE monkeystats SET content = regexp_replace(content, '.*?>(.*?)<.*$', '\1') WHERE true;

-- Top 10 nach Reblogs/Boosts
select * from (select content,
                      count(*)              as repeats,
                      sum(replies_count)    as sum_replies,
                      sum(reblogs_count)    as sum_reblogs,
                      sum(favourites_count) as sum_favourites,
                      avg(replies_count)    as avg_replies,
                      avg(reblogs_count)    as avg_reblogs,
                      avg(favourites_count) as avg_favourites
               from monkeystats
               group by content
) x
order by x.sum_reblogs desc limit 10;

-- Gesamtzahlen
select count(*)                                          as "Posts",
       count(distinct content)                           as "Eindeutige",
       CAST(count(*) as float) / count(distinct content) as "Wiederholungen",
       sum(replies_count)                                as "Antworten",
       sum(reblogs_count)                                as "Boosts",
       sum(favourites_count)                             as "Favourites",
       avg(replies_count)                                as "⌀ Antworten",
       avg(reblogs_count)                                as "⌀ Boosts",
       avg(favourites_count)                             as "⌀ Favourites"
from monkeystats;
Built with Hugo
Theme Stack designed by Jimmy