Notion 寫作

網路寫作&變現

Notion 入門基礎

指令、介面

Notion 創建與管理頁面

文件編輯、頁面屬性

Notion blocks 掌握塊(Block)功能

Blocks 介紹、使用

Notion 模板

教學、模板下載

Notion 團隊協作

教學、範例

Notion進階技巧
高級資料庫管理

操作、應用說明

Notion 進階技巧
整合與自動化

操作、應用說明

Notion 進階技巧
AI 輔助工具

操作、應用說明

Notion 應用

教學、應用

Notion API 高級整合:寫作必備自動上傳 Notion 內容到 WordPress

Notion API 高級整合:寫作必備自動上傳 Notion 內容到 WordPress

為什麼要自動化來協助寫作?

如果你和我一樣,思考過經營一個部落格透過分享文章來賺錢的話,我們都試著優化網站的「SEO」來提高流量,但同時也面臨著一個巨大的挑戰:「如何高效地管理和發布大量的文章內容,同時還要保持內容的質量和更新速度。」

這表示我們要在有限的時間內,寫作、更新,還要在不同的平台上發佈。

這不僅僅是一個時間管理的問題,更是一個技術挑戰。其中最讓我最苦惱的是 WordPress 內容的管理和自動化,這是我最想要克服的問題。所以我一直在找尋自動化的方法,但網路上的資訊確實有限,現在我透過 Python 程式來為我上傳文章到 WordPress ,提高了我的寫作生產力,最高興的是我有更多的時間可以寫作。

總之,本文將深入探討如何使用 Notion API 與 WordPress REST API 進行整合,實現自動上傳內容的流程,並討論這種自動化如何顯著提高創造和生產能力。




使用 Notion API 和 WordPress API 進行整合的好處

  • 提高效率:自動化的內容管理過程可以節省大量的手動輸入和維護時間,使創作者和管理者能夠專注於內容創作而非繁瑣的格式和發布流程。
  • 增強一致性:通過自動化工具,每一篇文章的格式、風格和發布標準都可以統一,這對於保持品牌的專業形象至關重要。
  • 即時更新:當內容需要快速反應最新信息或數據時,自動化發布系統可以確保信息在幾乎無延遲的情況下被更新和發布,大大提高了信息的時效性。
  • 跨平台管理:Notion 和 WordPress 的整合允許內容在多個平台之間無縫對接,為管理多個渠道提供了便利。


  • Notion → WordPress 自動化程式邏輯怎麼寫?

    開始之前,我們需要先梳理一下本程式的邏輯。




    從流程圖上來看,我們要先建立一個 Notion database 並在上面寫文章內容,以及設定 Properties 包含有 Name、前言和 slug 等等,依你的需求。

    再來我們要寫一段程式來取得 Notion database 上的所有資料,然後將資料透過 WordPress REST API 來新增文章。





    用 Python 寫自動上傳程式


    前置作業:Notion Integration Token 申請

    從左上角的 「Settings & members 」進入設定頁面。





    點擊左下方的 Connections ,找到頁面下方的 Develop or manage integrations。




    進入頁面後,點擊 Create new integration。





    輸入自訂名稱,確認 Read content 有打勾,點擊「Submit」即可。





    這樣就完成 Internal Integration Token 的申請,請將 Token 存在某個地方,等一下我們需要使用。




    前置作業:Database Connect

    完成 Notion Integration Token 申請後,請不要忘了新增一個 Notion Database ,並且將 Notion Connecting 設定好。




    前置作業:準備 Python 程式環境 Google Colab

    Google Colab,全名 Google Colaboratory,是 Google 為了推廣機器學習所提供的一個研究工具。它是一個完全基於雲端的 Jupyter 筆記本環境,能夠在瀏覽器中撰寫和執行 Python 等多種語言的程式碼,不需要任何設定。此外,Google Colab 提供了免費的 GPU 使用,使得執行機器學習和深度學習的程式碼更為便利。你可以隨時隨地、在任何裝置上,只需一個 Google 帳戶和網路連線,就能使用 Google Colab 進行程式學習和資料分析。

    網址:https://colab.research.google.com/?hl=zh-tw



    步驟一:取得 Notion database Properties

    在先前的文章 Notion API 怎麼用? 基礎教學 Postman 、Typeform 我們有討論過如何取得 Database 的列表。

    這次我們要用 Query a database 服務,這個功能和之前的 List databases 有個很大的不同,就是加上了過濾器 Filter ,因為我們並不想要取得所有的項目,而是部份滿足特定條件的項目。




    如果你已經取得 Token 和登入 Google Colab 帳戶了,從 Notion API Guides 可以找到

    那可以輸入程式:

    import requests
    import json
    
    notion_database_id = 'b5d07b515a304163a0d1b7c931df9e57'
    notion_integration_token = 'secret_MgXY2xxxxxxxxxxxxxxxxxVfw7NoxxQBls'
    
    headers = {
                "Accept": "application/json",
                "Notion-Version": "2022-06-28",
                "Content-Type": "application/json",
                "Authorization": notion_integration_token,
            }
    
    notion_payload = {
        "page_size": 10,
        "filter": {
            "and": [
                {
                    "property": "Checkbox",
                    "checkbox": {
                        "equals": True
                    }
                },
            ]
        }}
    
    notion_api_url = f"https://api.notion.com/v1/databases/{notion_database_id}/query"
    
    response = requests.post(notion_api_url, json=notion_payload, headers=headers)
    datas = response.json().get('results', [])
    print('找到資料數 = ',len(datas))



    簡單變數說明:

  • notion_database_id : Notion 資料庫的 id ,id 怎麼取得請看文章 Notion API 怎麼用? 基礎教學 Postman 、Typeform
  • notion_integration_token : Notion 的 Integration Token。
  • notion_payload:過濾條件
  • response : Notion 回傳的資料


  • 以上是個簡單的 Python 程式碼示例,請自行替換 notion_database_id 和 notion_integration_token ,並確保資料庫中有新增 Property checkbox 並且打勾。




    步驟二:取得 Notion Page 內容

    獲取 database Properties 後,接下來我們想取得 Notion Page 內容,這必須使用 Retrieve block children 功能。




    依 Notion API Guides 的內容,我們可以輸入程式:

    import requests
    import json
    
    page_id = 'c30e4aa7-7dcc-4a64-bcf5-b0a08c003b15'
    notion_integration_token = 'secret_MgXY2xxxxxxxxxxxxxxxxxVfw7NoxxQBls'
    
    
    def get_content(page_id, notion_integration_token):
        headers = {
            "Authorization": f"Bearer {notion_integration_token}",
            "Content-Type": "application/json",
            "Notion-Version": "2022-06-28"
        }
    
        # 初始化URL和空列表用于存储所有blocks
        url = f"https://api.notion.com/v1/blocks/{page_id}/children"
        all_blocks = []
        more_data = True
        start_cursor = None
    
        while more_data:
            # 如果有分页,添加cursor参数到请求中
            if start_cursor:
                url_with_cursor = f"{url}?start_cursor={start_cursor}"
            else:
                url_with_cursor = url
    
            response = requests.get(url_with_cursor, headers=headers)
    
            if response.status_code == 200:
                data = response.json()
                all_blocks.extend(data.get('results', []))  # 添加当前页的blocks到总列表
                more_data = data.get('has_more', False)  # 检查是否还有更多数据
                start_cursor = data.get('next_cursor')  # 获取下一个cursor
            else:
                raise Exception(f"Failed to fetch content: {response.status_code}, URL: {url_with_cursor}")
    
        return all_blocks
    
    content = get_content(page_id,notion_integration_token)
    print(content)


    簡單變數說明:

  • page_id:可以從頁面連結中取得。例如說:https://www.notion.so/lashiblog/Notion-43d892c22a0d4b90a566c8cb22d5785d?pvs=4。其中 “43d892c22a0d4b90a566c8cb22d5785d” 就是id,輸入程式時,請加上”-”。


  • more_data:檢查是否有子 block ,某些塊的 Type 是帶有子資料,我們需要將子資料也找出來。
  • start_cursor:如果有子 block ,加入 start_cursor 参数。
  • all_blocks :用來儲存所有的資料


  • 你取得資料為所有的 blocks ,但我們只是想要 blocks 的內容的部份。




    步驟三:將 Block 轉成 HTML 資料

    找到 Page Content 的資料後,在上傳到 WordPress 之前,我們還需要一個重要的動作,就是將資料轉換成 WordPress 可以讀取的內容,像是 HTML 檔案。

    怎麼做呢? 我們可以輸入程式:

    elements = []
    full_content = ''
    
    for i in content:
        
        block_type = i['type']
        content_data = i.get(block_type, {})
        rich_text_list = content_data.get("rich_text", [])
        
        for rt in rich_text_list:
            if rt['type'] == 'text':
                text_content = rt["text"]["content"]
                link = rt["text"].get("link")
                if link:
                    text_content = f'{text_content}'
                full_content += text_content
        
        if block_type == 'heading_2':
            elements.append(f"

    {full_content}

    ")


    簡單變數說明:

  • elements:儲存 HTML
  • full_content:轉化成 HTML 的文字格式
  • block_type:block 格式
  • rich_text_list :儲存 rich_text 的內容
  • if block_type == ‘heading_2’ :假如 type 為 heading_2 ,就…

  • 這步驟困難在於轉換成 HTML 時,需要考慮許多不同的格式,包含 H2 大標題、H3 小標題、Text 文字、Image 圖片…等,所有我們可能會用到的格式。

    上面的的範本只有 H2 喔! 剩下的,請看下去…




    步驟四:上傳資料到 WordPress


    什麼是 WordPress RestAPI?

    WordPress RestAPI 是一種讓開發者能夠透過 HTTP 請求與 WordPress 網站互動的工具。透過這個 API,開發者可以讀取、創建、更新及刪除網站的文章、頁面、媒體等內容,並且可以進行使用者認證等操作。它使得開發者可以更方便地整合 WordPress 資訊到其他應用程式或服務中。

    更多完成的文件:Reference – REST API Handbook | Developer.WordPress.org



    怎麼啟用 REST API ?

    要啟用 WordPress REST API,通常不需要額外的步驟,因為從 WordPress 4.7 版本開始,REST API 已經內建在 WordPress 中。不過,我們還是一些動作,來確認你的 WordPress REST API 是否正常運作。

    測試 REST API:可以通過訪問以下 URL 來測試 REST API 是否運作正常。

    
    

    如果 REST API 正常運作的話,應該看得到文章的資訊,如果失敗的話,有些主題或插件可能會限制 REST API 的功能。檢查是否有安裝任何可能會影響 REST API 的插件,例如安全性插件可能會禁用 API 端點。





    設置 WordPress API 帳戶

    在寫程式之前,建議你創建一個新帳戶,具有編輯權限的用戶,以便 API 可以進行文章的發布和管理。

    Step1. 新增使用者

    請登入自己網站的 WordPress 後台頁面,在功能欄找到「使用者」→ 新增使用者,並輸入下列設定,然後新增。


  • 使用者名稱 → MyNotion (自定)
  • 電子郵件 → 自訂,請輸入到頁面的 「WordPress Acount Name」
  • 使用者角色 → 編輯




  • Step2. 設定權限




    Step3. 新增應用程式密碼

    新增後,請進入其使用者的頁面,在頁面的下方找到「應用程式密碼」,新增一個應用程式密碼。



    ▼ 請將反白的密碼複製下來,貼到個人頁面的 「WordPress App Password」中。




    寫個自動上傳程式

    完成後,我們將帳戶和應用程式密碼先存在文件中。

    再來,我們可以輸入程式:

    headers = {
             "Content-Type": "application/json",
              "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }
    
    data = {
        "title": title,
        'slug':slug,
        "content": content,
        "status": "publish",
    }
    
    response = requests.post(f"{wp_url}/wp-json/wp/v2/posts", headers=headers, json=data,auth=(wp_user, wp_password))



    總結

    恭喜親愛的朋友看到這裡,坦白說從程式小白到完整寫完程式,到現在我請 AI 幫我更完整它,可能也花了兩年左右的時間。總之,完整的程式早就開放在網路上,更完整的內容和使用方法,請看: NotionPress :簡單地將 Notion 文章同步到 WordPress

    免費下載喔!


    目錄:
    Notion API 高級整合:寫作必備自動上傳 Notion 內容到 WordPress

    留言給我