カテゴリー
技術メモ

MatomoのAPIを利用して人気のページのURLリストを取得する

私は自分の運営しているサイトのアクセス解析にMatomoというオープンソースのアクセス解析ソフトウェアを利用しています。Google Analyticsは宗教上の理由で利用していません。

広告

つい最近、サイト内でアクセス数の多いページのリストを取得する必要があったので、MatomoのAPIを使用してこれを行いました。内部でアクセス数をカウントしたり、サーバーのログから集計、またGoogle AnalyticsのAPIを利用して同様のことをするなどの方法もありますが、Matomoでやってみたくなったので自分用に書いておきます。

まずMatomoのAPIを使うにはAPIキーが必要です。管理画面からAPIキーをメモしておきます。

ページURLのリストを取得するにはクエリに method=Actions.getPageUrls を追加します。

特定のパスから始まるURLで絞り込むには、 segment パラメータで pageUrl=^https%253A%252F%252Fexample.com%252Fsite というように指定します(=^ は前方一致。URLはエンコーディングする)。

その他のパラメータ:

  • flat: 1で結果を集約しない
  • date: 表示する日
  • format: 出力フォーマット(JSON/HTMLなど)
  • idSite: サイトのID
  • period: 期間

https://example.com/matomo/index.php?flat=1&date=yesterday&format=JSON&idSite=1&method=Actions.getPageUrls&module=API&period=day&segment=pageUrl%3D^https%253A%252F%252Fexample.com%252Fsite&token_auth=8a02****************************

出力結果はデフォルトでビジット順にソートされています。

出力結果(DomainWatchのMatomo APIから)

[
  {
    "label": "/site/ - その他",
(省略)
    "segment": "pageUrl=^https%253A%252F%252Fdomainwat.ch%252Fsite",
    "Actions_PageUrl": "/site/ - その他",
    "is_summary": true
  },
  {
    "label": "/",
(省略)
    "url": "https://domainwat.ch/",
    "Actions_PageUrl": "/",
    "segment": "pageUrl==https%253A%252F%252Fdomainwat.ch%252F"
  },
  {
    "label": "/site",
(省略)
    "url": "https://domainwat.ch/site",
    "Actions_PageUrl": "/site",
    "segment": "pageUrl==https%253A%252F%252Fdomainwat.ch%252Fsite"
  },
  {
    "label": "/whois",
(省略)
    "url": "https://domainwat.ch/whois",
    "Actions_PageUrl": "/whois",
    "segment": "pageUrl==https%253A%252F%252Fdomainwat.ch%252Fwhois"
  },
  {
    "label": "/site/nnpuma.com",
(省略)
    "url": "https://domainwat.ch/site/nnpuma.com",
    "Actions_PageUrl": "/site/nnpuma.com",
    "segment": "pageUrl==https%253A%252F%252Fdomainwat.ch%252Fsite%252Fnnpuma.com"
  },
  {
    "label": "/site/xxxabba.com",
(省略)
    "url": "https://domainwat.ch/site/xxxabba.com",
    "Actions_PageUrl": "/site/xxxabba.com",
    "segment": "pageUrl==https%253A%252F%252Fdomainwat.ch%252Fsite%252Fxxxabba.com"
  },
(省略)

 

segment で pageUrl に /site/ 以下のパスを指定しているにもかかわらず、他のパス( /whois/ など)から始まるURLが表示されていますが(しかしこれを外すと結果が変わるのでやる意味はある?)、なぜこういう仕様なのかよく分からなかったので、出力結果から更に絞り込む必要がありました。

アプリケーションへの組み込みは最終的にこうなりました。フレームワークにLaravelを使っているので、一部でそのヘルパー関数やファサードのメソッドを使っています。

use GuzzleHttp\Client;
use GuzzleHttp\Psr7;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Cache;

// 1日キャッシュする
$popular_pages = Cache::remember('popular_pages', 24 * 60 * 60, function () {
    $token_auth = '8a02****************************';
    $api_url = "https://localhost/matomo/index.php";
    $api_url .= "?flat=1&date=yesterday&format=JSON&idSite=1&method=Actions.getPageUrls&module=API&period=day";
    $api_url .= "&segment=pageUrl%3D^https%253A%252F%252Fexample.com%252Fsite&token_auth={$token_auth}";

    $client = new Client();

    try {
        $result = $client->get($api_url, [
            'headers' => ['Host' => 'example.com'],
            'verify' => false
        ]);

        if($result->getStatusCode() === 200) {
            $json = json_decode($result->getBody());

            $popular_pages = [];

            foreach($json as $object) {
                if(isset($object->url) && Str::contains($object->url, 'https://example.com/site/')) {
                    $popular_pages[] = ['url' => $object->url];

                    // 20件まで
                    if(count($popular_pages) === 20) {
                        break;
                    }
                }
            }
        }
    } catch (RequestException $e) {
        logger()->error('Matomo API Error', [
            'request' => Psr7\str($e->getRequest()),
            'response' => ($e->hasResponse() ? Psr7\str($e->getResponse()) : null)
        ]);
    }

    return $popular_pages;
});

print_r($popular_pages);
広告

投稿をシェア

記事の内容が面白いと思ったら、SNSでシェアしていただけると記事を投稿するモチベーションにつながります。

「MatomoのAPIを利用して人気のページのURLリストを取得する」への2件の返信

マトモは名前の通りちゃんとしていそうですね〜 プライバシー関係の問題もそうですが一極集中する事のリスクもありますし有名になれば良いんですがね〜

コメントを残す

メールアドレスが公開されることはありません。