🤖
Notionで、指定のCode blockを取得するphpスクリプト
皆さんもNotionつかってますよね、Notionに様々なサンプルコードがかかれたり、設定がかかれたりします。
それらが更新される度にコピペするのが面倒…! と言うときに私が使っているプログラムがこちらです。
<?php
/**
* get_code_block_from_notion.php
* このプログラムは、Notion APIを使用して特定のページの子ブロックを取得し、
* 指定されたIDのコードブロックの内容を出力します。
*/
declare(strict_types=1);
// Composerがなくても良いように
if (file_exists(__DIR__ . '/vendor/autoload.php')) {
require_once(__DIR__ . '/vendor/autoload.php');
// DotEnvのロード
if (class_exists("Dotenv\Dotenv") && file_exists(__DIR__ . '/.env')) {
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
}
}
// 環境変数の取得(環境変数が設定されている場合は優先)
// Code blockにおいてリンク先を取得したとき、以下のようなURLになりますが、それらをセットします
// https://www.notion.so/{BLOCK_ID}?pvs=4#{ITEM_ID}
$notionAccessToken = getenv('NOTION_TOKEN') ?: null;
$blockPageId = getenv('BLOCK_ID') ?: null;
$itemId = getenv('ITEM_ID') ?: null;
// 必要な環境変数が設定されているか確認
if (!$notionAccessToken || !$blockPageId || !$itemId) {
echo "エラー: 必要な環境変数が設定されていません。\n";
return 1;
}
function getNotionBlockChildren(string $blockPageId, string $notionAccessToken, ?string $startCursor = null): array
{
$url = "https://api.notion.com/v1/blocks/$blockPageId/children";
if ($startCursor) {
$url .= "?start_cursor=$startCursor";
}
$headers = [
"Authorization: Bearer $notionAccessToken",
"Notion-Version: 2022-06-28",
"Content-Type: application/json"
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode != 200) {
throw new Exception("Failed to retrieve children: HTTP status code $httpCode");
}
curl_close($ch);
return json_decode($response, true);
}
try {
$hasMore = true;
$startCursor = null;
while ($hasMore) {
$response = getNotionBlockChildren($blockPageId, $notionAccessToken, $startCursor);
// find specify code block
foreach ($response['results'] as $childBlock) {
if ($childBlock['id'] === $itemId) {
// Code blockはこのような構造なので
echo $childBlock['code']['rich_text'][0]['text']['content'];
return 0;
}
}
$hasMore = $response['has_more'];
$startCursor = $response['next_cursor'] ?? null;
}
echo "Notfound" . PHP_EOL;
return 1;
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage() . PHP_EOL;
return 1;
}
使い方は以下のようになります
# こういうURLだったとき…
# https://www.notion.so/pa-ge-id?pvs=4#i-tem-id
$ NOTION_TOKEN=your_secret_token BLOCK_ID=pa-ge-id ITEM_ID=i-tem-id get_code_block_from_notion.php
もし、DotEnvがはいっていれば、.env
もつかえます。
Discussion