⌨
フィードを取得する Go 言語パッケージ
「シェルスクリプトで作る 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
}
...
みたいにキャンセル・イベントを絡めて書くこともできるらしい。
よしよし。使えそうだな。
参考
-
いや Twitter にブログ更新情報等を流し込むのに IFTTT を使ってるんだけど,ほとんど使ってないのにアップグレードして金払えって五月蝿くってさぁ。ほぼ毎日メールを投げてくるの。スパムなサービスはお断りだよ。 ↩︎
Discussion