Как да наблюдавате ключовите думи в Reddit с Golang?

Мониторингът на ключовите думи, които се споменават в публикациите и коментарите в Reddit, може да бъде много полезен, за да следите марката си, продуктите си, конкурентите си, да сте информирани за конкретни теми... Go е чудесен език за такива приложения за социално слушане. В тази статия ще видим как да напишем проста програма на Go, която следи ключови думи в Reddit.

Монитор Reddit с Golang

Слушане на социалните медии в Reddit

Социалното слушане в Reddit е изключително мощен инструмент както за отделни хора, така и за организации с различни цели. Ето няколко причини, поради които то е особено важно:

Как да наблюдавате конкретни ключови думи в Reddit?

Reddit разкрива няколко безплатни крайни точки на API, които ви позволяват да получавате всеки нов пост или коментар, направен в платформата. Тези крайни точки не са много добре документирани.

За да получите последните 100 публикации в Reddit, трябва да направите GET HTTP заявка към следната крайна точка на API: https://www.reddit.com/r/all/new/.json?limit=100

За да получите последните 100 коментара в Reddit, трябва да направите GET HTTP заявка към следната крайна точка на API: https://www.reddit.com/r/all/comments/.json?limit=100

Отговорът на тези крайни точки на API е JSON обект, който съдържа списък с публикации или коментари.

Ето един (съкратен) пример за отговор, който получавам при заявка за крайната точка за публикации:

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

Както можете да видите, Reddit връща масив от обекти. Всеки обект е публикация или коментар (в зависимост от крайната точка, която сте поискали), който съдържа изчерпателни данни като съдържанието на подаването, URL адреса на подаването, датата и часа на създаване и т.н. Повечето от тях няма да са полезни, а "selftext" е несъмнено най-важният елемент, тъй като съдържа съдържанието на поста или коментара.

Резултатите са представени в низходящ ред. Моля, имайте предвид, че не можете да поискате повече от 100 публикации или коментари едновременно.

Защо да използвате Go, за да наблюдавате Reddit в реално време?

Езикът за програмиране Go предлага няколко мощни функции, които го правят отличен избор за извличане на публикации и коментари в Reddit в реално време. Въпреки че за тази цел могат да се използват и други езици за програмиране, използването на Go има специфични предимства, особено когато става въпрос за обработка на данни в реално време. Ето защо Go се откроява:

На първо място, олекотените нишки на Go, известни като goroutines, позволяват ефективна многозадачност и едновременност. Това е особено полезно, когато извличате няколко публикации или коментари в Reddit едновременно, тъй като всяка операция по извличане може да се изпълнява в собствена goroutine.

Второ, стандартната библиотека на Go включва изчерпателен и ефективен HTTP клиент, който опростява процеса на извършване на уеб заявки. Това е от съществено значение за взаимодействието с API на Reddit за извличане на публикации и коментари. HTTP клиентът на Go поддържа контексти, което позволява прекъсване на заявките и тяхното отменяне. Това е от решаващо значение за приложенията в реално време, при които искате да гарантирате, че приложението ви ще реагира и няма да се задържи при забавени отговори.

И накрая, Go е компилиран език, което обикновено означава, че приложенията, написани на него, са бързи и имат малък отпечатък. Това е от полза за приложения в реално време, които трябва бързо да обработват големи обеми от данни. Събирачът на отпадъци на Go е проектиран да бъде ефективен и да поддържа ниска латентност, което е от решаващо значение за поддържане на производителността в сценариите за извличане на данни в реално време.

Проста програма Go, която наблюдава ключова дума в публикации в Reddit

Тук е представен план стъпка по стъпка за създаване на програма за Go, която следи ключовата дума "kwatch.io" в публикации на Go:

Ето кода 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()
    }
}

Тази програма ще извлича последните 100 нови публикации от Reddit на всяка секунда (асинхронно) и ще отпечатва в конзолата заглавието, собствения текст и перманика на всяка публикация. Можете да направите същото нещо с коментарите в Reddit, като просто промените URL адреса на крайната точка на API.

Ето няколко идеи за подобряване на тази програма:

Заключение

Мониторингът на конкретни ключови думи в Reddit е възможен благодарение на сравнително проста програма Go.

Производството на такава програма обаче може да бъде предизвикателство. Първо, защото Reddit умее да ви блокира, ако правите твърде много заявки, но също така и защото техните API крайни точки връщат много публикации и коментари едновременно, което означава, че вашата Go програма трябва да обработва този голям обем интелигентно.

Ако не искате сами да изграждате и поддържате такава система, препоръчваме ви да използвате нашата платформа: регистрирайте се в KWatch.io тук.

Arthur
Отидете при разработчика на KWatch.io