sfappAPI 文件

上傳圖片與設定封面

封面圖只接受本平台的圖片網址。外站網址與別家商店的圖片回 422 cover_image_not_owned

上傳並設為封面

  1. POST /v1/media/images 上傳檔案,內容型別 multipart/form-data,欄位名 file
  2. 從回應取出 url
  3. url 原樣填進建立或更新文章的 cover_image_url
  4. 讀回文章,cover_image.url 是同一個值,cover_image.path 是站內相對路徑。

上傳需要 write_media 權限範圍,設封面需要 write_blog

import { readFile } from "node:fs/promises";

const baseUrl = "https://api.sfec.cloud";
const auth = { Authorization: `Bearer ${process.env.SFAPP_KEY}` };

const form = new FormData();
form.append("file", new Blob([await readFile("cover.jpg")]), "cover.jpg");

const image = await fetch(`${baseUrl}/v1/media/images`, {
  method: "POST",
  headers: auth,
  body: form,
}).then((response) => response.json());

await fetch(`${baseUrl}/v1/blog/posts/1001`, {
  method: "PATCH",
  headers: { ...auth, "Content-Type": "application/json" },
  body: JSON.stringify({ cover_image_url: image.url }),
});

const post = await fetch(`${baseUrl}/v1/blog/posts/1001`, { headers: auth }).then(
  (response) => response.json(),
);
console.log(post.cover_image);

讀出處理後的結果

回應的 widthheightbytes 描述的是處理後的結果。伺服器的處理規則見 圖片,數值上限見 限制與配額

cover_image_url 只能更換,不接受 null

刪除圖片

DELETE /v1/media/images/{id}id 是上傳回應的 idimg_ 開頭)。成功回 204。

刪除前先用 PATCH /v1/blog/posts/{id} 換掉封面或移除內文引用。仍被引用時回 409 image_in_use,處理方式見 圖片

curl -sS -X DELETE https://api.sfec.cloud/v1/media/images/img_57 \
  -H "Authorization: Bearer $SFAPP_KEY" \
  -o /dev/null -w '%{http_code}\n'

檢查功能開關

先讀 GET /v1/mefeatures,再決定是否呼叫。

開關 false
features.media_upload 上傳與刪除端點回 404 feature_unavailable
features.cover_image cover_image_url 回 422 validation_failed,讀回的 cover_image 兩個欄位固定為 null