Ledge Tech Blog

We're the data scientists and AI engineers behind Ledge.

はてなブログのSNSリアクション数を自動で取得して可視化する方法

こんにちは。レッジのデータサイエンティストの松本です。

レッジでは、クライアント先に常駐してデータ・ドリブンな課題解決に取り組んだり、ダイナミックプライシングアルゴリズムを受託開発したり、クライアント先への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 APIGoogle Drive APIが有効化されていること
  • gcloudをローカルにインストール済みであること
  • データ出力先スプレッドシートでサービスアカウントが編集者として共有設定されていること
  • GitHubの実装コードをgit clone済みであること

取得できるSNSリアクション数

今回実装したコードでは、facebookはてなについてユーザーのリアクションを取得できます。それぞれ取得できる項目をまとめると以下になります。

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を取得できます。

*6:GCPにログインし、サービスアカウントキーjsonをダウンロードしておきます。

*7:Pub/Sub を使用して Cloud Functionsをトリガーする方法についてはこちらをご参照ください。