¿Cómo monitorizar palabras clave en Reddit con Golang?

Monitorizar las palabras clave que se mencionan en los posts y comentarios de Reddit puede ser muy útil para monitorizar tu marca, tus productos, tus competidores, mantenerte informado sobre temas específicos... Go es un gran lenguaje para este tipo de aplicaciones de escucha social. En este artículo, veremos cómo escribir un sencillo programa Go que monitoriza palabras clave en Reddit.

Monitorizar Reddit con Golang

Escucha de redes sociales en Reddit

La escucha social en Reddit es una herramienta increíblemente poderosa tanto para individuos como para organizaciones en toda una gama de objetivos. He aquí varias razones por las que es especialmente importante:

¿Cómo monitorizar palabras clave específicas en Reddit?

Reddit expone un par de puntos finales de API gratuitos que te permiten obtener todas las nuevas publicaciones o comentarios realizados en la plataforma. Estos puntos finales no están muy bien documentados.

Para obtener las últimas 100 publicaciones de Reddit, debe realizar una solicitud GET HTTP al siguiente punto final de la API: https://www.reddit.com/r/all/new/.json?limit=100

Para obtener los últimos 100 comentarios de Reddit, debe realizar una solicitud GET HTTP al siguiente punto final de la API: https://www.reddit.com/r/all/comments/.json?limit=100

La respuesta de estos puntos finales de la API es un objeto JSON que contiene una lista de entradas o comentarios.

Aquí hay un ejemplo (truncado) de una respuesta que estoy recibiendo cuando se solicita el punto final posts:

curl https://www.reddit.com/r/all/new/.json?limit=100

{
"kind": "Listing",
"data": {
    "after": "t3_1asad4n",
    "dist": 100,
    "modhash": "ne8fi0fr55b56b8a75f8075df95fa2f03951cb5812b0f9660d",
    "geo_filter": "",
    "children": [
        {
            "kind": "t3",
            "data": {
                "approved_at_utc": null,
                "subreddit": "GunAccessoriesForSale",
                "selftext": "Morning gents. I\u2019m looking to snag up your forgotten factory yellow spring for the 509T. I need to source one for a buddy who lost his and I cannot find any available anywhere! \n\nIf one of you have the yellow spring laying around, looking to pay $50 shipped\u2026 \n\nTo my 509t owners, it\u2019s the \u201clight\u201d spring that comes in a plastic bag in the carrying case. \n\nThanks in advance  ",
                "author_fullname": "t2_2ezh71n6",
                "saved": false,
                "mod_reason_title": null,
                "gilded": 0,
                "clicked": false,
                "title": "[WTB] 509T yellow spring",
                "link_flair_richtext": [],
                "subreddit_name_prefixed": "r/GunAccessoriesForSale",
                [...]
                "contest_mode": false,
                "mod_reports": [],
                "author_patreon_flair": false,
                "author_flair_text_color": "dark",
                "permalink": "/r/GunAccessoriesForSale/comments/1asadbj/wtb_509t_yellow_spring/",
                "parent_whitelist_status": null,
                "stickied": false,
                "url": "https://www.reddit.com/r/GunAccessoriesForSale/comments/1asadbj/wtb_509t_yellow_spring/",
                "subreddit_subscribers": 182613,
                "created_utc": 1708094934.0,
                "num_crossposts": 0,
                "media": null,
                "is_video": false
                }
            },
        [...]
        ]
    }
}

Como puedes ver, Reddit devuelve un array de objetos. Cada objeto es un post o un comentario (dependiendo del endpoint que hayas solicitado) que contiene detalles exhaustivos como el contenido del envío, url del envío, fecha y hora de creación, etc. La mayoría de ellos no serán útiles, y "selftext" es sin duda el elemento más importante ya que contiene el contenido del post o comentario.

Los resultados se presentan en orden descendente. Tenga en cuenta que no puede solicitar más de 100 entradas o comentarios al mismo tiempo.

¿Por qué usar Go para monitorizar Reddit en tiempo real?

