フィードを取得する Go 言語パッケージ

公開:2020/10/03
更新:2020/10/12
2 min読了の目安(約2200字TECH技術記事

シェルスクリプトで作る Twitter bot 作成入門」を見て簡単なボットでも作ろうかと色々と調べているのだが[1],ブログ等が公開している RSS/Atom フィードを取得する構造が簡単な Go パッケージがないかとググってみたら丁度いいのがあった。

mmcdole/gofeed が優れているのは,フィードの種別に関わらず食べてくれて,統一された構造体に落とし込んでくれるところ。たとえばこんな感じ。

sample.go
package main

import (
    "fmt"
    "os"
    "time"

    "github.com/mmcdole/gofeed"
)

func main() {
    feed, err := gofeed.NewParser().ParseURL("https://zenn.dev/spiegel/feed")
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Println(feed.Title)
    fmt.Println(feed.FeedType, feed.FeedVersion)
    for _, item := range feed.Items {
        if item == nil {
            break
        }
        fmt.Println(item.Title)
        fmt.Println("\t->", item.Link)
        fmt.Println("\t->", item.PublishedParsed.Format(time.RFC3339))
    }
}

このコードの実行結果はこんな感じになる。

$ go run sample.go 
Spiegelさんのフィード
rss 2.0
GitHub Actions で Go パッケージの CI 作業を一通り行う
        -> https://zenn.dev/spiegel/articles/20200929-using-golangci-lint-action
        -> 2020-09-29T10:27:34Z
errors.Is, errors.As は(単なる)比較関数ではない
        -> https://zenn.dev/spiegel/articles/20200926-error-handling-with-golang
        -> 2020-09-26T06:54:49Z
...

標準の context パッケージにも対応してて,たとえば並行処理(goroutine)下で

ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
defer cancel()
feed, err := gofeed.NewParser().ParseURLWithContext("https://zenn.dev/spiegel/feed", ctx)
if err != nil {
    return
}
...

みたいにキャンセル・イベントを絡めて書くこともできるらしい。

よしよし。使えそうだな。

参考

脚注
  1. いや Twitter にブログ更新情報等を流し込むのに IFTTT を使ってるんだけど,ほとんど使ってないのにアップグレードして金払えって五月蝿くってさぁ。ほぼ毎日メールを投げてくるの。スパムなサービスはお断りだよ。 ↩︎