每次我把文章複製到 dev.to 編輯器、加上標籤並整理格式時,我都會想:有沒有辦法把這件事自動化?如果你也有同樣的疑問,這篇文章就是為你寫的。

答案是:dev.to API。

在這篇文章中,我會示範兩種使用方式。首先是 curl 指令,讓你看到 API 期待的實際請求格式。接著是用 Python 寫的腳本,來自動完成這件事。我也會提到最容易讓人卡住的部分:圖片。

取得你的 dev.to API 金鑰

首先你需要一組 API 金鑰。

在你的 dev.to 帳號中,前往 Settings → Extensions → DEV Community API Keys。替你的金鑰取個名稱,然後點擊 Generate API Key。

接著展開按鈕下方的 Active API Keys 清單,點擊你的金鑰旁邊的箭頭即可顯示它。

不要把金鑰直接貼進原始碼裡。Python 版本會從環境變數讀取它。

作法 1(入門範例):在命令列使用 curl

先從一個簡單範例開始,讓你看看整個流程背後的 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 是個不錯的選擇。

作法 2(推薦):使用 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,讓搜尋引擎知道原始發佈位置。
  • 關於 API 的所有參數,可以參考 API 文件。
  • 請把你的 API 金鑰放在環境變數中,並且絕不要提交到公開的 repo。

你是怎麼發佈到 dev.to 的——透過 API、編輯器,還是其他方式?我很想知道哪種方式對你最有效。

特別感謝 @pascal_cescato_692b7a8a20,因為他的精彩文章以及留言中的詳細說明,讓我有動力嘗試 dev.to API。


原文出處:https://dev.to/julies1/how-to-publish-posts-via-the-devto-api-2fkd


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
252
🥈
mike
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登