El lenguaje de programación Go ofrece varias características potentes que lo convierten en una excelente opción para recuperar las publicaciones y comentarios de Reddit en tiempo real. Aunque también se pueden utilizar otros lenguajes de programación para este fin, el uso de Go presenta ventajas específicas, especialmente cuando se trata de procesar datos en tiempo real. He aquí por qué Go destaca:

En primer lugar, los hilos ligeros de Go, conocidos como goroutines, permiten una multitarea y concurrencia eficientes. Esto es particularmente útil cuando estás obteniendo varias publicaciones o comentarios de Reddit simultáneamente, ya que cada operación de obtención se puede ejecutar en su propia goroutine.

En segundo lugar, la biblioteca estándar de Go incluye un cliente HTTP completo y eficiente que simplifica el proceso de realizar peticiones web. Esto es esencial para interactuar con la API de Reddit para obtener publicaciones y comentarios. El cliente HTTP de Go soporta contextos, permitiendo tiempos de espera y cancelaciones. Esto es crítico para aplicaciones en tiempo real en las que quieres asegurarte de que tu aplicación sigue respondiendo y no se queda colgada con respuestas retrasadas.

Por último, Go es un lenguaje compilado, lo que significa que las aplicaciones escritas en Go son rápidas y ocupan poco espacio. Esto es beneficioso para las aplicaciones en tiempo real que necesitan procesar grandes volúmenes de datos con rapidez. El recolector de basura de Go está diseñado para ser eficiente y mantener baja la latencia, lo que es crucial para mantener el rendimiento en escenarios de obtención de datos en tiempo real.

Un sencillo programa Go que vigila una palabra clave en las publicaciones de Reddit

Aquí tienes un plan paso a paso sobre cómo hacer un programa Go que monitorice la palabra clave "kwatch.io" en los mensajes Go:

Aquí está el código Go:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "time"
)

type Post struct {
    Selftext  string `json:"selftext"`
    Title     string `json:"title"`
    Permalink string `json:"permalink"`
}

type Data struct {
    Children []struct {
        Data Post `json:"data"`
    } `json:"children"`
}

type Response struct {
    Data Data `json:"data"`
}

func fetchPosts() {
    resp, err := http.Get("https://www.reddit.com/r/all/new/.json?limit=100")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()

    var r Response
    err = json.NewDecoder(resp.Body).Decode(&r)
    if err != nil {
        fmt.Println(err)
        return
    }

    for _, child := range r.Data.Children {
        if strings.Contains(child.Data.Title, "kwatch.io") || strings.Contains(child.Data.Selftext, "kwatch.io") {
            fmt.Println("Title:", child.Data.Title)
            fmt.Println("Selftext:", child.Data.Selftext)
            fmt.Println("Permalink:", child.Data.Permalink)
            fmt.Println()
        }
    }
}

func main() {
    ticker := time.NewTicker(1 * time.Second)
    for range ticker.C {
        fetchPosts()
    }
}

Este programa obtendrá las últimas 100 nuevas publicaciones de Reddit cada segundo (de forma asíncrona) e imprimirá el título, el autotexto y el permalink de cada publicación en la consola. Puedes hacer lo mismo con los comentarios de Reddit simplemente cambiando la URL del punto final de la API.

He aquí un par de ideas sobre cómo podría mejorar este programa:

Conclusión

Monitorizar palabras clave específicas en Reddit es posible gracias a un programa Go bastante sencillo.

Sin embargo, la producción de un programa de este tipo puede ser un reto. Primero porque Reddit es bueno bloqueándote si haces demasiadas peticiones, pero también porque sus endpoints API devuelven un montón de posts y comentarios al mismo tiempo, lo que significa que tu programa Go tiene que manejar este alto volumen de forma inteligente.

Si no desea construir y mantener un sistema de este tipo por sí mismo, le recomendamos que utilice nuestra plataforma: regístrese en KWatch.io aquí.

Arthur
Desarrollador Go KWatch.io