當前位置: 妍妍網 > 碼農

使用 Rust 自訂整合 Notion

2024-08-24碼農

Notion 作為一款功能強大的筆記、任務管理和知識庫工具,憑借其簡潔的寫作體驗、靈活的資料庫功能以及跨平台支持,贏得了眾多使用者的喜愛。除了豐富的預制樣版和整合市場,Notion 還允許使用者建立自訂整合,以滿足更加個人化的需求。本文將帶你深入了解 Notion 整合的世界,並使用 Rust 語言構建一個自訂整合,實作自動解析文本訊息並更新 Notion 資料庫的功能。

Notion 整合概述

Notion 整合可以分為兩種主要型別:

  • 預制整合: Notion 整合市場提供了大量預制整合,例如與 Slack、Calendly 等服務的連線,方便使用者快速實作自動化流程。

  • 自訂整合: 當預制整合無法滿足需求時,使用者可以建立自訂整合,以實作更靈活、更個人化的功能。自訂整合可以分為兩種:

  • 公開整合: 公開整合可以透過 Notion 整合市場釋出,供其他使用者使用。

  • 內部整合: 內部整合僅供特定使用者或團隊使用,通常用於內部流程自動化或數據整合。

  • 使用 Rust 構建自訂整合

    本文將以一個簡單的案例為例,介紹如何使用 Rust 構建一個自訂內部整合,實作自動解析文本訊息並更新 Notion 資料庫的功能。

    1. 建立 Notion 整合

    首先,我們需要在 Notion 中建立一個新的整合。存取 https://www.notion.so/my-integrations 頁面,並按照以下步驟進行操作:

  • 命名整合: 為整合取一個有意義的名稱,例如 "Expense Tracker"。

  • 選擇工作區: 選擇與整合相關的 Notion 工作區。

  • 設定型別: 選擇 "內部" 作為整合型別。

  • 添加 Logo: 可選地添加一個 Logo 圖片。

  • 建立完成後,Notion 會生成一個整合令牌,該令牌用於存取工作區中的頁面和資料庫。

    2. 連線頁面和資料庫

    為了讓整合能夠存取特定的頁面和資料庫,需要在頁面設定中添加整合。在目標頁面或資料庫的設定頁面中,找到 "整合" 選項,並添加先前建立的整合。

    3. 構建解析工具

    在本例中,我們將使用 Rust 語言構建一個命令列工具,用於解析文本訊息並更新 Notion 資料庫。

    use std::error::Error;
    use reqwest::Client;
    use serde_json::Value;
    #[tokio::main]
    asyncfnmain() -> Result<(), Box<dyn Error>> {
    // 1. 獲取 Notion 整合令牌
    let notion_token = std::env::var("NOTION_TOKEN")?;
    // 2. 獲取要更新的資料庫 ID
    let database_id = std::env::var("DATABASE_ID")?;
    // 3. 建立 HTTP 客戶端
    let client = Client::new();
    // 4. 解析文本訊息
    let transaction_text = "Transaction: 2023-10-27 Starbucks Coffee $5.00";
    let (date, vendor, amount) = parse_transaction(transaction_text)?;
    // 5. 構建 Notion API 請求
    let request_body = json!({
    "parent": { "database_id": database_id },
    "properties": {
    "Date": { "date": { "start": date }},
    "Vendor": { "rich_text": [{ "text": { "content": vendor }}] },
    "Amount": { "number": amount },
    }
    });
    // 6. 發送請求到 Notion API
    let response = client
    .post(format!("https://api.notion.com/v1/pages"))
    .header("Authorization"format!("Bearer {}", notion_token))
    .header("Content-Type""application/json")
    .header("Notion-Version""2022-02-22")
    .body(request_body.to_string())
    .send()
    .await?;
    // 7. 處理響應
    if response.status().is_success() {
    println!("Transaction added to Notion database.");
    else {
    let response_text = response.text().await?;
    println!("Error adding transaction: {}", response_text);
    }
    Ok(())
    }
    fnparse_transaction(text: &str) -> Result<(StringStringf64), Box<dyn Error>> {
    // 使用正規表式解析文本訊息
    let re = regex::Regex::new(r"Transaction: (\d{4}-\d{2}-\d{2}) (.*) \$(\d+\.?\d*)")?;
    let captures = re.captures(text).ok_or("Invalid transaction format")?;
    let date = captures.get(1).unwrap().as_str().to_string();
    let vendor = captures.get(2).unwrap().as_str().to_string();
    let amount = captures.get(3).unwrap().as_str().parse::<f64>()?;
    Ok((date, vendor, amount))
    }









    程式碼解釋:

    1. 獲取 Notion 整合令牌和資料庫 ID: 從環境變量中讀取整合令牌和資料庫 ID。

    2. 建立 HTTP 客戶端: 使用 reqwest 庫建立 HTTP 客戶端,用於發送請求到 Notion API。

    3. 解析文本訊息: 使用 regex 庫解析文本訊息,提取日期、供應商和金額等資訊。

    4. 構建 Notion API 請求: 使用 serde_json 庫構建 JSON 格式的請求體,包含頁面內容資訊。

    5. 發送請求到 Notion API: 使用 reqwest 庫發送 POST 請求到 Notion API,並添加必要的請求頭。

    6. 處理響應: 檢查響應狀態碼,並根據結果輸出資訊。

    4. 執行工具

    將程式碼保存為 main.rs 檔,並使用 cargo build 命令編譯程式碼。執行 cargo run 命令即可執行工具。

    擴充套件功能

    除了基本的解析和更新功能,還可以根據實際需求擴充套件工具的功能,例如:

  • 多執行緒處理: 使用多執行緒或異步編程技術,提高解析和更新效率。

  • 錯誤處理: 添加更完善的錯誤處理機制,例如記錄錯誤日誌或發送通知。

  • 數據驗證: 對解析後的數據進行驗證,確保數據格式和內容的正確性。

  • 使用者介面: 添加圖形化使用者介面,方便使用者操作和管理。

  • 總結

    本文介紹了使用 Rust 構建自訂 Notion 整合的基本流程,並提供了一個簡單的範例。透過自訂整合,使用者可以更靈活地利用 Notion 的功能,實作更加個人化的套用場景。希望本文能夠幫助你更好地理解 Notion 整合,並開始構建屬於你自己的 Notion 整合。

    文章精選

    「Rust