Overvågning af nøgleord, der nævnes i Reddit-indlæg og -kommentarer, kan være meget nyttigt til at overvåge dit brand, dine produkter, dine konkurrenter, holde dig informeret om specifikke emner... Go er et fantastisk sprog til sådanne sociale lytteapplikationer. I denne artikel vil vi se, hvordan man skriver et simpelt Go-program, der overvåger nøgleord på Reddit.
Social listening på Reddit er et utroligt stærkt værktøj for både enkeltpersoner og organisationer på tværs af en række mål. Her er flere grunde til, at det er særligt vigtigt:
Reddit udstiller et par gratis API-slutpunkter, der giver dig mulighed for at få alle nye indlæg eller kommentarer på platformen. Disse endpoints er ikke særlig veldokumenterede.
For at få de sidste 100 Reddit-indlæg skal du lave en GET HTTP-anmodning til følgende API-endpoint: https://www.reddit.com/r/all/new/.json?limit=100
For at få de sidste 100 Reddit-kommentarer skal du lave en GET HTTP-anmodning til følgende API-slutpunkt: https://www.reddit.com/r/all/comments/.json?limit=100
Svaret fra disse API-slutpunkter er et JSON-objekt, der indeholder en liste over indlæg eller kommentarer.
Her er et (forkortet) eksempel på et svar, jeg får, når jeg anmoder om 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, returnerer Reddit et array af objekter. Hvert objekt er et indlæg eller en kommentar (afhængigt af det slutpunkt, du anmodede om), der indeholder omfattende detaljer som indholdet af indsendelsen, url for indsendelsen, oprettelsesdato og -tid osv. De fleste af dem vil ikke være nyttige, og "selftext" er utvivlsomt det vigtigste element, da det indeholder indholdet af indlægget eller kommentaren.
Resultaterne præsenteres i faldende rækkefølge. Bemærk venligst, at du ikke kan anmode om mere end 100 indlæg eller kommentarer på samme tid.
Programmeringssproget Go tilbyder flere stærke funktioner, der gør det til et fremragende valg til at hente Reddit-indlæg og -kommentarer i realtid. Selvom andre programmeringssprog også kan bruges til dette formål, er der specifikke fordele ved at bruge Go, især når det handler om databehandling i realtid. Her er, hvorfor Go skiller sig ud:
Først og fremmest giver Go's letvægtstråde, kendt som goroutines, mulighed for effektiv multitasking og samtidighed. Dette er især nyttigt, når du henter flere Reddit-indlæg eller kommentarer samtidigt, da hver hentning kan køres i sin egen goroutine.
For det andet indeholder Go's standardbibliotek en omfattende og effektiv HTTP-klient, der forenkler processen med at lave webanmodninger. Dette er vigtigt for at interagere med Reddits API for at hente indlæg og kommentarer. Go's HTTP-klient understøtter kontekster, hvilket giver mulighed for timeouts og annulleringer af forespørgsler. Dette er afgørende for realtidsapplikationer, hvor du vil sikre, at din applikation forbliver responsiv og ikke bliver hængende på forsinkede svar.
Endelig er Go et kompileret sprog, hvilket typisk betyder, at applikationer skrevet i Go er hurtige og har et lille fodaftryk. Det er en fordel for realtidsapplikationer, der skal behandle store mængder data hurtigt. Go's garbage collector er designet til at være effektiv og holde latency lav, hvilket er afgørende for at opretholde ydeevnen i realtidsdatahentningsscenarier.
Her er en trin-for-trin-plan til at lave et Go-program, der overvåger nøgleordet "kwatch.io" i Go-indlæg:
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 program henter de sidste 100 nye indlæg fra Reddit hvert sekund (asynkront) og udskriver titlen, selfteksten og permalinket for hvert indlæg til konsollen. Du kan gøre det samme med Reddit-kommentarer ved blot at ændre API-slutpunktets URL.
Her er et par ideer til, hvordan du kan forbedre dette program:
Overvågning af specifikke søgeord på Reddit er muligt takket være et ret simpelt Go-program.
Det kan dog være en udfordring at producere sådan et program. Først og fremmest fordi Reddit er gode til at blokere dig, hvis du laver for mange forespørgsler, men også fordi deres API-slutpunkter returnerer en masse indlæg og kommentarer på samme tid, hvilket betyder, at dit Go-program skal håndtere denne store mængde på en smart måde.
Hvis du ikke selv ønsker at opbygge og vedligeholde et sådant system, anbefaler vi, at du i stedet bruger vores platform: registrer dig på KWatch.io her.
Arthur
Go-udvikler KWatch.io