Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

最近リリースした積読用の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

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

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

参考にしたサイト

kira_puka
フリーのエンジニア / 今はNuxt.jsが多め / いつかFlutterをやりたい 受託開発をしながら、アプリ・Webサービス・ゲームを個人開発 Kotlin/Python/Swift/Unity/Java/Haskell/DDD
https://memory-lovers.com
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。
https://admin-guild.slack.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした