「TAURI」で「簡易RSSリーダー」を開発してみよう

2024年4月16日(火)
大西 武 (オオニシ タケシ)
第13回の今回は「TAURI」で「RSSフィード」を読み込んでWebページに一覧表示し、リンクのページを開くための新規ウィンドウを作成するところまでを解説します。

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)。

図3:RSSフィードの新着記事一覧

・「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」構造体のインスタンスを作成する際にコンストラクタに引数で渡します。

図4:RSSフィードの新着記事から開いたWebページ

・「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ビルダーに登録します。

【コラム】「上場企業のRSSフィード」

今回のミニサンプルを思いついたきっかけは、最近10年以上ぶりに「株」を再開し、2024年4月現在で4,000社ほどある上場企業のIR情報のニュースリリースを、一度にRSSフィードで取得してみようと考えたからです。さらにアプリを株の分析に使えるように、様々な機能を追加して作りこんで行ったらどうかと考えました。

ただ「IR RSS」でググったところ、全ての上場企業のWebサイトにRSSフィードがあるわけではないようです。まあ、その前に筆者も株のスキルを磨かなければいけませんが(汗)。

「株はマネーゲームだ」と揶揄する人がいますが、その通り株はゲームみたいなものです。株で大成功して一生遊んで暮らせるお金がある人に、株を続ける理由を聞くと「もっとハイスコアが出したいから」と言うくらいですからね。

おわりに

今回は、簡易RSSリーダーを作成しました。まだ指定したURLのRSSフィード1つを読み込んで表示するぐらいしか機能はありません。例えば、今度は皆さんご自身で「text」タイプの「input」タグでURLを入力したら、そのRSSフィードが表示されるようにするなど、ぜひ色々と試してみると良いでしょう。

著者
大西 武 (オオニシ タケシ)
1975年香川県生まれ。大阪大学経済学部経営学科中退。プログラミング入門書など30冊以上を商業出版。Microsoftで大賞やNTTドコモでグランプリなど20回以上全国区のコンテストに入賞。オリジナルの間違い探し「3Dクイズ」が全国放送のTVで約10回出題。

連載バックナンバー

開発言語技術解説
第15回

「TAURI」でデータベースを使ってみよう

2024/5/10
第15回の今回は「TAURI」でオープンソースのデータベース「SQLite3」を使用して、テーブル表に表示する解説をしていきます。
開発言語技術解説
第14回

「TAURI」で気象庁の「CSVデータ」を解析する

2024/5/1
第14回の今回は気象庁のWebサイトから指定した地域の1年間の気象データをダウンロードして「TAURI」で解析していきます。
開発言語技術解説
第13回

「TAURI」で「簡易RSSリーダー」を開発してみよう

2024/4/16
第13回の今回は「TAURI」で「RSSフィード」を読み込んでWebページに一覧表示し、リンクのページを開くための新規ウィンドウを作成するところまでを解説します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています