🦋 Expansión de trends en BlueSky
El otro dÃa usando BlueSky vi a un mutual quejándose de los "trends" de esta nueva red social, más que nada por el contenido de alguno de estos. Obviamente en este post no me voy a poner a hablar sobre ese tipo de contenido, pero lo que sà que me pareció interesante es ver cómo se propagan esos trends.
Solo por aclararlo, por trend me refiero a una cadena de posts, que citan a otros posts con una misma temática: ya sea para poner imágenes de lo que sea, para decir a qué ciudades has ido o cualquier cosa que se le ocurra a un usuario de BlueSky.
Esto realmente no es que sea nuevo, es básicamente lo mismo que pasaba en Twitter, pero con una pequeña diferencia, que en BlueSky se puede obtener información para analizar esto pero sin tener que pagar un duro.
Obtención de Datos
Como querÃa ver el tema de los trends, asà que lo que hice lo que era más lógico: ir a los perfiles de mis mutuals de confianza y ver en cuales habÃan participado. Asà que bueno con eso ya he partido con unos cuantos trends distintos, no muchos: como unos cinco, pero para esto es más que suficiente.
Básicamente lo que quiero hacer ahora mismo es:
- Obtener el post original
- Ver las quotes
- Ver las quotes de las quotes
- Ver las quotes de las quotes de las quotes
- ...
Básicamente para poder ver cómo se expanden estos trends. Lo que cuento de la API de BlueSky no es que sea necesario para esto, asà que puedes ir a la sección de Vamos al lÃo si no te interesa lo siguiente.
API de BlueSky
Afortunadamente para gente como yo, BlueSky tiene una API gratuita y según he visto bastante permisiva para hacer bastantes cosas: Documentación de la API. Asà que esta mañana me ha dado por usarla, a ver qué tal iba.
Realmente fue algo sencillo, un poco extraño que no te hagan crear una key, y con eso haces el login, sino que directamente tienes que poner el usuario y la contraseña. No soy muy fan de ello, pero tampoco he venido a quejarme de eso.
Usando la API
Para encontrar el root, podrÃa estar clickando hasta llegar al final, asà que lo lógico teniendo la API fue, ir post a post viendo cual habÃan citado hasta encontrar el último (hay funciones que hice yo pero os imagináis lo que hacen):
def find_root_post(starting_post):
current_post = starting_post
while current_post.embed is not None and current_post.embed.py_type in ["app.bsky.embed.record#view", "app.bsky.embed.recordWithMedia#view"]:
if current_post.embed.py_type == "app.bsky.embed.record#view":
uri = current_post.embed.record.uri
else:
uri = current_post.embed.record.record.uri
search_posts = get_post_by_uri(uri).posts
if len(search_posts) > 0:
current_post = search_posts[0]
else:
break
Un poco de rant por mi parte aquÃ, ¿por qué ponen la estructura distinta si viene con imagen? Un poco innecesario que record venga dentro de otro campo record que solo lleve eso, pero bueno. Al final la API de BlueSky devuelve las cosas como las devuelve, pero no entiendo muy bien el por qué de eso, lo tendrá, pero me parece un poco estúpido de primeras.
En fin, el código es algo meh, pero funciona para lo que quiero. Tiene por ahà algunos sleeps para evitar bombardear la API (eso está feo en general, no lo hagáis🫵). Al final obtengo el post principal, el que lo comenzó todo. En algunos casos para obtener el post raÃz he tenido que viajar como 20 posts, comenzando desde un punto "random", por asà decirlo.
Luego, para obtener los posts citados, pues se hace un poco de lo mismo, viva la recursión y esas cosas. Aquà lo único importante es que reviso cuántos quotes tiene un post, si es 0 evito mandar más solicitudes por ese lado.
def obtain_all_posts_from_root(root, start=False, csv_path="output.csv"):
if start:
save_post_info(root, csv_path=csv_path)
quotes = get_quotes_of_post(root)
for post in quotes.posts:
save_post_info(post, csv_path=csv_path)
if post.quote_count > 0:
obtain_all_posts_from_root(post, csv_path=csv_path)
Estructura o grafo de los trends
Con los datos que he obtenido tengo básicamente dos cosas de cada post:
- El identificador del post
- El identificador del post que cita
Al final toda la información es asÃ, solo la raÃz no tiene post que cita, asà que como es lógico, para ver este tipo de cosas hay que usar grafos. Y dentro de los grafos, los direccionales (para que tengan flechita âžœ).
Yo la verdad es que no tengo tanta idea de grafos, algo he tenido que aprender últimamente, asà que bueno, más razón para trastear con ellos.
Asà que vamos a ver qué he estado mirado, he cogido el trend de la "mochila", que yo mismo participé:

