9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GitHub の Traffic Data を 継続的にトラッキングする

Last updated at Posted at 2020-12-16

この記事は「freeeデータに関わる人たち Advent Calendar 2020」 の、17日目の記事です。

GitHub 上でレポジトリを公開していると、日毎に「clone数」「PV数」などのTraffic データを取得することができます。

(GitHub のレポジトリメニューから [Insights] → [Traffic] と移動)

GitHubのトラッキングデータは直近2週間に限定されており「一年間を通じたTraffic」など、長期のデータを確認することはできません。

今回は、GitHubのAPIを経由して、定期的にレポジトリの Trafficデータ を取得し、継続的なデータトラッキングを行っている設定をメモがてら記述します。

(今回の記事では、個人所有のレポジトリを利用しました。)

やること

  • GitHub のREST API経由で、レポジトリの Traffic Dataを取得。
  • Google Apps Script で、スプレッドシートに日別のPV数を記録する。
  • 毎週データを取得、継続的にデータを記録していく。

手順

  • GitHub のPersonal Access Token を取得、権限設定する
  • Traffic Data を Google Apps Script で抽出
  • 定期的に実行するための設定を行う

GitHub のAPIキーを取得、権限設定する

APIを利用するための Personal Access Token を取得します。取得の方法は以下のドキュメントが詳しいです。

GitHubの右上、アカウントアイコンから [Settings] → [Developer settings] → [Personal access token]を選択。

[generate new token]をクリックして、新しいトークンを発行します。トークンがアクセスできるスコープを設定。今回取得するのは、公開レポジトリのTrafficデータなので[public_repo] だけにチェックを入れます。

APIをコールする時には、必要以上の権限を付与しないように注意。

トークンが発行されます。トークンの文字列は、発行された瞬間しか表示されません。万が一控え忘れると、再発行が必要となるので要注意。

トークンが取得できたら、curl でテストコールしてみましょう。


curl \
  -H "Accept: application/vnd.github.v3+json" \
  -H "Authorization: token ${取得したトークン文字列}" \
  https://api.github.com/repos/${GitHubのアカウント名}/${レポジトリ名}/traffic/views

PV数がJSONで返ってきたら、設定は成功しています。JSONはこんな感じ。

{
  "count": 14850,
  "uniques": 3782,
  "views": [
    {
      "timestamp": "2016-10-10T00:00:00Z",
      "count": 440,
      "uniques": 143
    },
    {
      "timestamp": "2016-10-11T00:00:00Z",
      "count": 1308,
      "uniques": 414
    },
    {
      "timestamp": "2016-10-12T00:00:00Z",
      "count": 1486,
      "uniques": 452
    },
    {
      "timestamp": "2016-10-13T00:00:00Z",
      "count": 1170,
      "uniques": 401
    },
    {
      "timestamp": "2016-10-14T00:00:00Z",
      "count": 868,
      "uniques": 266
    },
    {
      "timestamp": "2016-10-15T00:00:00Z",
      "count": 495,
      "uniques": 157
    },
    {
      "timestamp": "2016-10-16T00:00:00Z",
      "count": 524,
      "uniques": 175
    },
    {
      "timestamp": "2016-10-17T00:00:00Z",
      "count": 1263,
      "uniques": 412
    },
    {
      "timestamp": "2016-10-18T00:00:00Z",
      "count": 1402,
      "uniques": 417
    },
    {
      "timestamp": "2016-10-19T00:00:00Z",
      "count": 1394,
      "uniques": 424
    },
    {
      "timestamp": "2016-10-20T00:00:00Z",
      "count": 1492,
      "uniques": 448
    },
    {
      "timestamp": "2016-10-21T00:00:00Z",
      "count": 1153,
      "uniques": 332
    },
    {
      "timestamp": "2016-10-22T00:00:00Z",
      "count": 566,
      "uniques": 168
    },
    {
      "timestamp": "2016-10-23T00:00:00Z",
      "count": 675,
      "uniques": 184
    },
    {
      "timestamp": "2016-10-24T00:00:00Z",
      "count": 614,
      "uniques": 237
    }
  ]
}

Traffic Data を Google Apps Script で 抽出

Google スプレッドシートを準備します。
今回のユースケースでは、一行目に「timestamp」「count」「uniques」と記述。シートの名前を「PV数」と設定します。

シートの設定ができたら、[ツール] → [スクリプトエディタ] で、Google Apps Script のエディタを開きます。

スプレッドシートのシートIDを確認します。シートのURLで「d」と「edit」の文字列に挟まれている数字が、シートのIDとなります。

シートのIDが取得できたら、Google Apps Script のコードを記述します。

function getPV () {
  // シートを定義
  const mySheet = SpreadsheetApp.openById ('${シートのID}').getSheetByName ('PV数');

  // GitHub トークンをヘッダに設定
  const headers = {
    Authorization: 'token ${取得した Personal Access token}',
  };
  const options = {
    headers: headers,
  };
  // GitHub にリクエスト
  const requestUrl =
    'https://api.github.com/repos/${GitHubアカウント名}/${レポジトリ名}/traffic/views';
  const response = UrlFetchApp.fetch (requestUrl, options);
  const jsonData = JSON.parse (response);
  const rows = jsonData.views.length;
  Logger.log (jsonData);

  // Timestamp, views, Unique を書き込み
  for (let i = 0; i < rows; i++) {
    mySheet.insertRows (2, 1);
    mySheet.getRange (2, 1, 1, 1).setValue (jsonData.views[i].timestamp);
    mySheet.getRange (2, 2, 1, 1).setValue (jsonData.views[i].count);
    mySheet.getRange (2, 3, 1, 1).setValue (jsonData.views[i].uniques);
  }

  // 重複データをマージ
  let data = mySheet.getDataRange ().getValues ();
  let newData = [];
  for (var i in data) {
    let row = data[i];
    let duplicate = false;
    for (let j in newData) {
      if (row.join () == newData[j].join ()) {
        duplicate = true;
      }
    }
    if (!duplicate) {
      newData.push (row);
    }
  }
  mySheet.clearContents ();
  mySheet
    .getRange (1, 1, newData.length, newData[0].length)
    .setValues (newData);
}

コードを保存して実行します。シートへのデータ書き込みなど、実行権限を許可するメッセージが表示されるので、権限を確認・許可します。

設定が完了したら、スクリプトを実行します。問題がなければ、シートに取得したPV数が日付と共に書き込みされます。

下記は個人アカウントで公開しているレポジトリのPV数です。訪問数が少ないですねw

定期的に実行するための設定を行う

最後に、毎週でスクリプトを定期実行する設定を行います。定期実行は「トリガー」で設定します。

スクリプトエディタのメニューから [トリガー] を選択

トリガーの設定をします。[イベントのソース]は「時間主導型」、タイプは「週ベースのタイマー」 を選択。曜日と時間は適宜設定します。

トリガーを設定したら、完了です。実際にトリガーが成功したかどうかは、ログを見て確認します。

補足

毎週スクリプトを実行するたびに、過去2週間分のデータを取得します。このため、必ず1週間分のデータが重複する形になります。

今回のスクリプトでは、重複データをチェックするためのルーチンを記述。

  • 記述ずみのデータを変数「data」に格納
  • 新たに取得したデータと比較し、すでに記述済みのデータは除外
  • 新しいデータのみシートに書き込む

という処理をしています。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?