Kako spremljati ključne besede na Redditu z Golangom?

Spremljanje ključnih besed, ki so omenjene v objavah in komentarjih na Redditu, je lahko zelo koristno za spremljanje vaše blagovne znamke, izdelkov, konkurence, obveščanje o določenih temah... Go je odličen jezik za takšne aplikacije za poslušanje družabnih omrežij. V tem članku si bomo ogledali, kako napisati preprost program v Go, ki spremlja ključne besede na Redditu.

Spremljajte Reddit z Golangom

Poslušanje družbenih medijev na Redditu

Družabno poslušanje na Redditu je izjemno učinkovito orodje za posameznike in organizacije z različnimi cilji. Tukaj je nekaj razlogov, zakaj je še posebej pomembno:

Kako spremljati določene ključne besede na Redditu?

Reddit razkriva nekaj brezplačnih končnih točk API, ki vam omogočajo pridobivanje vseh novih objav ali komentarjev v platformi. Te končne točke niso dobro dokumentirane.

Če želite pridobiti zadnjih 100 objav v Redditu, morate opraviti zahtevo GET HTTP na naslednjo končno točko API: https://www.reddit.com/r/all/new/.json?limit=100

Če želite pridobiti zadnjih 100 komentarjev Reddit, morate opraviti zahtevo GET HTTP na naslednjo končno točko API: https://www.reddit.com/r/all/comments/.json?limit=100

Odziv teh končnih točk API je objekt JSON, ki vsebuje seznam objav ali komentarjev.

Tukaj je (okrnjen) primer odgovora, ki ga dobim, ko zahtevam končno točko za objave:

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

Kot lahko vidite, Reddit vrne polje predmetov. Vsak predmet je objava ali komentar (odvisno od zahtevane končne točke), ki vsebuje izčrpne podrobnosti, kot so vsebina prijave, url prijave, datum in čas ustvarjanja itd. Večina od njih ne bo uporabna, "lastno besedilo" pa je nedvomno najpomembnejši element, saj vsebuje vsebino objave ali komentarja.

Rezultati so predstavljeni v padajočem vrstnem redu. Upoštevajte, da ne morete zahtevati več kot 100 objav ali komentarjev hkrati.

Zakaj uporabljati Go za spremljanje Reddita v realnem času?

Programski jezik Go ponuja več zmogljivih funkcij, zaradi katerih je odlična izbira za iskanje objav in komentarjev v Redditu v realnem času. Čeprav lahko v ta namen uporabljate tudi druge programske jezike, ima uporaba Go posebne prednosti, zlasti pri obdelavi podatkov v realnem času. V nadaljevanju predstavljamo, zakaj Go izstopa:

Prvič, Gojeve lahke niti, znane kot goroutine, omogočajo učinkovito večopravilnost in sočasnost. To je še posebej uporabno, ko hkrati pobiramo več objav ali komentarjev v Redditu, saj se lahko vsaka operacija pobiranja izvede v svojem goroutinu.

Drugič, standardna knjižnica Go vključuje obsežen in učinkovit odjemalec HTTP, ki poenostavi postopek izvajanja spletnih zahtevkov. To je bistvenega pomena za interakcijo z Redditovim API za pridobivanje objav in komentarjev. Gojev odjemalec HTTP podpira kontekste, kar omogoča časovno omejitev in preklic zahtevka. To je ključnega pomena za aplikacije v realnem času, pri katerih želite zagotoviti, da se vaša aplikacija še naprej odziva in da se ne zadržuje zaradi zapoznelih odgovorov.

Go je sestavljen jezik, kar običajno pomeni, da so aplikacije, napisane v njem, hitre in imajo majhen odtis. To je koristno za aplikacije v realnem času, ki morajo hitro obdelati velike količine podatkov. Zbiralnik odpadkov v Go je zasnovan tako, da je učinkovit in ohranja nizko zakasnitev, kar je ključno za ohranjanje zmogljivosti v scenarijih pridobivanja podatkov v realnem času.

Preprost program Go, ki opazuje ključno besedo v objavah Reddit

Tukaj je načrt po korakih za izdelavo programa Go, ki spremlja ključno besedo "kwatch.io" v objavah Go:

Tukaj je koda 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()
    }
}

Ta program bo vsako sekundo (asinhrono) pobral zadnjih 100 novih objav iz Reddita in v konzolo izpisal naslov, lastno besedilo in permalink vsake objave. Enako lahko storite s komentarji Reddit, če preprosto spremenite URL končne točke API.

Tukaj je nekaj idej, kako bi lahko izboljšali ta program:

Zaključek

Spremljanje določenih ključnih besed na Redditu je mogoče s precej preprostim programom Go.

Produkcija takega programa je lahko zahtevna. Najprej zato, ker vas Reddit dobro blokira, če oddate preveč zahtevkov, pa tudi zato, ker njihove končne točke API vračajo veliko objav in komentarjev hkrati, kar pomeni, da mora vaš program Go pametno obravnavati to veliko količino.

Če takšnega sistema ne želite sami vzpostaviti in vzdrževati, vam priporočamo, da namesto tega uporabite našo platformo: registrirajte se na KWatch.io tukaj.

Arthur
Go Razvijalec KWatch.io