NotionのDBにページを自動作成するスクリプトを供養する

NotionのDBにページを自動作成するスクリプトGitHub Actionsで組んでいましたが、使わなくなったのでここに供養します。

今回供養するスクリプトの概要としては、「毎日、日報を書くページを作る」ようなスクリプトです。

f:id:corrupt952:20220219012251p:plain

スクリプトの大まかな流れとしては、

  1. 指定したDBのIDに対してページを作成する
  2. 作成するページのタイトルを担当者名にし、日付にスクリプトが実行された日を入れる

というシンプルな流れです。

require 'active_support/all'

require_relative './notion_client.rb'

class Health
  DATEBASE_ID = ENV['DB_ID']

  def daily
    current = Time.now.in_time_zone('Asia/Tokyo').to_date
    create '太郎', current
    create '次郎' current
  end

  private

  def create(name, date)
    cli.create_page(DATEBASE_ID, {
      Name: {
        title: [
          {
            text: {
              content: name
            }
          }
        ]
      },
      "日付": {
        date: {
          start: date
        }
      }
    })
  end

  def cli
    @cli ||= NotionClient.new(ENV['NOTION_API_KEY'])
  end
end

読み込んでいるnotion_client.rbは、自作の薄いラッパーですが、以下のようなものです。

require 'uri'
require 'json'

require 'faraday'

# FYI: https://developers.notion.com/reference
class NotionClient
  BASE_URL = 'https://api.notion.com/'
  CLIENT_VERSION = '2021-05-13'

  def initialize(api_key)
    @api_key = api_key
  end

  def create_page(database_id, properties = {})
    body = {
      parent: {
        database_id: database_id
      },
      properties: properties
    }

    Faraday.post(
      File.join(BASE_URL, 'v1/pages'),
      JSON.dump(body),
      request_headers,
    )
  end

  def list_pages(database_id, filter: {}, sort: {})
    body = {}
    body[:filter] = filter unless filter.empty?
    body[:sort] = sort unless sort.empty?

    Faraday.post(
      File.join(BASE_URL, 'v1/databases', database_id, 'query'),
      JSON.dump(body),
      request_headers,
    )
  end

  private

  def request_headers
    {
      "Content-Type": "application/json",
      "Notion-Version": CLIENT_VERSION,
      "Authorization": "Bearer #{@api_key}"
    }
  end
end

これを書いた当初は、まだAPIの一般公開もされておらず、Gemなどもなかったので軽いラッパーみたいなスクリプトを書いていました。
今から新規にAPI叩くのであれば、Gemを使った方がいいかなと思っています。