Hola!
Sovint donem voltes a com aplicar mètriques que no es centrin els típics paràmetres quantitatius i simplistes com els likes. Amb aquest objectiu, he començat a desenvolupar una eina que analitzaria diferents mètriques d’una publicació. Entre totes podem pensar què ens agradaria saber i podria reflectir millor relacions de qualitat.
De moment només funciona amb la API de mastodon, però si us agrada puc anar ampliant el programari compatible
L’eina que he desenvolupat accepta un domini i un codi de publicació i de moment retorna:
- Quantitat de respostes
- Comptes diferents que hi han respost
- Interaccions de l’autora amb diferents comptes
- Quantitat de servidors que hi han interaccionat
- Quantitat de comptes que no seguien l’autor que hi han respost
La mètrica 1 i 2 són bastant quantitatives a l’estil clàssic (i que poden servir per a generar ratios amb la resta), però a partir d’aquí ja intenten donar una idea de diversitat i conversa.
La mètrica 3 puntuaria millor aquelles converses on l’autora parla i respon a diverses usuàries, en contraposició a un compte que només publica i no respon (en anglès broadcaster).
Les mètriques 4 i 5 donen una idea de la transmissió de la publicació/conversa a través de la federació. En particular, la mètrica número 5 dona una idea de fins a on ha arribat la publicació a partir d’amplificacions (potser seria interessant sumar-hi els favs, sumar-hi totes les interaccions).
Aquesta última mètrica, que considero interessant, no és senzilla i té algunes arestes. La primera és tècnica: el que fa és obtenir el llistat de seguidors del compte de l’autora a través de l’API. Com que l’API de mastodon (no sé si és igual amb d’altres programaris) té una limitació de 300 peticions cada 5 minuts, si el compte té molts seguidors he de fer que esperi 5 minuts cada 24.000 seguidors. Per tal de minimitzar aquest problema, he creat una memòria cau que es guarda en un fitxer i que fa servir si tornes a demanar la publicació d’un mateix compte.
La segona aresta és que no pots saber qui seguia al compte abans de publicar el fil. Potser algunes de les seves seguidores són degudes al fil en concret i per tant els va arribar a partir d’una resposta o una amplificació. No crec que es pugui solucionar aquesta imprecisió a no ser que es faci l’anàlisi de manera prospectiva, és a dir capturar els seguidors abans de la primera publicació del fil i llavors analitzar-ho al final amb aquesta llista.
A partir d’aquí, crec que es podrien definir alguns ratios que ajudarien a avaluar les diferents publicacions. Per exemple: 3/2 o 5/2.
Alguns exemples de resultats:
Compte al caché de seguidors.
Mètriques per a la publicació: https://paquita.masto.host/@chinicuil/112421400618819746
Quantitat de respostes: 4
Comptes diferents que hi han respost: 4
Interaccions de l'autora amb diferents comptes: 1
Quantitat de servidors que hi han interaccionat: 3
Quantitat de comptes que no seguien l'autor que hi han respost: 3 | 75%
Compte al caché de seguidors.
Mètriques per a la publicació: https://cosocial.ca/@evan/112457047627977316
Quantitat de respostes: 26
Comptes diferents que hi han respost: 21
Interaccions de l'autora amb diferents comptes: 4
Quantitat de servidors que hi han interaccionat: 18
Quantitat de comptes que no seguien l'autor que hi han respost: 9 | 43%
Compte al caché de seguidors.
Mètriques per a la publicació: https://ec.social-network.europa.eu/@EUCommission/112455456338250699
Quantitat de respostes: 59
Comptes diferents que hi han respost: 44
Interaccions de l'autora amb diferents comptes: 4
Quantitat de servidors que hi han interaccionat: 36
Quantitat de comptes que no seguien l'autor que hi han respost: 16 | 36%
Compte al caché de seguidors.
Mètriques per a la publicació: https://mastodon.green/@fanta/112460979292776731
Quantitat de respostes: 48
Comptes diferents que hi han respost: 25
Interaccions de l'autora amb diferents comptes: 6
Quantitat de servidors que hi han interaccionat: 13
Quantitat de comptes que no seguien l'autor que hi han respost: 4 | 16%
Quines mètriques afegiríeu o canviaríeu?
Codi que ho genera:
import requests
import json
import pandas as pd
import sys
import time
import getopt
force_fl = False
# Remove 1st argument from the
# list of command line arguments
argumentList = sys.argv[1:]
# Options
options = "d:i:f:"
# Long options
long_options = ["domain=", "id=", "force="]
try:
# Parsing argument
arguments, values = getopt.getopt(argumentList, options, long_options)
# checking each argument
for currentArgument, currentValue in arguments:
if currentArgument in ("-d", "--domain"):
domain = currentValue
elif currentArgument in ("-i", "--id"):
post_id = currentValue
elif currentArgument in ("-f", "--force"):
force_fl = currentValue.lower() == "true"
except getopt.error as err:
# output error, and return with an error code
print (str(err))
post = requests.get("https://"+domain+"/api/v1/statuses/"+post_id+"/").json()
author = post['account']['id']
url = post['url']
nfoll = post['account']['followers_count']
instance_link = requests.get("https://"+domain+"/.well-known/nodeinfo").json()['links'][0]['href']
instance_software = requests.get(instance_link).json()['software']['name']
responses = requests.get("https://"+domain+"/api/v1/statuses/"+post_id+"/context").json()['descendants']
total_responses = len(responses)
divers_responders_num = len(set([resp['account']['id'] for resp in responses]))
author_pos = [i for i, x in enumerate([resp['account']['id'] for resp in responses]) if x == author]
author_resp_to_dif_acc = len(set([responses[i]['in_reply_to_account_id'] for i in author_pos]))
servers = len(set([resp['account']['url'].split("/")[2] for resp in responses]))
file = open('followers.json', 'r')
dict = json.load(file)
if instance_software == "mastodon":
if post['account']['acct']+'@'+domain in dict.keys() and force_fl != True:
print("Compte al caché de seguidors.")
followers_list = dict[post['account']['acct']+'@'+domain]
else:
print("Compte absent al caché de seguidors. L'operació pot tardar aproximadament "+str(round(nfoll/80/300*5))+" min.")
followers = requests.get("https://"+domain+"/api/v1/accounts/"+author+"/followers?limit=80")
followers_list = [follower['acct'] for follower in followers.json()]
while 'next' in followers.links:
if int(followers.headers['X-RateLimit-Remaining']) <= 10:
time.sleep(120)
followers = requests.get(followers.links['next']['url'])
followers_list = followers_list + [follower['acct'] for follower in followers.json()]
print(followers.headers['X-RateLimit-Remaining'])
else:
followers = requests.get(followers.links['next']['url'])
followers_list = followers_list + [follower['acct'] for follower in followers.json()]
dict.update({post['account']['acct']+'@'+domain:followers_list})
file = open('followers.json', 'w+')
json.dump(dict, file)
else:
if post['account']['acct']+'@'+domain in dict.keys() and force_fl != True:
print("Compte al caché de seguidors.")
followers_list = dict[post['account']['acct']+'@'+domain]
else:
print("Compte absent al caché de seguidors. L'operació pot tardar aproximadament "+str(round(nfoll/80/300*5))+" min.")
followers = requests.get("https://"+domain+"/api/v1/accounts/"+author+"/followers?limit=80")
followers_list = [follower['acct'] for follower in followers.json()]
while 'next' in followers.links:
followers = requests.get(followers.links['next']['url'])
followers_list = followers_list + [follower['acct'] for follower in followers.json()]
dict.update({post['account']['acct']+'@'+domain:followers_list})
file = open('followers.json', 'w+')
json.dump(dict, file)
responders_acct = list(set([resp['account']['acct'] for resp in responses]))
follower_comparison = len([i for i in responders_acct if i not in followers_list])
foll_comp_perc=100*follower_comparison/divers_responders_num
print("Mètriques per a la publicació: "+url)
print("Quantitat de respostes: "+str(total_responses))
print("Comptes diferents que hi han respost: "+str(divers_responders_num))
print("Interaccions de l'autora amb diferents comptes: "+str(author_resp_to_dif_acc))
print("Quantitat de servidors que hi han interaccionat: "+str(servers))
print("Quantitat de comptes que no seguien l'autor que hi han respost: "+str(follower_comparison)+" | "+str(round(foll_comp_perc))+"%")
``