[個人開発]Notion APIを叩いて日本酒(のリスト)をデータベースに注ぎ込んでみた

この記事は [Wano Group Advent Calendar 2023](https://qiita.com/advent-calendar/2023/wano-group) の5日目の記事となります。

# ネタバレ
- Wanoのエンジニア合宿に行ってきたよ
- 題材は「Notionに日本酒をそそごう」にしたよ
  - 外部API（[さけのわ.com](https://muro.sakenowa.com/)）でJSONを取得して、それをNotionAPIを通してNotionDBに保存したよ
- たのしい合宿だったよ

---

# はじめに

## ごあいさつ
こんにちは！TuneCore Japanバックエンドエンジニアの @shibe_ です。
この度11月10-11日の間、Wanoのエンジニアチームで開発合宿に行ってまいりました！
そもそもどんなものが気になる方はこちらを御覧ください :dolphin: 
[大人の自由研究”で得られたもの。Wanoグループ開発合宿レポート！｜Wano Group](https://group.wano.co.jp/blog/3167/)

業務についての情報収集を行う人から麻雀の得点計算を覚えるゲームを組む人まで様々な開発が行われておりましたが、自分は
- Web上のサービスでAPIを使って取得できるテーブルをNotionに手で転写するのが面倒だなあ〜
- 一泊二日の合宿でちょうどいいボリュームの開発がしたいなあ〜
- **忘年会シーズンの話題作り、なんかないかなあ〜**

というモチベーションから
「Notionに日本酒を注ごう！」
と決意しました。


## Notionとは？
[Notion](https://www.notion.so/ja-jp)は無料で使用できるデータベース件メモ帳のようなアプリケーションで、
ページごとにテキストを入力できるほか、
- 画像や音声・動画ファイルをアップロード（容量制限あり）
- 表を作成する
- 表をデータベースにして集計したり一覧表示したりする
などなど機能を有しており、その用途は
- 家計簿
- カレンダー
- ガントチャート
- ワールドトリガーのキャラクター一覧
と枚挙にいとまがありません。
今回はその中で「データベース」を用いた機能についてお話します。

## APIとは？
あまりご存知でないかたはおられないと思いますが一応……
APIとは「Application Programming Interface」の略称で、
- 任意のアプリケーションを動かすために、別のアプリケーションから実施できる命令
- その返答
のやりとりの決め事だと思ってください。
代表的なものに[shibe.onlineが提供している柴犬 API](https://shibe.online/)なるものがあります（はじめて知りました）。
↓の記事とかわかりやすかったです。
https://www.sbbit.jp/article/cont1/62752

今回は
- NotionAPI
- [さけのわデータ](https://muro.sakenowa.com/sakenowa-data/) の.銘柄一覧

の二つを用いてNotionに大量の日本酒を注いでいます。

# 試運転をしよう 
まずは、NotionAPIを使ってデータベースに行を保存するしくみを知る必要があります。
下調べした結果、以下が必要だとわかりました。
- インテグレーションの作成
- 編集できるようにしたいDBにインテグレーションの許可
- API送信情報を作成
- API発射！

## 下準備
### インテグレーションを登録しよう
Notionインテグレーションとはなんですか？
[Notionインテグレーションのページ](https://www.notion.so/ja-jp/integrations)によると
> Notionインテグレーションは、Jira、Googleドライブ、SlackなどのツールをNotionに接続して、ワークフローを強化します。インテグレーションは、NotionのAPIを使用して構築されます。

とのことです。
外部のプログラムを用いてNotionを動かす場合、この `Notionインテグレーション` くんを通して動かすと思って良さそうです。
まずはNotionを立ち上げて設定ダイアログを開き、
`ワークスペース` -> `コネクト`タブ を選択すると、
`インテグレーションを作成または管理する` というリンクが登場します。
ここから画面上の指示にしたがって`Notionインテグレーション`を登録しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475741/974f6302-6458-b24f-f9fa-30ec1c4111b3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475741/15cce1e9-afb2-ba20-42ad-2742e395f627.png)
今回は、 `shibe_external_api` という名前にしてみました。※
このインテグレーションのKeyが表示されますので保存しておきましょう。後ほどデータベースを操作するのに必要です。

※2023.12.04に削除しましたので、ご自身のインテグレーションを用いてお楽しみください

### DBとインテグレーションを接続する
Notionの任意のページを開いたら以下の手順でデータベースと `Notionインテグレーション`を接続します。
- データベースを作成
- 作成したデータベースのページを開く
- 右上のメニューを開き、 `コネクトの追加`を選択
- さきほど作成した `Notionインテグレーション` を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475741/43fe3ee7-f8ff-ccac-9b02-1eda3a268c05.png)
今回は
- 名前
- うさぎの割合
を列に持つ、 `テスト用DB_うさぎひよこキメラ` というDBを作成してそこに設定してみました。

これで、外部から `shibe_external_api` の情報を用いて `テスト用DB_うさぎひよこキメラ` データベースを操作することができます！

### API送信情報を作成
続いてはAPIで送る情報を整えます。
NotionAPIは`HTTPプロトコル`を用いて送信することができますので、みなさまのお気に入りのAPI送信ツール（自分は[Talend API Tester](https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=ja)を好んで使っています）に必要な情報を設定していきます。



認証情報はヘッダーに、実際に操作する内容はボディに設定するようです。
今回は以下のような形になります。

エンドポイント
```
https://api.notion.com/v1/pages
```

Header
```
Authorization: Bearer [NotionインテグレーションのKey]
Notion-Version: 2022-06-28
Content-Type: application/json
```

Request Body
```
{
    "parent": {
        "type": "database_id",
        "database_id": "更新したいデータベースID"
    },
    "properties": {
        "名前": {
            "type": "title",
            "title": [
                {
                    "type": "text",
                    "text": {
                        "content": "ブロリー"
                    }
                }
            ]
        },
        "うさぎの割合": {
            "type": "number",
            "number": 0.5
        }
    }
}
```

### API発射！
準備ができたら、API送信ボタンをクリックしてみましょう。
データベースが更新されたら成功です :tada: 

## デモ1
![デモ1_1440.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475741/8e136bbd-cd7b-fdf0-0a7a-1da8ae24e353.gif)


# プログラムを動かそう
さて、基本的なしくみはわかりました。
あとは公開されているAPIから情報を取得して、NotionAPIの形式にして送信するだけです。
今回用いたAPIは[さけのわ](https://muro.sakenowa.com/)様が公開している[さけのわデータ](https://muro.sakenowa.com/sakenowa-data) より、
`銘柄一覧 (GET /brands)` APIを用いています。


## シーケンス
シーケンスは以下のようになります。

```mermaid
sequenceDiagram
actor P as Person
participant PC as 日本酒注ぐプログラム
participant NA as さけのわデータ
participant DB as Notionデータベース
P ->> PC : プログラム起動
PC ->> NA : GET https://muro.sakenowa.com/sakenowa-data/api/brands
NA -->> PC : 
PC ->> PC : データ整形
PC ->> DB: POST https://api.notion.com/v1/pages
DB -->> PC: 
PC -->> P : 

```

- さけのわ.com からデータ取得
- 取得したデータを整形
- Notionデータベースに送信！

という手順ですね。


## ソースコード
ソースコードは[こちら](https://github.com/tcj-shibe/notion_hozonn_api)で公開しています。
気になったかたはぜひ動かしてみてください。
（main関数内の変数`auth`をお手持ちのNotionインテグレーションキー に書き換えてご利用ください）

## デモ2
実行すると以下のようになります。
ドキドキ……
![日本酒リスト作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475741/115ab6da-e625-c824-cee5-538485eb38df.gif)!
ｳ,ｳｺﾞｲﾀｧ!!!（途中増えるペースが落ちるのはご愛嬌ということで……）


## 注意点
- 上記ソースコード上の`Notionインテグレーション`は削除済のため、ご自身のNotionインテグレーションでお楽しみください。
- この合宿内には「そしたらクレカの明細CSVファイルとか読み込んでNotionに吐いたらすぐインポートできるやん＾＾」とか思ってたんですがCSVファイルは直接インポートできるようです。南無。
- 他にも、[Zapier](https://www.notion.so/ja-jp/integrations/zapier)なる機能があればアプリケーション間での連携もできるそうなのでもしかしたらコーディングなしで連携できるやもですね :tada: 


# おわりに
というように、開発合宿では楽しくコーディングをさせてもらいました。
この世界には様々なAPIが存在するので、いろいろ叩いてみるとなにか発見があるかもしれません！（RPGチュートリアル終了後並感）
この記事で、より多くの魂が救われることをここで祈り続けています。

--- 
現在、Wanoグループ / TuneCore Japan では人材募集をしています。興味のある方は下記を参照してください。

Wano | [Wano Group JOBS](https://group.wano.co.jp/jobs/)
TuneCore Japan | [TuneCore Japan JOBS](https://www.tunecore.co.jp/jobs)