search
LoginSignup
9

More than 1 year has passed since last update.

posted at

updated at

Metabase の API を実行する

オープンソースのBIツール Metabase 使ってますか?
OSS なのでもちろん無料!
無料なのに超イケてるデータ可視化がサクッとできちゃう!
そんな Metabase を API 経由で操作できるようになったら更に活用の幅が広がりそうだと思いませんか?

Metabase そのものについては
OSSのデータ可視化ツール「Metabase」が超使いやすい - Qiita
のような良いまとめがたくさんあるのでここでは割愛し、 API の実行手順についてだけまとめました。

手順要約

Google 連携のアカウントについては後述

  1. ログイン可能なアカウントを用意する
  2. metabase-session-id を発行する
  3. API を実行する

第1引数にHTTPメソッド、第2引数にAPIのパスを与えて実行できるシェルスクリプト書きました。
https://gist.github.com/macoril/ef864d5a6a1bef237cc3f7e559568740
. ./metabase_api_exe.sh GET /api/pulse
って感じに実行する。有効なセッションがないときはセッション取得し直すとかもする。

(シェル久しぶりすぎて細かいところ忘れてて変なコードになってると思うので指摘欲しいです。
特に、L.61のcurlの実行はL.23のcurlと同じ書き方にしたかったけど、jsonが半角スペースで分けられて不要なクォーテーション付きで展開されてしまってうまく対処できなかったorz
ので解決方法を知りたい)

詳細

1. ログイン可能なアカウントを用意する

Google 連携のアカウントはちょっと面倒なのでメールアドレスとパスワードによる認証のアカウントを用意する。
この記事においては

とする。

Google 連携のアカウントについては後述

2. metabase-session-id を発行する

以下のように curl を実行すると metabase-session-id が発行される。

メールアドレスは username の値として渡すので注意。
(以前は username ではなく email だったらしい1

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{"username": "user@example.com", "password": "metapass"}' \
  http://localhost:3000/api/session 

# -> {"id":"38f4939c-ad7f-4cbe-ae54-30946daf8593"}

Postman を使う場合の Tips

Postman を使う場合は Tests に以下のコードを設定しておくと、以下の条件を満たす場合に global 変数 metabase-session-id に返ってきた値を設定しておくことができてべんり。

  • ステータスコードが 200
  • レスポンスの JSON に id というキーがある
pm.test("Set Session", function(){
    pm.response.to.be.ok
    pm.response.to.have.jsonBody("id")

    let json = JSON.parse(responseBody)
    pm.globals.set('metabase-session-id', json.id)
})

テストとして実行する必要がない場合は以下でも可

if(pm.response.to.be.ok && pm.response.to.have.jsonBody("id")){
    let json = JSON.parse(responseBody)
    pm.globals.set('metabase-session-id', json.id)
}

※Postman では以前は以下のように判定をしていてこういう書き方のナレッジが結構出てきますが、現在は deprecated なので注意。

// ステータスコードが200ならXXX
if(responseCode.code == 200){
  XXX
}
// レスポンスの JSON に id というキーがあればXXX
var data = JSON.parse(responseBody);
if(_.has(data, "id")){
  XXX
}
// グローバル変数を設定する
postman.setGlobalVariable("key", "value");

3. API を実行する

取得できた metabase-session-idX-Metabase-Session の値として設定する。

curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Metabase-Session: 38f4939c-ad7f-4cbe-ae54-30946daf8593" \
  http://localhost:3000/api/pulse

# -> [{"archived":false,"collection_position":null,"creator":{"email":"user@example.com","first_name":"user",

Google 連携のアカウントの場合の手順

Google 連携のアカウントを使いたい場合は、 metabase-session-id を発行するため Google のアクセストークンが必要となる。

  1. Google の OAuth アクセストークンを取得する。
  2. POST /api/session/ ではなく POST /api/session/google_auth を使って metabase-session-id を発行する。

参考

Metabase 関連

  • README
    • Metabase Documentation のトップ。
  • Api Documentation
    • README を API で検索して見つかったページ。しかし API 一覧ページでしか無くて、実行方法についての解説はない
  • Using the REST API · metabase/metabase Wiki
    • この文書を見つけるまでが大変で、見つけてしまえさえすればあっという間だった。ここに API の実行方法が載っている

Google 連携関連

Postman 関連

postmanのナレッジはそのうち切り出したいな

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
What you can do with signing up
9