Como monitorar palavras-chave no Reddit com Golang?

Monitorizar as palavras-chave mencionadas nas publicações e comentários do Reddit pode ser muito útil para monitorizar a sua marca, os seus produtos, os seus concorrentes, manter-se informado sobre tópicos específicos... Go é uma óptima linguagem para este tipo de aplicações de monitorização social. Neste artigo, veremos como escrever um programa simples em Go que monitoriza palavras-chave no Reddit.

Monitorizar o Reddit com Golang

Escuta de redes sociais no Reddit

A escuta social no Reddit é uma ferramenta incrivelmente poderosa para indivíduos e organizações com uma série de objectivos. Aqui estão várias razões pelas quais é particularmente importante:

Como monitorizar palavras-chave específicas no Reddit?

O Reddit expõe um par de pontos de extremidade da API gratuitos que lhe permitem obter todas as novas mensagens ou comentários feitos na plataforma. Estes pontos de extremidade não estão muito bem documentados.

Para obter as últimas 100 publicações do Reddit, deve fazer um pedido GET HTTP para o seguinte ponto de extremidade da API: https://www.reddit.com/r/all/new/.json?limit=100

Para obter os últimos 100 comentários do Reddit, deve fazer um pedido GET HTTP para o seguinte ponto de extremidade da API: https://www.reddit.com/r/all/comments/.json?limit=100

A resposta destes pontos de extremidade da API é um objeto JSON que contém uma lista de mensagens ou comentários.

Aqui está um exemplo (truncado) de uma resposta que estou a receber quando peço o ponto final de mensagens:

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 pode ver, o Reddit devolve um conjunto de objectos. Cada objeto é uma publicação ou um comentário (dependendo do ponto de extremidade solicitado) que contém detalhes abrangentes, como o conteúdo do envio, o URL do envio, a data e a hora de criação, etc. A maior parte deles não será útil e o "selftext" é, sem dúvida, o elemento mais importante, pois contém o conteúdo da publicação ou do comentário.

Os resultados são apresentados por ordem decrescente. Tenha em atenção que não pode solicitar mais de 100 mensagens ou comentários ao mesmo tempo.

Porquê utilizar o Go para monitorizar o Reddit em tempo real?

A linguagem de programação Go oferece vários recursos poderosos que a tornam uma excelente escolha para recuperar postagens e comentários do Reddit em tempo real. Embora outras linguagens de programação também possam ser utilizadas para este fim, existem vantagens específicas na utilização da linguagem Go, especialmente quando se trata de processamento de dados em tempo real. Veja por que Go se destaca:

Primeiro de tudo, as threads leves do Go, conhecidas como goroutines, permitem multitarefa e concorrência eficientes. Isso é particularmente útil quando você está buscando vários posts ou comentários do Reddit simultaneamente, já que cada operação de busca pode ser executada em sua própria goroutine.

Em segundo lugar, a biblioteca padrão do Go inclui um cliente HTTP abrangente e eficiente que simplifica o processo de fazer solicitações na Web. Isso é essencial para interagir com a API do Reddit para buscar posts e comentários. O cliente HTTP do Go suporta contextos, permitindo timeouts e cancelamentos de pedidos. Isto é crítico para aplicações em tempo real, onde se pretende garantir que a aplicação se mantém reactiva e não fica pendurada em respostas atrasadas.

Por fim, Go é uma linguagem compilada, o que normalmente significa que as aplicações escritas em Go são rápidas e ocupam pouco espaço. Isso é benéfico para aplicativos em tempo real que precisam processar grandes volumes de dados rapidamente. O coletor de lixo do Go foi projetado para ser eficiente e manter a latência baixa, o que é crucial para manter o desempenho em cenários de busca de dados em tempo real.

Um programa Go simples que observa uma palavra-chave nas publicações do Reddit

Aqui está um plano passo-a-passo sobre como criar um programa em Go que monitoriza a palavra-chave "kwatch.io" em mensagens Go:

Aqui está o 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 vai buscar os últimos 100 novos posts do Reddit a cada segundo (de forma assíncrona) e imprime o título, o auto-texto e o permalink de cada post na consola. Você pode fazer a mesma coisa com os comentários do Reddit simplesmente alterando o URL do endpoint da API.

Seguem-se algumas ideias sobre como melhorar este programa:

Conclusão

É possível monitorizar palavras-chave específicas no Reddit graças a um programa Go bastante simples.

Produzir um programa assim pode ser um desafio. Primeiro porque o Reddit é bom em bloquear você se você fizer muitas requisições, mas também porque seus endpoints de API retornam muitos posts e comentários ao mesmo tempo, o que significa que seu programa Go tem que lidar com esse alto volume de forma inteligente.

Se não quiser construir e manter um sistema deste tipo por si próprio, recomendamos que utilize a nossa plataforma: registar-se no KWatch.io aqui.

Arthur
Desenvolvedor do Go KWatch.io