RSSフィードを読み込んで表示する
RSSフィードを読み込んで表示する
ここからは、バックエンドのRustをコーディングしていきます。やろうと思えば、JavaScriptでもRSSフィードを読み込むことはできますが、TAURIの入門記事なので、あえてRustでRSSフィードを読み込みます。
読み込むRSSフィードのURLは前述したように「rssFeed」関数の引数に書きました。別のRSSフィードを試したい方はそのURLを書き換えてください。
RSSフィードを読み込むTAURIコマンド「rss_feed」関数では「reqwest」クレートでXML形式のRSSフィードをWebからデータを読み込み、そのデータを扱いやすいように「rss」クレートでJSON形式のデータ形式に変換して[新着記事のタイトル,新着記事のURL]をitems配列に「push」したものを戻り値で返します(図3)。
・「src-tauri」→「src」→「main.rs」ファイルのサンプルコード#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
// クレート
use rss::Channel;
use reqwest::blocking;
// RSSフィードを読み込むTAURIコマンド関数
#[tauri::command]
fn rss_feed(url: String) -> Vec<[String; 2]> {
let rss = blocking::get(url).unwrap();
let contents = rss.bytes().unwrap();
let channel = Channel::read_from(&contents[..]).unwrap();
let mut items = Vec::new();
for item in channel.items {
items.push([item.title.unwrap(),item.link.unwrap()]);
}
println!("{:?}",items);
items
}
// メイン関数
fn main() {
// TAURIコマンド「rss_feed」関数の登録
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![rss_feed])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
【サンプルコードの解説】
rssクレートの「Channel」構造体と「reqwest」クレートの「blocking」を読み込みます。
TAURIコマンド「rss_feed」関数の「url」引数を「get」関数で同期(blocking)してRSSフィードを読み込み、バイトデータを取得(bytesメソッド)します。
RSSフィードのチャンネルのタイトルとURLを配列にしたものを「items」配列に追加(push)します。
メイン関数でTAURIコマンド「rss_feed」関数をTAURIビルダーに登録します。
バックエンドで新規ウィンドを作成する
誰でもWebブラウザを使ったことがあるでしょうから、リンクを新規ウィンドウで開く機能があることはご存知でしょう。今回はバックエンドで新規ウィンドウを作成する機能を解説するために、あえてRustで新規にウィンドウを作成して開きます(図4)。
新たに外部のウィンドウを作るには「AppHandle」構造体のTAURIアプリの「Handle(システム内の開いているプロセスのハンドル情報)」を「WindowBuilder」構造体のインスタンスを作成する際にコンストラクタに引数で渡します。
・「src」→「main.js」ファイルのサンプルコード#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
// クレート
use tauri::WindowUrl;
use rss::Channel;
use reqwest::blocking;
// 新規ウィンドウを開くTAURIコマンド関数
#[tauri::command]
async fn new_window(app_handle: tauri::AppHandle,url: String) {
// 新規ウィンドウの作成
let window = tauri::WindowBuilder::new(
&app_handle,
"external",
WindowUrl::External(url.parse().unwrap()),
)
.build()
.unwrap();
// ウィンドウの最大化
let _ = window.maximize();
}
(中略)
// メイン関数
fn main() {
//TAURIコマンド「new_window」関数の登録
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![rss_feed,new_window])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
【サンプルコードの解説】
tauriクレートの「WindowUrl」構造体を読み込みます。
TAURIコマンド「new_window」関数の「url」引数のRSSフィードをWindowBuilder構造体のコンストラクタ(newメソッド)で外部にウィンドウを新規作成し、ウィンドウを最大化(maximize)します。
メイン関数でTAURIコマンド「new_window」関数をTAURIビルダーに登録します。
今回のミニサンプルを思いついたきっかけは、最近10年以上ぶりに「株」を再開し、2024年4月現在で4,000社ほどある上場企業のIR情報のニュースリリースを、一度にRSSフィードで取得してみようと考えたからです。さらにアプリを株の分析に使えるように、様々な機能を追加して作りこんで行ったらどうかと考えました。
ただ「IR RSS」でググったところ、全ての上場企業のWebサイトにRSSフィードがあるわけではないようです。まあ、その前に筆者も株のスキルを磨かなければいけませんが(汗)。
「株はマネーゲームだ」と揶揄する人がいますが、その通り株はゲームみたいなものです。株で大成功して一生遊んで暮らせるお金がある人に、株を続ける理由を聞くと「もっとハイスコアが出したいから」と言うくらいですからね。
おわりに
今回は、簡易RSSリーダーを作成しました。まだ指定したURLのRSSフィード1つを読み込んで表示するぐらいしか機能はありません。例えば、今度は皆さんご自身で「text」タイプの「input」タグでURLを入力したら、そのRSSフィードが表示されるようにするなど、ぜひ色々と試してみると良いでしょう。
- この記事のキーワード