Hvordan overvåke nøkkelord på Reddit med Golang?

Overvåking av nøkkelord som nevnes i Reddit-innlegg og -kommentarer kan være svært nyttig for å overvåke merkevaren din, produktene dine, konkurrentene dine, holde deg informert om spesifikke emner ... Go er et utmerket språk for slike applikasjoner for sosial lytting. I denne artikkelen skal vi se hvordan du skriver et enkelt Go-program som overvåker nøkkelord på Reddit.

Overvåke Reddit med Golang

Lytting i sosiale medier på Reddit

Sosial lytting på Reddit er et utrolig effektivt verktøy for både enkeltpersoner og organisasjoner med en rekke ulike mål. Her er flere grunner til at det er spesielt viktig:

Hvordan overvåke spesifikke søkeord på Reddit?

Reddit tilbyr et par gratis API-sluttpunkter som lar deg få tilgang til alle nye innlegg og kommentarer på plattformen. Disse endepunktene er ikke særlig godt dokumentert.

For å få de 100 siste Reddit-innleggene bør du sende en GET HTTP-forespørsel til følgende API-endepunkt: https://www.reddit.com/r/all/new/.json?limit=100

For å få de 100 siste Reddit-kommentarene bør du sende en GET HTTP-forespørsel til følgende API-endepunkt: https://www.reddit.com/r/all/comments/.json?limit=100

Svaret fra disse API-endepunktene er et JSON-objekt som inneholder en liste over innlegg eller kommentarer.

Her er et (avkortet) eksempel på et svar jeg får når jeg ber om innleggs-endepunktet:

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 ser, returnerer Reddit en rekke objekter. Hvert objekt er et innlegg eller en kommentar (avhengig av endepunktet du ba om) som inneholder omfattende detaljer som innholdet i innlegget, url for innlegget, dato og klokkeslett for opprettelsen osv. De fleste av dem vil ikke være nyttige, og "selftext" er utvilsomt det viktigste elementet, siden det inneholder innholdet i innlegget eller kommentaren.

Resultatene presenteres i synkende rekkefølge. Vær oppmerksom på at du ikke kan be om mer enn 100 innlegg eller kommentarer samtidig.

Hvorfor bruke Go til å overvåke Reddit i sanntid?

Programmeringsspråket Go har flere kraftige funksjoner som gjør det til et utmerket valg for å hente Reddit-innlegg og -kommentarer i sanntid. Selv om andre programmeringsspråk også kan brukes til dette formålet, er det spesifikke fordeler ved å bruke Go, spesielt når det gjelder databehandling i sanntid. Her er hvorfor Go skiller seg ut:

For det første muliggjør Go's lette tråder, kjent som goroutines, effektiv multitasking og samtidighet. Dette er spesielt nyttig når du henter flere Reddit-innlegg eller -kommentarer samtidig, ettersom hver hentingsoperasjon kan kjøres i sin egen goroutine.

For det andre inneholder Go's standardbibliotek en omfattende og effektiv HTTP-klient som forenkler prosessen med å gjøre webforespørsler. Dette er avgjørende for å samhandle med Reddits API for å hente innlegg og kommentarer. Go's HTTP-klient støtter kontekster, noe som gir mulighet for tidsavbrudd og kansellering av forespørsler. Dette er avgjørende for sanntidsapplikasjoner der du ønsker å sikre at applikasjonen din forblir responsiv og ikke henger seg opp i forsinkede svar.

Til slutt er Go et kompilert språk, noe som vanligvis betyr at applikasjoner skrevet i Go er raske og har et lite fotavtrykk. Dette er en fordel for sanntidsapplikasjoner som må behandle store datamengder raskt. Go's søppelsamler er utviklet for å være effektiv og holde latenstiden lav, noe som er avgjørende for å opprettholde ytelsen i sanntidsdatahentingsscenarier.

Et enkelt Go-program som overvåker et søkeord i Reddit-innlegg

Her er en trinnvis plan for hvordan du lager et Go-program som overvåker nøkkelordet "kwatch.io" i Go-innlegg:

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

Dette programmet henter de 100 siste nye innleggene fra Reddit hvert sekund (asynkront) og skriver ut tittel, selvtekst og permalink for hvert innlegg til konsollen. Du kan gjøre det samme med Reddit-kommentarer ved å endre URL-adressen til API-endepunktet.

Her er et par ideer til hvordan du kan forbedre dette programmet:

Konklusjon

Overvåking av spesifikke søkeord på Reddit er mulig takket være et ganske enkelt Go-program.

Det kan imidlertid være utfordrende å produsere et slikt program. For det første fordi Reddit er flinke til å blokkere deg hvis du gjør for mange forespørsler, men også fordi API-endepunktene deres returnerer mange innlegg og kommentarer samtidig, noe som betyr at Go-programmet ditt må håndtere dette høye volumet på en smart måte.

Hvis du ikke ønsker å bygge og vedlikeholde et slikt system selv, anbefaler vi at du bruker vår plattform i stedet: registrer deg på KWatch.io her.

Arthur
Gå til utvikleren KWatch.io