NotionのAPIにNode.jsからアクセスしてみるメモ #Notion


Notionを最近触っていますが、APIおよびJavaScript SDKがある模様なので触ってみました。

## インテグレーションを作成する

> https://www.notion.so/my-integrations
> ![スクリーンショット 2022-08-29 17.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/232cd59d-c2af-8fa9-cf1d-8dafebbf2825.png "スクリーンショット 2022-08-29 17.55.05.png")

名前などを適当に入れて進めてみます。試しに、`Node.jsテスト`としておきました。

> ![スクリーンショット 2022-08-29 17.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/30d8fa3c-5bfb-d30f-4cfc-aac654002fc7.png "スクリーンショット 2022-08-29 17.55.41.png")

トークンが発行されました。

> ![スクリーンショット 2022-08-29 17.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/d4bdb9af-302d-1607-0255-c67acfdbca4b.png "スクリーンショット 2022-08-29 17.56.05.png")

Notionでデータベースを作っておき、Shareからユーザーを招待的な操作をします。
このときに作った`Node.jsテスト`などの候補が出てくるので追加しましょう。

> ![スクリーンショット 2022-08-29 18.10.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/00b44f55-a53d-a00d-916e-b1ddaf0d145b.png "スクリーンショット 2022-08-29 18.10.06.png")

Google系のAPI利用をするときのサービスアカウントに近いイメージな気がします。

## SDK経由でNode.jsから触ってみる

npmに書いてある手順でSDKを触ってみます。

> https://www.npmjs.com/package/@notionhq/client
> https://github.com/makenotion/notion-sdk-js

まずはインストールから

```bash
$ npm install @notionhq/client
```

以下のコードのトークン部分を先ほど取得したトークンに書き換えます。

```js
const { Client } = require("@notionhq/client")

// Initializing a client
const main = async () => {
    const notion = new Client({
        auth: `トークンを記載`,
    })
      
    const listUsersResponse = await notion.users.list({})
    console.log(listUsersResponse)
}

main();
```

実行してみます。

```bash
$ node app.js
{
  object: 'list',
  results: [
    {
      object: 'user',
      id: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
      name: 'のびすけ 菅原',
      avatar_url: 'https://lh3.googleusercontent.com/a-/xxxxxxxxxxxxxxxxx',
      type: 'person',
      person: [Object]
    },

・
・
・省略
```

Notionに登録しているユーザー情報が取得できました！

`notion.users.list({})`のメソッドがそうみたいですね。

## データベースの値の取得

URLのこの辺りがデータベースIDらしいですね。

```
https://www.notion.so/myworkspace/a8aec43384f447ed84390e8e42c2e089?v=...
                                  |--------- Database ID --------|
```
> https://developers.notion.com/docs


こんな感じに雑に作っていたテーブル（データベース）を利用します。

> ![スクリーンショット 2022-08-29 18.19.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/0896b7dc-e07b-c09e-21d9-a905b457d2bc.png "スクリーンショット 2022-08-29 18.19.21.png")

```js
const { Client } = require("@notionhq/client")

//自身の利用するデータベースID
const databaseId = '13d4d5bcxxxxxxxxxxxxxxxxxxx'; //間にハイフンがなくて大丈夫

// Initializing a client
const main = async () => {
    const notion = new Client({
		auth: `トークンを記載`,
    })
      
    const response = await notion.databases.retrieve({ database_id: databaseId });
    console.log(response); 
}

main();
```

実行してみます。

```bash
$ node app.js
{
  object: 'database',
  id: 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
  cover: null,
  icon: null,
  created_time: '2022-08-27T02:02:00.000Z',
  created_by: { object: 'user', id: 'yyyyyyyyyyyyyyyyyyyyy' },
  last_edited_by: { object: 'user', id: 'yyyyyyyyyyyyyyyyyyyyy' },
  last_edited_time: '2022-08-29T09:11:00.000Z',
  title: [
    {
      type: 'text',
      text: [Object],
      annotations: [Object],
      plain_text: 'obnizデータ',
      href: null
    }
  ],
  description: [],
  is_inline: true,
  properties: {
    Tags: {
      id: 'wQwD',
      name: 'Tags',
      type: 'multi_select',
      multi_select: [Object]
    },
    Name: { id: 'title', name: 'Name', type: 'title', title: {} }
  },
  parent: { type: 'page_id', page_id: 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' },
  url: 'https://www.notion.so/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  archived: false
}
```

情報が取れました。

使ったのはRetrieve a databaseの項目です。

> https://api.notion.com/v1/databases/{database_id}
> https://developers.notion.com/reference/retrieve-a-database


## 所感

インテグレーション追加のところと、 **データベースIDってどこで調べるんだ？**ってところが少しはじめ戸惑った印象です。

慣れてしまえばこんなもんだよなって話なのですが（笑）

APIドキュメントもちゃんと整備されていて色々とやれそうですね。
他のメソッドも触って何か連携させてみたいですね。