Hur övervakar jag nyckelord på Reddit med Golang?

Att övervaka nyckelord som nämns i Reddit-inlägg och kommentarer kan vara mycket användbart för att övervaka ditt varumärke, dina produkter, dina konkurrenter, hålla dig informerad om specifika ämnen ... Go är ett utmärkt språk för sådana sociala lyssningsapplikationer. I den här artikeln ska vi se hur man skriver ett enkelt Go-program som övervakar nyckelord på Reddit.

Övervaka Reddit med Golang

Lyssna på sociala medier på Reddit

Social lyssning på Reddit är ett otroligt kraftfullt verktyg för både individer och organisationer över en rad olika mål. Här är några anledningar till varför det är särskilt viktigt:

Hur övervakar jag specifika sökord på Reddit?

Reddit exponerar ett par gratis API-slutpunkter som gör att du kan få alla nya inlägg eller kommentarer som görs på plattformen. Dessa endpoints är inte särskilt väldokumenterade.

För att få de senaste 100 Reddit-inläggen bör du göra en GET HTTP-begäran till följande API-slutpunkt: https://www.reddit.com/r/all/new/.json?limit=100

För att få de senaste 100 Reddit-kommentarerna bör du göra en GET HTTP-begäran till följande API-slutpunkt: https://www.reddit.com/r/all/comments/.json?limit=100

Svaret från dessa API-slutpunkter är ett JSON-objekt som innehåller en lista över inlägg eller kommentarer.

Här är ett (förkortat) exempel på ett svar jag får när jag begär posts endpoint:

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
                }
            },
        [...]
        ]
    }
}

Som du kan se returnerar Reddit en uppsättning objekt. Varje objekt är ett inlägg eller en kommentar (beroende på vilken endpoint du begärde) som innehåller omfattande information som innehållet i inlägget, webbadressen till inlägget, datum och tid för skapandet etc. De flesta av dem kommer inte att vara användbara, och "selftext" är utan tvekan det viktigaste elementet eftersom det innehåller innehållet i inlägget eller kommentaren.

Resultaten presenteras i fallande ordning. Observera att du inte kan begära fler än 100 inlägg eller kommentarer samtidigt.

Varför använda Go för att övervaka Reddit i realtid?

Programmeringsspråket Go har flera kraftfulla funktioner som gör det till ett utmärkt val för att hämta Reddit-inlägg och kommentarer i realtid. Även om andra programmeringsspråk också kan användas för detta ändamål finns det specifika fördelar med att använda Go, särskilt när det handlar om databehandling i realtid. Här är varför Go sticker ut:

Först och främst möjliggör Go's lättviktstrådar, så kallade goroutines, effektiv multitasking och samtidighet. Detta är särskilt användbart när du hämtar flera Reddit-inlägg eller kommentarer samtidigt, eftersom varje hämtningsoperation kan köras i sin egen goroutine.

För det andra innehåller Go:s standardbibliotek en omfattande och effektiv HTTP-klient som förenklar processen med att göra webbförfrågningar. Detta är viktigt för att interagera med Reddits API för att hämta inlägg och kommentarer. Go:s HTTP-klient stöder kontexter, vilket möjliggör timeouts och avbrytanden av förfrågningar. Detta är avgörande för realtidsapplikationer där du vill säkerställa att din applikation förblir responsiv och inte hänger upp sig på fördröjda svar.

Slutligen är Go ett kompilerat språk, vilket innebär att applikationer som skrivs i Go är snabba och har ett litet fotavtryck. Detta är en fördel för realtidsapplikationer som behöver bearbeta stora datamängder snabbt. Go:s garbage collector är utformad för att vara effektiv och hålla latensen låg, vilket är avgörande för att bibehålla prestandan i realtidsdatahämtningsscenarier.

Ett enkelt Go-program som bevakar ett nyckelord i Reddit-inlägg

Här är en steg-för-steg-plan för att skapa ett Go-program som övervakar nyckelordet "kwatch.io" i Go-inlägg:

Här är Go-koden:

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()
    }
}

Det här programmet hämtar de senaste 100 nya inläggen från Reddit varje sekund (asynkront) och skriver ut titeln, självtexten och permalänken för varje inlägg till konsolen. Du kan göra samma sak med Reddit-kommentarer genom att helt enkelt ändra API-slutpunktens URL.

Här är ett par idéer om hur du skulle kunna förbättra detta program:

Slutsats

Att övervaka specifika nyckelord på Reddit är möjligt tack vare ett ganska enkelt Go-program.

Att producera ett sådant program kan dock vara utmanande. Först och främst för att Reddit är bra på att blockera dig om du gör för många förfrågningar, men också för att deras API-slutpunkter returnerar många inlägg och kommentarer samtidigt, vilket innebär att ditt Go-program måste hantera denna höga volym på ett smart sätt.

Om du inte vill bygga och underhålla ett sådant system själv rekommenderar vi att du använder vår plattform istället: registrera dig på KWatch.io här.

Arthur
Go Utvecklare KWatch.io