Instagramアカウント分析ツール - 指標の推移を自前で蓄積する
Instagramアカウントを連携し、フォロワー数や投稿数の推移を継続的に記録・可視化するツールを開発しました。APIが「現在の値」しか返さないという制約に対し、定期取得してスナップショットを蓄積することで、時系列の分析を可能にしています。
プロジェクト概要
- Instagram / Facebook アカウントのOAuth連携
- フォロワー数・投稿数などの指標を日次で記録
- 投稿データの定期同期
- 蓄積したデータの推移をダッシュボードで表示
依頼者の目指した目標と解決したい課題
SNSアカウントの運用では、「今フォロワーが何人いるか」よりも「どう増えているか」のほうが重要です。どの投稿の後に伸びたのか、施策の前後で傾向が変わったのかが分からなければ、次に何をすべきか判断できません。
ところが、Instagram の公式APIから取得できるのは基本的にその時点の値です。過去に遡ってフォロワー数の推移を取得することはできません。つまり、推移を見たければ自分で定期的に取得して貯めておくしかないという構造になっています。
管理画面上でも一定期間の指標は確認できますが、期間が限られること、複数アカウントを横断して比較しにくいこと、独自の集計や保存ができないことが課題でした。
「取れるうちに取って、自分の手元に持っておく」 ための仕組みを作ることが、このプロジェクトの目的でした。
開発したシステムの特徴
- アカウント連携:
- OAuthでアカウントを連携し、アクセストークンを保管
- 連携済みアカウントを一覧・詳細で管理
- 指標の日次スナップショット:
- フォロワー数・投稿数を日付付きで記録
- 同一アカウント・同一日付の組み合わせに一意制約を設け、取得が重複しても1日1レコードに保たれる設計
- 日付にも索引を張り、期間指定での取り出しに備える
- 投稿データの同期:
- 投稿をまとめて取得し、蓄積
- プロフィール指標より高い頻度で同期
- ダッシュボード:
- 蓄積したデータをもとに推移を表示
技術的背景
Ruby on Rails をベースに、PostgreSQL でデータを保持しています。
このシステムの中心は定期実行と冪等性です。プロフィール指標は日次、投稿データはより高い頻度で取得しており、取得処理は外部APIに依存する以上、失敗もリトライも起こります。そこで「アカウント×日付」に一意制約を置き、同じ日に何度実行されても記録が重複しない構造にしました。失敗したら単純に再実行すればよく、リカバリの手順を別途用意する必要がありません。
外部API連携で扱いが難しいのはアクセストークンです。トークンは有効期限を持ち、失効すれば取得が止まります。そのためトークンを独立したテーブルで管理し、アカウントとの関係を明示しています。連携が切れているアカウントは取得対象から外れるようにし、1アカウントの失効が全体の処理を止めないようにしました。
主キーには全テーブルで UUID を採用しています。外部サービス由来のデータを扱う都合上、連番による件数の推測を避け、将来的なデータ統合でも識別子が衝突しない設計としています。
JavaScriptのパッケージ管理には Bun を採用しました。当時としては比較的新しい選択でしたが、インストールとビルドの速さが開発時の反復速度に直結するため導入しています。
解決された問題
APIの制約上は取得できないはずの「推移」を、自前のデータとして持てるようになりました。日次のスナップショットが貯まるほど分析できる期間が伸びるため、運用を続けること自体が資産になります。
一意制約による冪等な設計により、定期実行が失敗しても再実行するだけで復旧でき、運用の手間を抑えられています。
チーム構成
- (KW) プロジェクトマネージャー
- (KW) バックエンドエンジニア
(KW) はKaito Wingsが担当
プロジェクト期間
- 要件定義 - 1ヶ月
- 開発・テスト - 2ヶ月
システム構成
- Ruby on Rails / PostgreSQL
- Instagram Graph API 連携
- 定期実行によるスナップショット取得
- Bun(JavaScriptパッケージ管理)
- Active Storage
- Docker