RustでRSS feedを取得するサンプルを書いていく。
サンプルとしてはてなブックマークのテクノロジーページのrss feedを取得する。
RSSの取得にはその名もスバリ rss
というクレートを利用していく。
また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
という構造体に一つ一つ格納して、あとはループでこれらをコンソール上に表示させているだけとなる。
だいぶ書き捨て感のあるコードになっていると思うが、ひとまずこれでやりたいことは実現できた。
実行すると下記のように無骨にコンソールに表示されていく。
実際に作成したものはGitHubにあげている。
とりあえず少しでもRustに慣れていくために、なるべくRustに触れている時間を増やしたいと考えている今日このごろ。
まあ、でもあまり力入れすぎると自分の場合一気に燃え尽きしてしまうこともあるので、程々を心がけてやっていこう。