Zenn
🔗

Pushbullet相当の機能をRustとFirestoreで実装する

2025/03/30に公開

はじめに

Pushbulletを長年使用していましたが、最近Chromeの拡張機能が動作しなくなりました。Chromeはこれからもメインブラウザとして使用したいので、同等の機能を自作することにしました。Pushbulletの特に気に入っていた機能は、スマホで見ていたサイトをPCに送ると、自動的にタブとして開いてくれる点です。Pushbulletの全機能を実装するのは大変なので、この特定の機能のみ実装することにしました。

アーキテクチャ

  • クライアント:

  • データベース(Firestore):

    • 共有されたURLをコレクションに保存
    • 新しいURLが追加されたときにリアルタイムで更新を提供
  • コンシューマー:

    • PC上で動作するRustプログラム
    • Firestoreの新しいURLを監視し、デフォルトブラウザで自動的に開く

実装手順

1. Firestoreのセットアップ

まず、Firestoreを設定します:

  1. Firebase Consoleで新しいプロジェクトを作成
  2. プロジェクト内にFirestore Databaseを作成
  3. 以下のセキュリティルールを設定:
rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /shared_urls/{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}
  1. メール/パスワード認証を有効化:
    • Authentication > Sign-in methodに移動
    • Email/Passwordプロバイダーを有効化
    • ユーザーアカウントを追加

2. クライアントのセットアップ

  1. Google Play StoreからHTTP Request Shortcutsをインストール
  2. アプリを開いて新しいショートカットを作成:
    • "+"ボタンをタップし、"Scripting Shortcut"を選択
    • 以下のスクリプトを設定します。スクリプト内の以下の値を実際の値に置き換えてください:
      • Project ID と Web API Key: Firebaseプロジェクトの設定から取得したプロジェクトID
      • メールアドレスとパスワード: Firestoreのセットアップ時に作成したユーザーアカウントの認証情報
// 変数
var projectId = '***************'
var apiKey = '***************************************'

// Firebaseで認証してIDトークンを取得
var authResponse = sendHttpRequest(
  'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=' + apiKey,
  {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      email: '***************@example.com',
      password: '***************',
      returnSecureToken: true,
    }),
    timeout: 10,
  }
)

// レスポンスからIDトークンを取得
var idToken = JSON.parse(authResponse.response.body).idToken

// Firestoreにデータを登録
var firestoreResponse = sendHttpRequest(
  'https://firestore.googleapis.com/v1/projects/' +
    projectId +
    '/databases/(default)/documents/shared_urls',
  {
    method: 'POST',
    headers: {
      Authorization: 'Bearer ' + idToken,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      fields: {
        url: { stringValue: getVariable('clipboard') },
        timestamp: { timestampValue: getVariable('now') },
      },
    }),
  }
)
  1. HTTP Request Shortcutsアプリで必要な変数を設定:

    • Variable Typeで"Clipboard Content"を選択し、Nameをclipboardに設定
    • Variable Typeで"Timestamp"を選択し、Nameをnowに設定(時間形式はyyyy-MM-dd'T'HH:mm:ss.SSS'Z'
  2. ショートカットをテスト:

    • ブラウザで任意のWebページを開き、共有ボタンをタップして作成したショートカットを選択
    • Firebase Consoleでshared_urlsコレクションにURLとタイムスタンプを含む新しいドキュメントが作成されることを確認

3. コンシューマーのセットアップ

  1. リポジトリをクローン:
git clone https://github.com/stucci/firestore-url-opener.git
cd firestore-url-opener
  1. README.mdの手順に従ってプログラムを設定・実行

プログラムが実行されると、共有したURLが自動的にデフォルトブラウザで開かれます。また、新しいURLを共有すると、リアルタイムで開いてくれます。

まとめ

Pushbulletの機能の一部のみですが、実装できました。Pushbulletと違い、拡張機能を使用していないので、ChromeやFirefoxだけでなく、任意のデフォルトブラウザで動作させることができます。

元記事:
https://www.satoslabo.com/blog/firestore-url-opener

GitHubで編集を提案

Discussion

ログインするとコメントできます