"Reddit" įrašuose ir komentaruose minimų raktažodžių stebėjimas gali būti labai naudingas siekiant stebėti savo prekės ženklą, produktus, konkurentus, būti informuotiems apie konkrečias temas... Go yra puiki kalba tokioms socialinio klausymosi programoms. Šiame straipsnyje pamatysime, kaip parašyti paprastą Go programą, kuri stebi raktinius žodžius "Reddit".
"Reddit" socialinis klausymasis yra neįtikėtinai galingas įrankis tiek asmenims, tiek organizacijoms, siekiančioms įvairių tikslų. Štai kelios priežastys, kodėl jis ypač svarbus:
"Reddit" atskleidžia keletą nemokamų API galinių taškų, per kuriuos galite gauti kiekvieną naują platformoje paskelbtą įrašą ar komentarą. Šie galiniai taškai nėra labai gerai dokumentuoti.
Norėdami gauti 100 paskutinių "Reddit" įrašų, turėtumėte atlikti GET HTTP užklausą į šį API galinį tašką: https://www.reddit.com/r/all/new/.json?limit=100
Norėdami gauti paskutinius 100 "Reddit" komentarų, turėtumėte atlikti GET HTTP užklausą į šį API galinį tašką: https://www.reddit.com/r/all/comments/.json?limit=100
Šių API galinių taškų atsakas yra JSON objektas, kuriame pateikiamas pranešimų arba komentarų sąrašas.
Čia pateikiamas (sutrumpintas) atsakymo pavyzdys, kurį gaunu, kai užklausiu pranešimų galinį tašką:
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
}
},
[...]
]
}
}
Kaip matote, "Reddit" grąžina objektų masyvą. Kiekvienas objektas yra įrašas arba komentaras (priklausomai nuo to, kokio galinio taško prašėte), kuriame pateikiama išsami informacija, pavyzdžiui, pateikimo turinys, pateikimo url, sukūrimo data ir laikas ir t. t. Dauguma jų nebus naudingos, o "savirašis" neabejotinai yra svarbiausias elementas, nes jame pateikiamas įrašo arba komentaro turinys.
Rezultatai pateikiami mažėjančia tvarka. Atkreipkite dėmesį, kad vienu metu negalima prašyti daugiau nei 100 pranešimų ar komentarų.
"Go" programavimo kalba pasižymi keliomis galingomis funkcijomis, todėl ji puikiai tinka "Reddit" įrašams ir komentarams realiuoju laiku gauti. Nors šiam tikslui galima naudoti ir kitas programavimo kalbas, "Go" turi specifinių privalumų, ypač kai reikia apdoroti duomenis realiuoju laiku. Štai kodėl Go išsiskiria iš kitų:
Visų pirma, Go lengvosios gijos, vadinamosios goroutines, leidžia efektyviai atlikti daug užduočių ir užtikrinti vienalaikiškumą. Tai ypač naudinga, kai vienu metu gaunate kelis "Reddit" įrašus ar komentarus, nes kiekviena gavimo operacija gali būti vykdoma atskiroje goroutine.
Antra, "Go" standartinėje bibliotekoje yra išsamus ir efektyvus HTTP klientas, kuris supaprastina žiniatinklio užklausų teikimo procesą. Tai labai svarbu sąveikaujant su "Reddit" API ir renkant įrašus bei komentarus. "Go" HTTP klientas palaiko kontekstus, todėl galima nustatyti užklausų pateikimo terminus ir atšaukti užklausas. Tai labai svarbu realaus laiko programoms, kai norite užtikrinti, kad jūsų programa išliktų operatyvi ir neužstrigtų dėl vėluojančių atsakymų.
Galiausiai, "Go" yra kompiliuojama kalba, o tai paprastai reiškia, kad "Go" parašytos programos yra greitos ir užima mažai vietos. Tai naudinga realiojo laiko programoms, kurios turi greitai apdoroti didelius duomenų kiekius. Go šiukšlių rinktuvas sukurtas taip, kad būtų efektyvus ir išlaikytų mažą uždelsimą, o tai labai svarbu norint išlaikyti našumą realaus laiko duomenų gavimo scenarijuose.
Čia pateikiamas žingsnis po žingsnio planas, kaip sukurti "Go" programą, kuri stebi raktinį žodį "kwatch.io" "Go" pranešimuose:
Čia pateikiamas "Go" kodas:
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()
}
}
Ši programa kas sekundę (asinchroniškai) iš "Reddit" paims 100 paskutinių naujų pranešimų ir į konsolę atspausdins kiekvieno įrašo pavadinimą, tekstą ir permalink. Tą patį galite padaryti ir su "Reddit" komentarais, tiesiog pakeisdami API galutinio taško URL.
Štai keletas idėjų, kaip galėtumėte patobulinti šią programą:
Stebėti konkrečius raktinius žodžius "Reddit" galima naudojant gana paprastą programą "Go".
Tačiau tokios programos kūrimas gali būti sudėtingas. Pirmiausia dėl to, kad "Reddit" gerai blokuoja jus, jei pateikiate per daug užklausų, taip pat dėl to, kad jų API galutiniai taškai vienu metu grąžina daug pranešimų ir komentarų, o tai reiškia, kad jūsų "Go" programa turi protingai tvarkyti šį didelį kiekį.
Jei nenorite patys kurti ir prižiūrėti tokios sistemos, rekomenduojame naudotis mūsų platforma: užsiregistruoti KWatch.io čia.
Arthur
Eikite į kūrėją KWatch.io