每次我把文章複製到 dev.to 編輯器、加上標籤並整理格式時,我都會想:有沒有辦法把這件事自動化?如果你也有同樣的疑問,這篇文章就是為你寫的。
答案是:dev.to API。
在這篇文章中,我會示範兩種使用方式。首先是 curl 指令,讓你看到 API 期待的實際請求格式。接著是用 Python 寫的腳本,來自動完成這件事。我也會提到最容易讓人卡住的部分:圖片。
首先你需要一組 API 金鑰。
在你的 dev.to 帳號中,前往 Settings → Extensions → DEV Community API Keys。替你的金鑰取個名稱,然後點擊 Generate API Key。
接著展開按鈕下方的 Active API Keys 清單,點擊你的金鑰旁邊的箭頭即可顯示它。
不要把金鑰直接貼進原始碼裡。Python 版本會從環境變數讀取它。
先從一個簡單範例開始,讓你看看整個流程背後的 HTTP 請求。
打開終端機(在 Windows 上,你可以使用 Git Bash),並執行下面的指令,把 YOUR_KEY 換成你自己的 API 金鑰。
curl -X POST https://dev.to/api/articles \
-H "api-key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"article": {
"title": "My First Post",
"body_markdown": "# Hello\n\nThis is my post.",
"tags": ["python", "api"],
"published": false
}
}'
各部分的作用如下:
curl -X POST 告訴 API 要建立一篇新文章。-H 用來加入標頭。這裡一個標頭帶上你的 api-key;另一個則表示請求本文是 JSON。-d 是請求本文,格式為 JSON。注意:
published設為false(預設值)時,文章會以草稿形式建立,你可以在 Dashboard 中看到它。你可以打開它、檢查格式、編輯內容,準備好之後再發佈。若設為true,文章會立即上線。
缺點是:你每次都得在終端機裡手動輸入或貼上 API 金鑰、標題、標籤和內文。這正是我們想避免的重複工作,所以接下來改用腳本來處理。Python 是個不錯的選擇。
如果你是用 Markdown 寫文章,通常每個檔案頂端都已經有 front matter,而且可以直接沿用。
如果你以前沒用過 front matter,其實很簡單,長這樣:
---
title: My First Post
tags: [python, api]
---
只要把這幾行加到 Markdown 檔案最上方即可。請確保每個冒號後面都有一個空格,因為 YAML 不會解析 title:My First Post。另外也請注意,dev.to 每篇文章最多只接受四個標籤。
首先安裝兩個套件:requests 用來與 API 溝通,python-frontmatter 用來讀取文章中的 front matter。在終端機執行以下指令:
pip install requests python-frontmatter
接著把下面的程式碼存成一個 Python 檔案。把 frontmatter.load() 指向你的文章檔案,並將金鑰設定為環境變數(在 Git Bash 中使用 export DEVTO_API_KEY="your_key",或在 PowerShell 中使用 $env:DEVTO_API_KEY="your_key")。
import os
import frontmatter
import requests
URL = "https://dev.to/api/articles"
API_KEY = os.environ["DEVTO_API_KEY"]
post = frontmatter.load("posts/my-post.md")
article = {
"article": {
"title": post["title"],
"body_markdown": post.content,
"tags": post.get("tags", []),
# 可選:如果這篇文章也有發佈在你自己的部落格上
# "canonical_url": "https://your-blog.example.com/my-post",
"published": False
}
}
response = requests.post(
URL,
json=article,
headers={"api-key": API_KEY, "Content-Type": "application/json"}
)
if response.status_code == 201:
print("Draft Created:", response.json()["url"])
else:
print("Failed:", response.status_code, response.text)
把 requests.post() 和 curl 指令相比,你會發現它們送出的其實是同樣三樣東西:URL、標頭,以及 JSON 本文。兩者都是單純的 HTTP 請求。這個腳本只是幫你省去每次手動輸入的麻煩。
如果你的 Markdown 指向的是本機圖片,例如 ./imgs/screenshot.png,這些連結在 dev.to 上會失效。因為文章無法存取你的磁碟,所以你得手動上傳每張圖片。
解決方法是改用可公開存取的圖片網址——可以是你自己的部落格、GitHub,或其他圖片主機。當你透過 API 發佈時,dev.to 會抓取每張圖片並儲存自己的副本,因此文章在那邊看起來會和你本地端一樣。
注意:這個網址必須是公開的。位於登入後頁面或私有網路中的圖片無法載入。
透過 API 發佈,能把原本五分鐘的複製貼上流程變成一個指令。幾個小提醒:
canonical_url,讓搜尋引擎知道原始發佈位置。你是怎麼發佈到 dev.to 的——透過 API、編輯器,還是其他方式?我很想知道哪種方式對你最有效。
特別感謝 @pascal_cescato_692b7a8a20,因為他的精彩文章以及留言中的詳細說明,讓我有動力嘗試 dev.to API。
原文出處:https://dev.to/julies1/how-to-publish-posts-via-the-devto-api-2fkd