🤖

Notionで、指定のCode blockを取得するphpスクリプト

2024/08/01に公開

皆さんも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