5

GitHub - alexferrari88/GoHN: Hacker News API wrapper for Go

 1 year ago
source link: https://github.com/alexferrari88/GoHN
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

GoHN — Hacker News API Wrapper for Go

logo_1.svg

GoHN is a wrapper for the Hacker News API for Go, inspired by the excellent go-github library.

It facilitates the use of the API by providing a simple interface to the API endpoints.

Features rocket

  • Get the top/new/best/ask/show/job stories
  • Retrieve all comments (with metadata) for a story using goroutines to speed up the process
  • Retrieve the comments ordered as they appear in the story on the website
  • Apply filters to retrieved items (stories, comments)
  • Can be used with a custom http.Client instance (to use a proxy, for example)

Usage computer

Refer to the GoDoc for the full API reference.

Example

Refer to example/main.go for a full example on how to retrieve the top stories' IDs and the all the comments for the first one.

    // Instantiate a new client to retrieve data from the Hacker News API
    hn := gohn.NewClient(nil)

    // Use background context
    ctx := context.Background()

    // Get the top 500 stories' IDs
    topStoriesIds, _ := hn.Stories.GetTopIDs(ctx)

    var story *gohn.Item
    // Retrieve the details of the first one
    if len(topStoriesIds) > 0 && topStoriesIds[0] != nil {
        story, _ = hn.Items.Get(ctx, *topStoriesIds[0])
    }

    if story == nil {
        panic("No story found")
    }

    // Print the story's title
    fmt.Println("Title:", *story.Title)

    // Print the story's author
    fmt.Println("Author:", *story.By)

    // Print the story's score
    fmt.Println("Score:", *story.Score)

    // Print the story's URL
    fmt.Println("URL:", *story.URL)

    fmt.Println()
    fmt.Println()

    if story.Kids == nil {
        fmt.Println("No comments found")
        return
    }

    // Retrieve all the comments for that story
    // UnescapeHTML is applied to each retrieved item to unescape HTML characters

    commentsMap, err := hn.Items.FetchAllKids(ctx, story, processors.UnescapeHTML())

    if err != nil {
        panic(err)
    }
    if len(commentsMap) == 0 {
        fmt.Println("No comments found")
        return
    }

    fmt.Printf("Comments found: %d\n", len(commentsMap))
    fmt.Println()

    // Create a Story struct to hold the story and its comments
    storyWithComments := gohn.Story{
        Parent:          story,
        CommentsByIdMap: commentsMap,
    }

    // Calculate the position of each comment in the story
    storyWithComments.SetCommentsPosition()

    // Get an ordered list of comments' IDs (ordered by position)
    orderedIDs, err := storyWithComments.GetOrderedCommentsIDs()

    if err != nil {
        panic(err)
    }

    // Print the comments
    for _, id := range orderedIDs {
        comment := commentsMap[id]
        if comment.Text != nil {
            fmt.Println(*comment.Text)
            fmt.Println()
        }
    }

Semantic Versioning egg

As this library is not yet in version 1.0.0, the API may have breaking changes between minor versions.

Contributing 🤝🏼

Feel free to fork this repo and create a PR. I will review them and merge, if ok.

License memo

MIT


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK