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

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

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

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

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

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

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

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

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

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

mynotion_20240805.png

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

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

用 Python 寫自動上傳程式

前置作業:Notion Integration Token 申請

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

mynotion_step6-1-e1673172217724.png

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

mynotion_step6-2-e1673172249188.png

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

mynotion_step6-3-e1673172278268.png

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

mynotion_step6-4-e1673172308874.png

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

mynotion_step6-5-e1673172341260.png

前置作業:Database Connect

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

mynotion_20240814.png
mynotion_20240803-4.png

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

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

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

bookmark

步驟一:取得 Notion database Properties

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

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

mynotion_20240805-1.png

如果你已經取得 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))

簡單變數說明:

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

mynotion_20240805-2.png

步驟二:取得 Notion Page 內容

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

mynotion_20240805-3.png

依 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)

簡單變數說明:

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

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

mynotion_20240805-4.png

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

mynotion_20240805-5.png

步驟三:將 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'<a href="{link["url"]}">{text_content}</a>'
            full_content += text_content
    if block_type == 'heading_2':
        elements.append(f"<h2>{full_content}</h2>")

簡單變數說明:

  • elements:儲存 HTML
  • full_content:轉化成 HTML 的文字格式
  • block_type:block 格式
  • richtextlist :儲存 rich_text 的內容
  • if blocktype == 'heading2' :假如 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 是否運作正常。

<https://yourdomain.com/wp-json/wp/v2/posts>

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

mynotion_20240805-6.png

設置 WordPress API 帳戶

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

Step1. 新增使用者

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

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

Step2. 設定權限

Mynotion_step3-2-e1673147994123.png

Step3. 新增應用程式密碼

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

Mynotion_step3-3-e1673148048431.png

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

Mynotion_step3-4-e1673148085531.png

寫個自動上傳程式

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

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

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

免費下載喔!

Read more

AI 真的能幫我上班嗎?

AI 真的能幫我上班嗎?

So桑:「每天早上上班的時候,我都會想一個問題——有沒有可能 AI 幫我上班?我躺在床上,它幫我開會、回信、報告全寫完……」 Tifa:「那你不就失業了嗎?」 So桑:「對,但我失業的同時,它也幫我賺錢啊~」 So桑:「而這不是開玩笑。2025 年的 AI,真的已經卷(競爭)到離譜的程度。你以為你在努力工作,但其實 AI 比你還勤勞,還不會請病假,還不會抱怨薪水太低。」 AI 到底有多卷? So桑:「要看一個產業多卷,看錢就知道了。」 ▲ 2025 上半年生成式 AI 投資金額達 492 億美金,比去年全年還多 (資料連結)。 So桑:「這就像是百貨公司周年慶。每家公司都在打折搶客戶,AI 世界每天都在上新貨,早上剛出 GPT-6,

By So桑
【閱讀心得】小島經濟學:看見資本、貨幣與自由 從一張漁網改變你的理財思維

【閱讀心得】小島經濟學:看見資本、貨幣與自由 從一張漁網改變你的理財思維

我覺得經濟學其實是離我們最近的學問。它不是抽象的符號遊戲,也不是只有大學才看得懂的東西。這本書把資本、貨幣、利率、貿易、政策這些看似艱深的詞,用魚、網、銀行這類生活化的故事拆開說清楚。讀完你會發現,原來經濟學可以這麼接地氣,能直接幫你在日常中做選擇。 在和朋友聊聊理財,常聽到一個觀念:「財富是讓你選擇怎麼活,不是累積數字的遊戲,目的是自由。」 《小島經濟學》告訴我們的更多是如何做選擇的看法。 一張魚網如何改變命運 故事從一張捕魚網開始。艾伯花幾天編好第一張網,從此每次出海能多捕幾條魚。這張網不是錢,而是能反覆使用、提高生產力的「工具」或「能力」。 有人看到機會,想學做網,但怕餓肚子,他們會去跟艾伯借魚或借工具。這種借貸,其實就是最原始的信用。借的人希望用時間換取未來更高產出;借的人(艾伯)則在承擔風險,期待回報。 這是資本的起點:有人願意犧牲眼前的消費,去創造能持續產出的東西。當大家都願意這樣做,島上每個人最後都有網,一天能捕兩條魚,生活質量整體提升。 所以資本不是錢,

By So桑
拖延症:台灣人的日常心魔,如何把「明天再說」變成「現在就做」的執行力

拖延症:台灣人的日常心魔,如何把「明天再說」變成「現在就做」的執行力

「你可以拖延,但時間不會。」— 班傑明・富蘭克林 「我們明天再開始吧!」 「拖延症」大概是你我最熟悉的朋友兼敵人。不是重病,卻讓無數夢想停在起點。只要能跨過那一步,很多事其實都迎刃而解。如果有方法把拖延變成行動力,我們是不是就能活成自己想要的樣子? 我們為什麼會拖延?生物學角度的「拖延」 人的大腦天生趨樂避苦,「該做」常伴隨痛苦。 思考很容易,但做起來就不簡單,行動伴隨不適,大腦本能就會先閃躲。 所以拖延其實不是「懶」,而是大腦在保護你避開壓力與不確定性。 一、進化與環境失配 人類大腦同時有「即時回饋偏好」的舊系統與「長期規劃」的新皮質。 過去在資源稀缺與威脅環伺時,即時回饋有利生存;現代任務多為延遲回報,產生失配,傾向推遲需要長期投入的行動。 Tim Urban 在 TED 經典演講(連結),提到的「理性決策者 vs. 即時滿足猴」的比喻指出:當生活沒有立即威脅時,

By So桑
幣漲無疑《Number Go Up》在說什麼:敘事、風險與人性的一本清醒書

幣漲無疑《Number Go Up》在說什麼:敘事、風險與人性的一本清醒書

市場會騙人,人性更會。 敘事能抬價,但風險只會累積。 做好退場計畫,比預測價格更實用。 「別把幸運當實力,也別拿善意當免死金牌。」 本傑明・葛拉漢:「投資在短期是一部投票機,在長期是一部稱重機。」 把票投給敘事沒關係,但別忘了最重要的「風險」。 為什麼大家相信「幣漲無疑」? 一般人會說沒有「必漲資產」。在華人世界,很多人信房地產;有些國家偏愛黃金;而幣圈信徒更偏向比特幣。作者指出,比特幣信徒極為死忠,幾乎任何新聞都能被詮釋為利多,形成強大的買盤與敘事支撐。泡沫可以比你想像更久,反人性操作會把做空者擠爆,所以他選擇不做空比特幣。 敘事是一種身份與群體歸屬。當我們在短時間內推測未來走勢,就很容易「自我強化偏誤」:只收集支持自己觀點的資訊,忽略不利訊號。於是「幣漲無疑」像口號一樣被喊大聲,直到現實來敲門。 不過,2000 的網路泡沫與 2008 的金融海嘯都沒有讓世界毀滅,反而帶來生態的重整與成長。 這本書適合兩種人閱讀: 1. 已在幣圈打滾已久的人:你看過事件本身,

By So桑