Antes de seguir, no, no son 6 cosas, son 5, la libreta y boli vienen en pack!
Para mi sorpresa, cuando vi el post original, no solo estaba en inglés, sino que solo tenÃa dos citados:

Realmente, esto nos muestra ya dos cosas interesantes:
- Incluso si el post original apenas tiene engagement este trend se puede llegar a expandir por las timelines de la gente.
- Lo sensible que son estos "trends", porque si al post de arriba no lo cita la persona correcta, al final yo ni nadie hubiese participado.
Vamos al lÃo
Ahora os voy a mostrar la estructura del grafo del trend de arriba justamente, ahora os explico cada cosa.

Lo primero de todo, cada nodo (o bolita) representa un post, y la fechita apunta al post que se está citando.
Luego, he pintado de rojo el post original. Si observáis, solo hay dos nodos que lo apuntan. Entonces, por el lado de la derecha solo hubo una quote, y ese post a su vez no consiguió ningún citado. Sin embargo, por el otro lado, se ha generado el resto del grafo.
Ahora bien, he pintado también el indegree de cada nodo (lo siento no sé cómo es en español). Esto básicamente dice cuántos nodos apuntan a un nodo, esto se ha pintado desde un morado/azul a un amarillo. Al final esto nos dice qué posts han tenido más citas, y que por lo tanto más han podido ramificar la expansión del grafo. Como veis hay dos posts en amarillo, que son los que más flechitas tienen.
También fijaos un poco que hay como dos lados que se forman desde el punto amarillo que está más cerca del origen. Una parte como hacia arriba y otra hacia abajo. El trend al final ha cogido estos dos caminos distintos.
También he puesto el "camino más largo" que se forma (los nodos tienen como el borde rosita), que en este caso son 25 posts, aunque la verdad es que podrÃa bastante más. Y asà como curiosidad, yo formo parte de ese camino, siendo el post número 24~holaaa.
Otros ejemplos
Al final cada trend se va a compartir de una forma u otra, muchas veces será el post original el que más engagement tenga y el que directamente ramifique todo.

Hay casos de estructuras con muchÃsimos más posts, tipo esta, que la raÃz sà que tuvo bastante citados (para lo que es BlueSky), pero no fue lo que detonó el trend como tal.

Otros posts lo mismo sà que consiguen una cadena larga de gente citando a otra, pero no hay realmente mucho crecimiento porque poca gente cita cada post:

Crecimiento respecto al tiempo
Una parte muy relevante es, cómo de rápido aparecen y se expanden estos trends por las feeds. Pongamos el ejemplo del trend de la mochila.
Realmente esto por limitaciones lo subo como un GIF, pero creo que se ve bien, pone justo la hora arriba y se repite.

Al final este crecimiento es algo curioso, porque parece que crece, se estanca, crece muchÃsimo, y se vuelve a estancar creciendo muy poco a poco. Sin embargo, esto no tiene por qué ser generalmente asà siempre.
Hay otros crecimientos que son mucho más interesantes, tipo el siguiente:

SÃ, el vÃdeo está bien. Al parecer el post este se publicó el 17 de octubre, pero hasta mediados de noviembre no tuvo citados. Bueno, me imagino que alguien le dio por usar el buscador para buscar este trend (era uno de los que puse arriba).
Hay otros que realmente sà que parece que se expanden más regularmente, pero luego sà que se van expandiendo más hacia otros lados.

Conclusiones y What's next?
Realmente el tema de los trends como crecen y cómo se expanden parece interesante ¿es útil?, pues creo que para este tipo de tuits no mucho, pero al menos me he entretenido un poco haciendo esto.
Lo que haré después, pues ahora mismo no sé, pero me gustarÃa seguir viendo cosas del estilo y aplicar grafos a redes sociales, asà que lo mismo el siguiente post también hago cosas de BlueSky 🦋.