はじめに
notion-py(非公式)についての記事を調べても日本語で書かれていることが少ないんですよね。自分が使ってみたことをまとめて置きます!
初めて記事を書いたので分かりにくい所もあると思いますがご理解下さい。
記事を書いた日(2022/02/05)での情報となるので注意してね。
2022年3月17日更新
notion-pyは、新規で作成したtopページでもアクセスができなくなりました。
よって、実質notion-pyは動かないということになります。
-確定ではない情報-
2022年3月16日以前に作成したtopページであればこの記事に書いている内容は動くことを確認しています。
2022年3月16日のnotion側のアップデートにより使えなくなったと言えるでしょう。
notion-pyを使います
↓GitHubはこちら
使う技術
- python
使い方
使えるようにします
pip install notion
# notion-pyを使うためにimportする文を記述する
from notion.client import NotionClient
# `token_v2`はこの記事内にやり方を書いてるのでそちらを参考に貼り付ける
client = NotionClient(token_v2="<token_v2>")
# notionのTopページのURLを””内に貼り付ける
page = client.get_block("https://www.notion.so/terusibata/qiita-test-aa8c15c9a67b4baebe720ed754317666")
# ページのタイトルの取得
print("ページのタイトル : ", page.title)
token_v2の取得方法
こちらの記事を参考しました
webのNotionにログインしている状態
↓
F12(デベロッパーツールを開く)
↓
Application(アプリケーションタブをクリック)
↓
Cookie(左の一覧にある)
↓
token_v2の横にある長い文字列をコピー
んでここまではちょっと調べたら書いてある
ここからの使い方が結構調べないとないのでここにまとめて置きます!
やりたいことに合わせて目次からどうぞ
基本となるコードが書かれているという程で、その下に書くことで実行出来ます。
notion-pyではサブページ(Topページの中にページを作成しているページ)に直接アクセスするとエラーが出るので注意
topページ(または今いる階層のページ)に追加する
テキストを書き込みたい
#必要に応じてインポートします
from notion.block import HeaderBlock
from notion.block import SubheaderBlock
from notion.block import SubsubheaderBlock
from notion.block import TextBlock
page.children.add_new(HeaderBlock, title='ヘッダー1を追加')
page.children.add_new(SubheaderBlock, title='ヘッダー2を追加')
page.children.add_new(SubsubheaderBlock, title='ヘッダー3を追加')
page.children.add_new(TextBlock, title='テキストを追加')
#2022/2/6追記
#テキスト内にリンクを入れた状態で作成する方法はこちら
page.children.add_new(TextBlock, title='リンクは[こちら](https://qiita.com/terusibata/items/aef67a87a5dd2bb3f7f6)')
ToDoとして書き込みたい
#必要に応じてインポートします
from notion.block import TodoBlock
#✔を入れていない状態なら以下のコードだけでよい
page.children.add_new(TodoBlock, title='✔前のtodoブロックを追加')
#✔をいれた状態で作成するには以下のコードを書くとよい
newchild = page.children.add_new(TodoBlock, title="✔後のtodoブロックを追加")
newchild.checked = True
箇条書きリストとして書き込みたい
#必要に応じてインポートします
from notion.block import BulletedListBlock
page.children.add_new(BulletedListBlock, title='箇条書きリストを追加')
番号付きリストとして書き込みたい
#必要に応じてインポートします
from notion.block import NumberedListBlock
page.children.add_new(NumberedListBlock, title='番号付きリストを追加1')
page.children.add_new(NumberedListBlock, title='番号付きリストを追加2')
page.children.add_new(NumberedListBlock, title='番号付きリストを追加3')
区切り線を書き込みたい
#必要に応じてインポートします
from notion.block import DividerBlock
page.children.add_new(DividerBlock)
引用として書き込みたい
#必要に応じてインポートします
from notion.block import QuoteBlock
page.children.add_new(QuoteBlock, title='引用を追加')
コールアウトとして書き込みたい
#必要に応じてインポートします
from notion.block import CalloutBlock
page.children.add_new(CalloutBlock, title='コールアウトを追加')
実行例
※iconを変える方法が分かりませんでした。申し訳ありません。
トグルリストとして書き込みたい
#必要に応じてインポートします
from notion.block import ToggleBlock
#トグルリストをタイトルだけを付けて作成する場合は以下のコードでよい
page.children.add_new(ToggleBlock, title='トグルリストを追加')
#トグルリストの中に要素を入れたい場合は以下のコードのように書く(必要に応じてインポートしてください)
from notion.block import TextBlock
from notion.block import TodoBlock
newtoggle = page.children.add_new(ToggleBlock, title='トグルリストを追加')
newtoggle.children.add_new(TextBlock, title='トグルリストの中にテキストを追加')
newtoggle.children.add_new(TodoBlock, title='トグルリストの中に✔前のtodoブロックを追加')
サプページを追加したい
#必要に応じてインポートします
from notion.block import PageBlock
#サブページを作成してタイトルを入力するだけなら以下のコードでよい
page.children.add_new(PageBlock, title='サプページを追加')
実行例
まあ、サブページだけ作成して終わりのパターンはほとんどないですよね。
目次にある「サブページ内で出来ること」をご覧ください。
ファイル(画像など)のアップロードをしたい
#必要に応じてインポートします
from notion.block import ImageBlock
from notion.block import VideoBlock
from notion.block import AudioBlock
#画像アップロード
page.children.add_new(ImageBlock).upload_file("ここにファイルパス")
#動画アップロード
page.children.add_new(VideoBlock).upload_file("ここにファイルパス")
#音声アップロード
page.children.add_new(AudioBlock).upload_file("ここにファイルパス")
注意!
無料プランのnotionアカウントは1つのファイルにつき5MBまでとなります。
有料プランのnotionアカウントは1つのファイルにつき約5GBまでとなります。
埋め込みとして書き込みたい
#必要に応じてインポートします
from notion.block import VideoBlock
#動画の埋め込み例
video = page.children.add_new(VideoBlock, width=700)
video.set_source_url("ここに動画のリンク")
※他のファイルも同様の方法で埋め込みができます。
データベースを追加したい
notionのデータベース作成は2種類あります。「インライン」と「フルページ」です。
このやり方がなかなか見つからなかったので参考になれば嬉しいです。
また、これは初心者が作った一例ですので、コードが汚いですがご了承下さい。
「インライン」のデータベース
年ごとに新たなデータベースを作成し、同じ年なら同じデータベース内に要素が追加されていくというコードになります。
from notion.block import CollectionViewBlock
from uuid import uuid1
from random import choice
import datetime
colors = [
"default",
"gray",
"brown",
"orange",
"yellow",
"green",
"blue",
"purple",
"pink",
"red",
]
schema = {
"title": {
"name": "タイトル",
"type": "title"
},
"channel_select": {
"name": "チャンネル",
"type": "multi_select"
},
"URL":{
"name": "動画リンク",
"type": "url"
},
"date": {
"name": "日付",
"type": "date"
},
}
#データを代入
year = "2022年"
title = "テストタイトル"
channel = "テルシバタチャンネル"
URL = "https://youtube.com/channel/UCA910n1MOVJVW6GQ8Wymwrg"
Date = datetime.date(2022,2,5)
Collection_data = False
for child in page.children :
try:
if child.title==year:
Collection_data = True
channelnamedata_id=child
except AttributeError:
print("タイトルがない要素はスキップ")
if not Collection_data:
print("データベースを作成します")
#ここを変えることでインラインとフルページを切り替えれる
cvb = page.children.add_new(CollectionViewBlock)
cvb.collection = client.get_collection(client.create_record("collection", parent=cvb, schema=schema))
cvb.title = year
#ここでデータベースのview形式を変更できる
view = cvb.views.add_new(view_type="table")
row = cvb.collection.add_row()
else:
row = channelnamedata_id.collection.add_row()
view = channelnamedata_id
row.タイトル = title
#タグがない場合エラーになるので、以下の関数を実行しタグを作成する
add_new_multi_select_value("チャンネル", channel ,view.collection, color=None)
row.チャンネル = channel
row.動画リンク = URL
row.日付 = Date
def add_new_multi_select_value(prop, value, collection,color=None):
"""`prop`が、マルチセレクトの名前となります"""
if color is None:
color = choice(colors)
collection_schema = collection.get("schema")
prop_schema = next(
(v for k, v in collection_schema.items() if v["name"] == prop), None
)
if not prop_schema:
raise ValueError(
f'"{prop}"はデータベースに存在しない要素です'
)
if prop_schema["type"] != "multi_select":
raise ValueError(f'"{prop}"はマルチセレクトではありません')
if "options" not in prop_schema: prop_schema["options"] = []
dupe = next(
(o for o in prop_schema["options"] if o["value"] == value), None
)
if dupe:
print("すでにあるタグです")
prop_schema["options"].append(
{"id": str(uuid1()), "value": value, "color": color}
)
collection.set("schema", collection_schema)
「フルページ」のデータベース
インラインのデータベースとの違いは、インポートとコード1行だけです。
from notion.block import CollectionViewPageBlock
#ここを変えることでインラインとフルページを切り替えれる
cvb = page.children.add_new(CollectionViewPageBlock)
データベース共通で変更できること
#ここでデータベースのview形式を変更できる
view = cvb.views.add_new(view_type="table")
ここの行の"table"内を変更するとview形式を変更することができます。
"board"に変更した場合
"timeline"に変更した場合
"calendar"に変更した場合
"list"に変更した場合
"gallery"に変更した場合(中に画像がある場合はおすすめ)
サプページ内で出来ること
サプページでは、topページと同じことが出来ます。また、サプページの中にサプページの作成を実質無限に行うことが出来ます。
が、
**サプページに直接アクセスすることが出来ません。**notion-pyのバグかもしれません。
よって、サプページ内にブロックを追加するにはtopページから辿っていきましょう
サプページへの辿り方
新たにページを作成する場合
#必要に応じてインポートします
from notion.block import PageBlock
from notion.block import TextBlock
#サブページのデータをnewpageに代入する
newpage = page.children.add_new(PageBlock, title='サプページを追加')
#newpageをtopページ(現在の階層のページ)として扱うことができます
#よって上記に書かれていることを全て同様に実行することができます
newpage.children.add_new(TextBlock, title='サブページの中にテキストを追加')
実行例
↓ ページの中身
このようにすれば階層をどんどん深くすることができます。
同じページを指定して辿る場合
#必要に応じてインポートします
from notion.block import PageBlock
from notion.block import TextBlock
#タイトルに一致するページを検索する
key = "ここにタイトル"
nextpagedata = False
for child in page.children :
try:
if child.title==key:
nextpagedata = True
nextpage=child
except AttributeError:
print("タイトルがない要素はスキップ")
if nextpagedata:
nextpage.children.add_new(TextBlock, title='サブページの中にテキストを追加')
else:
print("一致するタイトルのページはありませんでした")
#ここに新しいページを作るコードを書くとよい
#page.children.add_new(PageBlock, title='サプページを追加')
タイトルで検索すると同じタイトルがある場合は使えないのでchikd.idで検索するとよいかもしれません。
最後に
ご覧いただきありがとうございます。
notionに自動でアップロードするプログラムを作っています!
動かなかったプログラム
データベースの一覧を取得するコードが自分の環境では動きませんでした。
for row in cv.collection.get_rows():
print(row)