リバース・エンジニアリング

Flultterとテックブログと時々iOS

PythonでFirebaseのRealtime Databaseにアクセスする

個人開発でAPIのデータを作成するためにPythonでFirebaseにアクセスしたので備忘録としてソースコードをまとめます。

Firebaseのデータベースについて

もう説明不要なくらいに有名になったFirebaseさんですが、今の所2種類のデータベースがありますので 簡単に説明します。 これらのデータベースの説明はネットで検索すればたくさんの情報が得られます。

Firebase Realtime Database

データをNoSQL データベースに保存することができて、複数のユーザーで同期することができるデータベース。 オフラインでは端末のローカルのキャッシュに保存され、オンラインになったタイミングで同期される。

Cloud Firestore

Firebase Realtime Database と似たNoSQL データベース。 上述のFirebase Realtime Databaseと同じような感じ。

今回はこちらのデータベースにアクセスしますが、今後は後述するCloud Firestoreがメジャーになるような感じらしいです。

firebase-admin のインストール

pythonでFirebaseの操作を便利にできるfirebase-adminをpipコマンドでインストールします。

pip3 install firebase-admin

Firebaseにアクセスする

qiita.com

これを参考にしてソースコードを作成する

基本形

import firebase_admin
from firebase_admin import credentials
from firebase_admin import db

cred = credentials.Certificate('./[サービスアカウントの秘密鍵のjsonファイル名]')

firebase_admin.initialize_app(cred, {
    'databaseURL': 'https://[Firebase のDatabaseのURL]',
    'databaseAuthVariableOverride': {
        'uid': 'my-service-worker'
    }
})

サービスアカウントの秘密鍵jsonファイル名 の取得方法

Firebaseにアクセスします。

https://console.firebase.google.com/

プロジェクトがなければ新しく作成する。とりあえず、管理画面まで進みます。

f:id:qed805:20200211174328p:plain
管理画面

f:id:qed805:20200211174409p:plain
設定画面

設定画面の「プロジェクトの設定」を選択する

リソースのロケーションが聞かれるときがあると思うので東京リージョンの「asia-northeast1」を選択する。

f:id:qed805:20200211174537p:plain
サービスアカウントのタブを選択する

pythonを選択して、「新しい秘密鍵を生成する」ボタンをタップする。

f:id:qed805:20200211174715p:plain
新しい秘密鍵を生成する

タップするとjsonファイルをダウンロードできる。 このjsonを同じpythonファイルのディレクトリにまとめておく。 jsonファイル名が[サービスアカウントの秘密鍵のjsonファイル名]になる。

[Firebase のDatabaseのURL]は下のスクリーンショットの赤枠のURLを使う

f:id:qed805:20200211175232p:plain
FirebaseのデータベースURL

import firebase_admin
from firebase_admin import credentials
from firebase_admin import db

cred = credentials.Certificate('XXXX-firebase-adminsdk-sv1af-f0b31ee7e2.json')

firebase_admin.initialize_app(cred, {
    'databaseURL': 'https://YYYY.firebaseio.com/',
    'databaseAuthVariableOverride': {
        'uid': 'my-service-worker'
    }
})

XXXとYYYYにそれぞれ値をセットするとFirebaseへアクセスすることができるようになる。

questions のreferenceにアクセスする

quiz_ref = db.reference('questions')

データを保存する

    quiz_ref.child('question001').set({
        'sentence': 'This () a pen',
        'a': 'are',
        'b': 'is',
        'c': 'were',
        'd': 'was',
        'answer': 'b'
    })

これでpythonコマンドを実行するとデータを保存できます。