何が出来るの?
Pythonで直接SQLiteを触らずに、RustのAPIを間に入れました。
Systemdで家庭内サーバーで自動化するだけならRustは重厚ですが、Node.jsのように迅速に作れ、ファイルや言語ごとに役割を明確にしました。
このプログラムはPythonファイルで指定したRSSの取得し、整形しRustのAPI経由でSQLiteに保存します。その後、SQLiteにある任意のキーワードの有無のCSVファイルを比較できるよう、添付形式でメールが届きます。
PythonとSQLiteで実装出来ますが、Rustを学ぶ目的で作りました。
使い方
1. システム起動
# Rust APIサーバー起動
cd /path/to/rss-to-me
cargo run --release #初回のみビルドします(Rustの処理系が必要です)
サーバーが http://127.0.0.1:8080 で起動します。
2. キーワード管理(システム管理者権限)
ここは任意です。現在のキーワードで問題無ければ飛ばして下さい。
# SQLite直接操作でキーワード管理
sqlite3 news_titles.db
# キーワード追加
INSERT INTO keywords (keyword) VALUES ('新しいキーワード');
# キーワード無効化
UPDATE keywords SET is_active = 0 WHERE keyword = '削除するキーワード';
# キーワード一覧確認
SELECT * FROM keywords WHERE is_active = 1;
3. Python処理実行
⚙️ 設定
Email設定(rss_sqlite_email_api_version.py)
EMAIL_CONFIG = {
'smtp_server': 'smtp.gmail.com',
'smtp_port': 587,
'email': 'your_email@gmail.com', #Gmailアカウント(送信側)
'password': 'your_app_password', #上記アプリパスワード
'to_email': 'recipient@gmail.com' #送信先
}
ターミナル
# 仮想環境でPython実行
source /path/to/venv/bin/activate
python3 rss_sqlite_email_api_version.py
deactivate
(自動化目的なので、Pythonスクリプトにハードコートする仕様です。環境変数などをお勧めします)
4. API確認(オプション)
# ヘルスチェック
curl http://127.0.0.1:8080/health
# キーワード一覧(Python用読み取り専用)
curl http://127.0.0.1:8080/api/keywords
# 最新記事(7日間)
curl "http://127.0.0.1:8080/api/news/recent?days=7"
🏗️ アーキテクチャ
設計思想
Node.js哲学 → 厳格な役割分離設計
├── Index: エントリーポイント
├── Routing: Rust API層 ← セキュリティ層・擬似サンドボックス(読み取り制御)
├── Logic: Python処理層 ← ビジネスロジック(読み取り専用)
└── Data: SQLite データ層 ← データストレージ(管理者直接操作)
権限レベル
🏛️ システム管理者: SQLite直接操作(全権限)
├── キーワード管理
├── データベース設定
└── システム設定
🔒 Rust API層: セキュリティ制御(読み取り制御)
├── データアクセス制御
├── 記事保存制御(Python用)
└── 読み取り専用API提供
🐍 Python処理層: ビジネスロジック(読み取り専用)
├── RSS収集・処理
├── キーワード読み取り
├── 記事分類・分析
└── メール送信
リポジトリ
最後までお読み下さりありがとうございます。