LoginSignup
8
6

More than 3 years have passed since last update.

Firebase Admin SDKで1日のAuthenticationユーザ数を集計してみた(最大5倍)

Posted at

最近リリースした積読用のWebサービスの『積読ハウマッチ』、
Qiita記事を書いた結果、たくさんの方々が登録者してくれました:tada::tada:

ちゃんと計測してみたいなと思ってたら、Firebase Admin SDKを使うと、
Firebase Authの登録日から日毎のユーザ数を集計できそうなので、試してみました!

できたグラフはこちら

こんなグラフを出したかったのです...

1日の登録者数.png

ちなみに、前の記事を書いたのが8/14で、1日トレンドが8/16なので、約5倍...うれしい...:sob:
ただ、INTERNET Watchさんやnabettuさんにも紹介いただいていたので、純粋な数字ではない...

このグラフを出すためには、こんなCSVがほしい...

日付その日の登録ユーザ数の2カラムのデータがあれば、

2019-08-11  3
2019-08-12  12
2019-08-13  46
2019-08-14  13
2019-08-15  38
2019-08-16  65
2019-08-17  18

Googleスプレッドシートでグラフを出せるので、

スクリーンショット 2019-08-18 17.46.46.png

とりあえず、これが出したいなと。。(´ω`)

ユーザ数を日毎に集計するソース

Firebase Authのユーザの一覧を取得して、集計して、
console.log()で出力するソースです!!

ローカルPCでfirebase-adminを使うときの初期設定とかはこちらを参照
- ローカルPCからfirebase-adminを使ってFirestoreを操作する(管理ツール) - くらげになりたい。

const dayjs = require("dayjs");
const admin = require("firebase-admin");

// 配置したサービスアカウントの秘密鍵を取得
const serviceAccount = require("./key/XXXXX.json");

// firebase-adminを初期化
admin.initializeApp({ credential: admin.credential.cert(serviceAccount) });

// firestoreのインスタンスを取得
const db = admin.firestore();

/**
 * Firebase Authからユーザの一覧を取得する関数。
 * 最大1000件の取得条件があるので、再起で呼び出す
 */
async function listAllUsers(users = [], nextPageToken) {
  try {
    const res = await auth.listUsers(1000, nextPageToken);
    res.users.forEach(userRecord => users.push(userRecord.toJSON()));

    if (res.pageToken) await listAllUsers(users, res.pageToken);
  } catch (error) {
    console.log("Error listing users:", error);
  }
  return users;
}

// ****************************
// * MAIN
// ****************************
async function main() {
  console.log(`***** START MAIN`);

  // Firebase Authのユーザ数を取得
  const users = await listAllUsers();

  // 日付ごとに集計
  const summary = {};
  users.forEach(userRecord => {
    const creationTime = userRecord.metadata.creationTime;
    const createAt = dayjs(creationTime).format("YYYY-MM-DD");
    if (createAt in summary) summary[createAt] = summary[createAt] + 1;
    else summary[createAt] = 1;
  });

  // 集計結果を出力
  Object.entries(summary)
    .sort((a, b) => dayjs(a[0]).diff(dayjs(b[0]))) // 日付の昇順にソート
    .forEach(([key, val]) => console.log(`${key},${val}`)); // 書き出し
  console.log(`***** END   MAIN`);
  process.exit(0); // プロセスが終了しない時があるので、exitしてます...
}

main().then();

中身的にはシンプルで、
1. Firebase Authでユーザの一覧を取得してきて
2. 日付ごとに集計
3. 集計した結果をCSV形式で出力

なお、日付の計算はdayjsを使っています。
必要に応じてnpm install dayjs --saveなどでインストールしてください!

Firebase Authではこんな情報を取得できます

res.users.forEach(userRecord => users.push(userRecord.toJSON()));

の部分のuserRecord.toJSON()では、こんな情報が取得できます。

{
  "uid": "....",
  "email": undefined,
  "emailVerified": false,
  "displayName": "めもらば@公式",
  "photoURL": "https://xxxxxx.png",
  "phoneNumber": undefined,
  "disabled": false,
  "metadata": {
    "lastSignInTime": "Tue, 06 Aug 2019 08:46:10 GMT",
    "creationTime": "Mon, 22 Jul 2019 16:24:06 GMT"
  },
  "passwordHash": undefined,
  "passwordSalt": undefined,
  "customClaims": undefined,
  "tokensValidAfterTime": "Mon, 22 Jul 2019 16:24:06 GMT",
  "providerData": [
    {
      "uid": "xxxxxx",
      "displayName": "めもらば@公式",
      "email": "xxxx@email.com",
      "photoURL": "https://xxxx.png",
      "providerId": "twitter.com",
      "phoneNumber": undefined
    }
  ]
}

いろいろできるので、ユーザ管理用にスクリプトとかを用意しておくのもよさそう(´ω`)

おわりに

以下の記事でも書いたけど、firebase-admin便利...ヽ(=´▽`=)ノ
- ローカルPCでfirebase-adminを使って一括削除/一括更新する - Qiita

ちなみに、計測した対象のサービスはこちらです♪
積読総額ランキングや人気の本などもあるので、よかったらあそんでもらえれば!!

積んでる本の総額がわかる読書管理サービス
積読ハウマッチ

参考にしたサイト

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6