Notion APIパブリックベータ版をつかう

Notion APIをさわってみた。 前回、GitHub Acitonsを使って、特定のラベルがついたissueをスプレッドシートに自動でPOSTする処理を書いたので、それをアレンジして投稿先をNotionにしようと思った。

Notion APIのつかいかた

とにかく、かんたんに使い始めることができる。

Getting Startedのページを参照すると、curlをつかった一番シンプルな形のPOSTはすぐにできる。 以下、試しにcurlでいろいろなパラメータをPOSTしたときの手順。

Integrationを登録する

Notionのアカウントは持っている前提。また基本的なページ作成、データベース作成については言及しない。

左メニューのSetting > Integrations > Develop your own Integrations と選択すると、Integrationの新規設定画面が表示される。 必要事項を入力するだけで新規Integrationが登録できる。

登録できたら、一覧画面に表示される。

詳細画面ではTOKENが確認できる。権限設定もここで変更可能。

データベースにIntegrationをひもづける

自分のワークスペースでAPIにひもづけたいデータベースを作成して、左上のShareメニューから先程作成したIntegrationを選択してひもづける。

これで、POSTする準備が整った。

テスト用のコマンドはGetting Startedのページにのってるので、それをそのまま実行してみるとなんなく成功する。

 1curl -X POST https://api.notion.com/v1/pages \
 2  -H "Authorization: Bearer {MY_NOTION_TOKEN}" \
 3  -H "Content-Type: application/json" \
 4  -H "Notion-Version: 2021-05-13" \
 5  --data '{
 6    "parent": { "database_id": "{DATABASE_ID}" },
 7    "properties": {
 8      "Name": {
 9        "title": [
10          {
11            "text": {
12              "content": "Yurts in Big Sur, California"
13            }
14          }
15        ]
16      }
17    }
18  }'

これで最初のテストデータの投稿が完了した。

もう少しいろいろなパラメータをPOSTする

Notionのデータベースでは、いわゆるレコードにあたる各行はそれぞれ独立したページとして存在する。データベースの状態でみたときに、カラムに相当するものは、各ページのpropatyと呼ばれるオブジェクトとして表現されている。

先程登録したパラメータはtitleという特殊なpropatyで、そのままページのタイトルになる部分。このあたりの説明はこちらに詳しい。

今度は、他のpropaty(カラム)にもデータを登録できるようにしたい。Postmanのワークスペースも公開されているので参考にしながらすすめる。

とりあえずNumber、Text、Date、Selectのpropatyに対して投稿できることを確認した。

前回作ったActionsから投稿してみる。

以下がActionsのYAMLファイル。 curlで叩くためにヒアドキュメントにしたけど、これだと変数展開されないので、複雑なJSONをPOSTするならjsで書いたほうが良い。

 1name: labels-actions
 2 on:
 3   issues:
 4     types:
 5       ['labeled', 'unlabeled']
 6
 7 jobs:
 8   labeled-actions:
 9     runs-on: ubuntu-latest
10     if: |
11              (github.event.label.name == '対応中') || (github.event.label.name == '依頼中')
12     name: Recording label's add or remove time
13     steps:
14       - name: Checkout
15         uses: actions/checkout@v2
16       - name: POST Comment
17         env:
18           GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
19           LABEL_NAME: ${{ github.event.label.name }}
20           TITLE: ${{ github.event.issue.title }}
21         run: |
22           curl -X POST -H "Authorization: token $GITHUB_TOKEN" -d "{\"body\": \"ラベルが付きました\nラベル: $LABEL_NAME\nタイトル: $TITLE\"}" ${{ github.event.issue.comments_url }}
23           data=$(cat <<EOF
24           {
25             "parent": { "database_id": "dfc2cdc260ae476c8f2f5d4065f9a94a" },
26             "properties": {
27               "Name": {
28                 "type": "title",
29                 "title": [{ "text": { "content": "POST Data" } }]
30               },
31               "Tags": {
32                 "type": "rich_text",
33                 "rich_text": [{ "text": { "content": "actions" } }]
34               },
35               "Price": {
36                 "type": "number",
37                 "number": 500
38               },
39               "Date": {
40                 "type": "date",
41                 "date": { "start": "2021-05-11" }
42               },
43               "Status": {
44                 "select": {
45                   "name": "complete"
46                 }
47               }
48             }
49           }
50           EOF
51           )
52           curl -X POST "https://api.notion.com/v1/pages" \
53             -H "Authorization: Bearer ${{ secrets.MY_NOTION_TOKEN }}" \
54             -H "Content-type: application/json" \
55             -H "Notion-Version: 2021-05-13" \
56             -d "$data"           

上記を実行すると、GitHubの該当issue上にもコメントが追加される。