at backyard

Color my life with the chaos of trouble.

RustでRSS feedを取得する

RustでRSS feedを取得するサンプルを書いていく。
サンプルとしてはてなブックマークのテクノロジーページのrss feedを取得する。

b.hatena.ne.jp

RSSの取得にはその名もスバリ rss というクレートを利用していく。

docs.rs

またrssを取得するためにhttp requestを行うので、そのために reqwest も利用する。
なお、今回の用途的にHTTP Requestはブロッキングしてしまって問題ないので、下記のように dependencies に記載する。

[dependencies]
reqwest = { version = "0.11", features = ["blocking"] }
rss = "2.0"

以下がコード全文となる。

use rss::{Channel, Item};
use std::error::Error;

fn fetch_feed_items() -> Result<Vec<Item>, Box<dyn Error>> {
    let url = "https://b.hatena.ne.jp/hotentry/it.rss";
    let body = reqwest::blocking::get(url)?.bytes()?;

    let channel = Channel::read_from(&body[..])?;

    Ok(channel.into_items())
}

#[derive(Debug)]
struct FeedItem {
    title: String,
    link: String,
}

fn main() {
    let items = fetch_feed_items().unwrap();
    let feed_items: Vec<FeedItem> = items
        .iter()
        .map(|item| FeedItem {
            title: item.title().unwrap().to_string(),
            link: item.link().unwrap().to_string(),
        })
        .collect();

    for item in feed_items {
        println!("================");
        println!("Title: {}", item.title);
        println!("Link: {}", item.link);
    }
}

fetch_feed_items という関数がhttp requestを行いRSS feedを取得している部分となる。
channel.into_items() を用いて、feed itemの配列を取得している。

取得したitemの配列は FeedItem という構造体に一つ一つ格納して、あとはループでこれらをコンソール上に表示させているだけとなる。

だいぶ書き捨て感のあるコードになっていると思うが、ひとまずこれでやりたいことは実現できた。

実行すると下記のように無骨にコンソールに表示されていく。

f:id:shinshin86:20220323230414p:plain

実際に作成したものはGitHubにあげている。

github.com

とりあえず少しでもRustに慣れていくために、なるべくRustに触れている時間を増やしたいと考えている今日このごろ。
まあ、でもあまり力入れすぎると自分の場合一気に燃え尽きしてしまうこともあるので、程々を心がけてやっていこう。