【Python】SlackbotでGoogle Analyticsのデータを取得する

本記事は、SlackbotでGoogle AnalyticsのデータをPythonで取得する方法について説明する記事です。

SlackbotをGoogle Analyticsのデータを取得するにはGoogle APIに登録する必要があるのでやや面倒ですが、よく使う数字や期間をBotに登録しておけばいつでもワンタッチでアクセス数を確認できるようになります。

PythonでのSlackbotの基本的な実装方法は「<a href="https://se.miyabikno-jobs.com/implement-slackbot-python/" rel="noopener noreferrer" target="_blank">SlackbotをPythonで作成しよう</a>」をお読みください。

PythonでGoogle APIを取得する基本的な手順については「<a href="https://qiita.com/miyabikno/items/d6b420f94330e97834f0" rel="noopener noreferrer" target="_blank">Google Analyticsの情報をPythonで取得する</a>」をお読みください。


<h2>Google Analyticsのデータを取得方法</h2>
Google Analyticsからのデータはオブジェクトで取得できます。

データの内容や使い方は「<a href="https://developers.google.com/analytics/devguides/reporting/core/v4/basics" rel="noopener noreferrer" target="_blank">公式ドキュメントのレポート作成ページ</a>」にて説明されています。

データの取得はreports().batchGet（）メソッドで行います。
取得するデータは以下のようなフォーマットで指定します。

<pre class="lang:default decode:true " >
analytics.reports().batchGet(
    body={
        'reportRequests': [
            {
                'viewId': self.VIEW_ID,
                # 期間を指定する
                'dateRanges': [{'startDate': '開始日', 'endDate': '終了日'}],
                'metrics': [
                    # ページビュー数を取得する
                    {'expression': 'ga:pageviews'},
                    # セッション数を取得する
                    {'expression': 'ga:sessions'}
                ],
            }]
    }
).execute()
</pre> 

「dateRanges」の「startDate」で「endDate」で開始日と終了日を指定できます。
「metrics」に取得したいデータを指定します。

実装方法
・Pythonの情報を取得する処理

 
<pre class="lang:default decode:true " >

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
from slackbot.bot import respond_to

# Analyticsデータの取得クラス
class HelloAnalytics:

    def __init__(self, scopes, key_file_location, view_id):
        self.SCOPES = scopes
        self.KEY_FILE_LOCATION = key_file_location
        self.VIEW_ID = view_id
        self.startDate = '7daysAgo'
        self.endDate = 'today'

    # レポートの初期化
    def initialize_analyticsreporting(self):
        credentials = ServiceAccountCredentials.from_json_keyfile_name(
            self.KEY_FILE_LOCATION, self.SCOPES)

        # Build the service object.
        analytics = build('analyticsreporting', 'v4', credentials=credentials)

        return analytics

    # レポートを取得する
    def get_report(self, analytics):
        return analytics.reports().batchGet(
            body={
                'reportRequests': [
                    {
                        'viewId': self.VIEW_ID,
                        'dateRanges': [{'startDate': self.startDate, 'endDate': self.endDate}],
                        'metrics': [
                            {'expression': 'ga:pageviews'},
                            {'expression': 'ga:sessions'}
                        ],
                        # 'dimensions': [{"name": "ga:pageTitle"}]
                    }]
            }
        ).execute()

    # アクセスの取得処理
    def report_access(self, response):
        reports = []
        # データを取得してレポートに格納する
        for report in response.get('reports', []):
            columnHeader = report.get('columnHeader', {})
            dimensionHeaders = columnHeader.get('dimensions', [])
            metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])

            for row in report.get('data', {}).get('rows', []):
                dimensions = row.get('dimensions', [])
                dateRangeValues = row.get('metrics', [])

                for header, dimension in zip(dimensionHeaders, dimensions):
                    reports.append(header + ': ' + dimension)

                for i, values in enumerate(dateRangeValues):
                    reports.append('Date range: ' + str(i))
                    for metricHeader, value in zip(metricHeaders, values.get('values')):
                        reports.append(metricHeader.get('name') + ': ' + value)
        return reports

# Botの応答
@respond_to('^アクセスチェック$')
def access_check(message):
    # パラメータを設定
    SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
    KEY_FILE_LOCATION = 'client_secrets.json'
    # view idを指定する
    VIEW_ID = 'xxxxxxx' 
    
    # インスタンスを生成
    hello_analytics = HelloAnalytics(SCOPES, KEY_FILE_LOCATION, VIEW_ID)
    hello_analytics.startDate = '2018-10-01'
    # 初期化
    analytics = hello_analytics.initialize_analyticsreporting()
    # データを取得
    response = hello_analytics.get_report(analytics)
    # レポートを作成
    reports = hello_analytics.report_access(response)
    message.send('\n'.join(reports))
</pre> 

<span class="text_bolder">◆実行例</span>
<img src="https://se.miyabikno-jobs.com/bot-labo/wp-content/uploads/2019/03/google_analytics5.png" alt="analyticsデータの取得例" width="500" class="alignnone size-full wp-image-1682" />

以上、SlackbotでGoogle Analyticsのデータを取得する方法でした。

###◆ブログ：[miyabino.py(みやびのどっとぴーわい)](https://se.miyabikno-jobs.com/)関連記事
<a href="https://se.miyabikno-jobs.com/implement-slackbot-python/">SlackbotをPythonで作成しよう</a>
<a href="https://se.miyabikno-jobs.com/manage-slackbot-todoist/">SlackbotでTodoistの予定を確認する</a>
<a href="https://se.miyabikno-jobs.com/ganalytics-python/" rel="noopener noreferrer" target="_blank">Google Analyticsの情報をPythonで取得する</a>

Slackbot+PythonまとめTOP＞＞<a href="https://se.miyabikno-jobs.com/slackbot-manual-python/">Slackbotの構築マニュアル〜Python編〜</a>