/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

gofeedを使ってはてなブックマークのRSSをパースする

f:id:yatta47:20210117125924p:plain

 

なぜ今更?って感じだけど、最近golangの勉強を始めました。

理由は単純で、golangに触れる機会があって、なかなか面白そうって感じたからです。

個人的に気に入っているところはバイナリ化するのが簡単なところですかね。

あと処理速度が速いというところも。Rubyでいろいろと作ってサーバで動かしているけどそれをgolangのバイナリに置き換えたらどうなるんだろう?多少は負荷落ちるかな?っていう想いもあったりします。

ってことで、よくやっているRSSをParseする処理をgolangで書いてみました。

環境

みんな大好きcloud9環境でやってます。

Goのバージョンは以下。

 $ go version
go version go1.7.3 linux/amd64

 

やっていること

やっていることは

はてなブックマークRSSを読み込んで、ブックマーク順で出力する

です。

色々調べたところ、encoding/xmlでやるやり方もあったのですが今回は検索で一番上に出てきた gofeed というライブラリを使ってやってみました。

github.com

 

ソースコード

package main

import (
    "fmt"
    gofeed "github.com/mmcdole/gofeed"
    _ "reflect"
    "sort"
    "strconv"
)

type HatenaItem struct {
    Title  string
    Link   string
    Hatebu int
}

type HatenaItems []HatenaItem

func (b HatenaItems) Len() int {
    return len(b)
}

func (b HatenaItems) Swap(i, j int) {
    b[i], b[j] = b[j], b[i]
}

func (b HatenaItems) Less(i, j int) bool {
    return b[i].Hatebu > b[j].Hatebu
}

func main() {
    url := "http://b.hatena.ne.jp/hotentry/it.rss"

    fp := gofeed.NewParser()
    feed, _ := fp.ParseURL(url)

    items := feed.Items

    var hatenaitems HatenaItems

    for _, item := range items {
        extension := item.Extensions
        hatebu := extension["hatena"]["bookmarkcount"]
        var count int
        count, _ = strconv.Atoi(hatebu[0].Value)

        var hatenaitem HatenaItem = HatenaItem{item.Title, item.Link, count}
        hatenaitems = append(hatenaitems, hatenaitem)

    }
    sort.Sort(hatenaitems)

    for _, item := range hatenaitems {
        fmt.Printf("%d - %s - %s\n", item.Hatebu, item.Title, item.Link)
    }

}

出力結果

こんな感じに出力されます。

f:id:yatta47:20170521233256p:plain

 

苦労したところ

基本、gofeedのページの通りなのですが、すんなりいかなかったところがいくつか。

 

独自タグ

RSSのタグの <hatena:bookmarkcount>XXX</hatena:bookmarkcount> をどうやってとるのかがわからなかったです。

Printで見てみたら一応保持してはいるもののそれがどこに格納されているのかがわからず、gofeedの公式ドキュメントをあさったら ext.Extensionsに入っていることがわかりました。

これに気が付くのに結構かかった・・・・

godoc.org

 

並び替え

これはまだまだ初心者だからなんですが、gofeed オブジェクトを直接並び替えの方法がわからなかった。

なので、HatenaItemsっていう構造体を自分で作って、その中に入れて並び替えをしています。

このやり方でいいのかどうか・・・変だと思ったらご指摘ください。

 

まとめ

まだまだこれからですねぇ。

とりあえずとっかかりとして今までRubyで作っていたものをgolangで書いたらどうなるのかってのからやっていこうと思っています。

今回作ったものを拡張してこれをSlackに投稿できるようにカスタマイズしようと思っています。

それではー。

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】