こんにちは。レッジのデータサイエンティストの松本です。
レッジでは、クライアント先に常駐してデータ・ドリブンな課題解決に取り組んだり、ダイナミックプライシングアルゴリズムを受託開発したり、クライアント先へのBI導入の推進など、幅広くデータ利活用に関わる業務に取り組んでいます。
さて今回は、はてなブログの投稿記事の下部に設置しているfacebookやはてな等のSNSでのリアクション数を自動で取得し、その結果を可視化する方法を紹介します。
現在、このTech Blogを継続的に運営するためにメンバーが記事を執筆するモチベーションをサポートするようなインセンティブを設計しています。 いったん、アクセス解析では一般的であるPV数や訪問者数をモニタリング指標としてはいるものの、インセンティブの基準となる指標はブログを運営目的*1に合致しているべきでしょう。
投稿記事に対する単純なPV数や訪問者数だけでは、その記事によってどれだけユーザーに影響を与えられたのかを測定できません。*2 そのため、インセンティブの基準としてユーザーの嗜好を反映しているSNSリアクション数を計測することは最適だと考えました。
今回はGCP(Google Cloud Platform)のCloud FunctionsやCloud Schedulerを使用して、はてなブログへ投稿した記事に対するユーザーのSNSリアクション数を自動取得し、スプレッドシートに結果を出力する処理を実装しています。 Cloud Functionsに関数をデプロイしたり、Cloud Schedulerにジョブを登録するスクリプトを含めた実装コードはGitHubで公開しております。
なお、本記事では実装コード自体の説明ではなく、使用方法を説明します。
アーキテクチャ
GCPのサービスを利用したアーキテクチャを紹介します。 はてなブログのSNSリアクション数*3を取得し、その結果をスプレッドシートに出力する処理をCloud Functionsで実装し、Cloud SchedulerでCloud Functionsをジョブスケジューリングしています。 また、スプレッドシートに出力した結果はData Studioで可視化しています。 以下がアーキテクチャ図になります。
前提
以下を前提とします。
- GCPでプロジェクトが作成済みであること
- Google Sheet APIとGoogle Drive APIが有効化されていること
gcloud
をローカルにインストール済みであること- データ出力先スプレッドシートでサービスアカウントが編集者として共有設定されていること
- GitHubの実装コードを
git clone
済みであること
取得できるSNSリアクション数
今回実装したコードでは、facebookとはてなについてユーザーのリアクションを取得できます。それぞれ取得できる項目をまとめると以下になります。
投稿記事に対するfacebookでのユーザーのリアクションは、facebook graph APIで取得できます。 取得できる項目は以下になります。 詳しくは公式ドキュメントをご参照ください。
プロパティ名 | 内容 | 型 |
---|---|---|
comment_count | 対象URLへのコメント数 | int |
comment_plugin_count | Comments Pluginで収集されたコメント数 | int |
reaction_count | URLへのリアクション数 | int |
share_count | URLがシェアされた回数 | int |
はてな
はてなブックマーク数の取得にははてなブックマーク件数取得API、スター数の取得にははてなスター取得 APIを使用します。
投稿記事に対するブックマーク数はint型で取得できますが、はてなスター取得 APIではスターに関する以下の項目を取得できます。
プロパティ名 | 内容 | 型 |
---|---|---|
name | スターをつけたユーザーのはてなID | str |
quote | スターの引用文 (無ければ空文字列) | str |
count | スターの個数を表す数値 (1個のときは省略されることがある) | int |
ここで、はてなでは投稿記事に対して1人が何度もスターを送ることが可能なので、ここでは紹介しませんがmain.py
でスター合計送信数とスター送信ユニークユーザー数の2つを算出しています。
Cloud Functions
Cloud Functionsに関数をデプロイし、はてなブログに投稿した記事のSNSリアクション数をスプレッドシートに出力するところまでを説明します。
環境変数
以下を.env
に記載します。
HATENA_ID=******** # はてなブログ管理アカウントのはてなID BLOG_ID=******** # ドメイン API_KEY=******** # はてなブログAPIキー FB_CLIENT_ID=******** # facebook developerアカウントのAPI ID FB_CLIENT_SECRET=******** # facebook developerアカウントのAPIシークレット GCP_CREDENTIAL=********.json # GCP credential SPREDSHEET_KEY=******** # 出力先spredsheet key
gcloudコマンド実行引数
Cloud Functionsへ関数をデプロイしたり、Cloud Schedulerにジョブを登録するためにgcloud
コマンドを使用します。
上記に必要なコマンド引数を.param
に記載します。
FUNCTION_NAME=******** # Cloud Functionsにデプロイする関数名 TOPIC=******** # Pub/Subのトピック名 JOB_NAME=******** # Cloud Schedulerのジョブ名 SCHEDULE=******** # Cloud Schedulerのスケジュール(cron式)
デプロイ
以下を実行することでCloud Functionsに関数をデプロイできます。
./scripts/deploy_function.sh
ちなみにscripts/deploy_function.sh
に記述したコードは以下になります。
#!/usr/bin/env bash set -eu # read command parameter . .param # read environment file env=$(cat ./.env | tr '\n' ',' | sed -e 's/,$/\n/g') gcloud functions deploy ${FUNCTION_NAME} \ --runtime python37 \ --entry-point main \ --trigger-resource ${TOPIC} \ --trigger-event google.pubsub.topic.publish \ --region asia-northeast1 \ --update-env-vars ${env} \ --allow-unauthenticated
.param
からgcloud
コマンド引数を変数に設定し、.env
に記載した環境変数を--update-env-vars
に渡せる形式に変換して変数に設定します。
また、Cloud Schedulerでジョブスケジューリングするため、Pub/Subトピックを作成してサブスクライブできるようにしています。*7
スプレッドシートへの出力確認
Cloud Functionsに登録した関数をテスト実行し、スプレッドシートに結果を出力できることを確認します。
シートが空の場合はカラムを1行目に作成した上で数値を出力し、以降は行末に追記していくようになっています。
Cloud Scheduler
Cloud Schedulerでcronジョブを設定することで、Cloud Functionsにデプロイした関数を定期実行できます。
以下を実行することでCloud Schedulerにジョブを登録できます。
./scripts/create_scheduler.sh
ちなみにscripts/create_scheduler.sh
に記述したコードは以下になります。
#!/usr/bin/env bash set -eu # read command parameter . .param gcloud scheduler jobs create pubsub ${JOB_NAME} \ --schedule "${SCHEDULE}" \ --topic ${TOPIC} \ --time-zone JST \ --message-body "{}"
--topic
でCloud Functionsで作成したPub/Subトピックを指定し、--schedule
で指定したcron式に従ってジョブがスケジューリングされます。
また、--message-body
にはペイロードを指定しますが、今回は"{}"
を指定してペイロードを空にしています。
Data Studioで可視化
スプレッドシートに出力/蓄積したデータをData Studioで可視化します。以下は可視化したサンプルです。
Data Studioは無料で使用でき、同社製品であるスプレッドシートとの連携も容易です。 なので、データ出力/蓄積先をスプレッドシートにしている場合は可視化ツールとしてData Studioの利用をオススメします。
最後に
今回は、はてなブログの投稿記事のSNSリアクション数を自動で取得して、スプレッドシートにデータを出力/蓄積し、結果をData Studioで可視化するところまでをご紹介しました。
投稿記事に対するユーザーのSNSリアクション数は、はてなブログの投稿記事の下部に設置しているボタンを確認することで把握できますが、記事数が多い場合は確認に時間がかかりますし、何よりも確認時点でのデータ(ショットデータ)しか得られません。 一方、今回紹介したように 定期的にデータを収集することで、ユーザーのSNSリアクション数が記事投稿から時間を追うごとにどのように変化していくのかを把握できる ようになります。
今後はどういった記事であればよりユーザーのSNSリアクション数を稼げるのか、また、SNSでのリアクションが長期間続くためにはどういった記事を書くべきなのかも分析していくことで、より良いインセンティブを設計できればと考えています。
*1:弊社のエンジニア、データサイエンティストの取り組みを発信し、社外の方々に広く認知されること。
*2:ユーザーが影響を受けたかどうかを記事を閲覧したユーザーのアクションによって計測したいということです。
*3:投稿記事についてユーザーがSNS上で「いいね」したりコメントしたりなど、何らかのアクションをした回数のことです。
*4:はてなブログの管理画面から、API KEYを取得できます。
*5:facebook Developerにログインし、設定画面よりAPI IDとAPI Secret Keyを取得できます。