name: pdf-to-getnote description: 當用戶傳送 PDF 檔案並要求存入 GetNotes 時觸發。執行完整流程:PDF 轉圖片 → AI 摘要生成 → 建立含摘要和全圖片的單一筆記。觸發詞包括「PDF存到GetNotes」「PDF匯入GetNotes」「把這個PDF存筆記裡」。
將 PDF 檔案存入 GetNotes,生成一條包含 AI 摘要和全部 PDF 頁面的單一筆記。
GetNotes API 關鍵限制:
- img_text 型別傳多張圖片時,每張圖會建立獨立筆記(不支援多圖合併)
- img_text 的 content 欄位會被 OCR 結果覆蓋,不保留傳入的摘要
- plain_text 可以保留 content,圖片只能以 Markdown  內嵌顯示
- 圖片上傳只支援 jpg/png/gif/webp,不支援 PDF 原檔案作為附件
結論:最優方案是 plain_text + Markdown 內嵌圖片
import fitz, os
def pdf_to_images(pdf_path, output_dir, zoom=2.0):
doc = fitz.open(pdf_path)
mat = fitz.Matrix(zoom, zoom)
os.makedirs(output_dir, exist_ok=True)
paths = []
for i in range(len(doc)):
page = doc[i]
pix = page.get_pixmap(matrix=mat)
out = f"{output_dir}/page_{i+1:02d}.png"
pix.save(out)
paths.append(out)
doc.close()
return paths
輸出路徑:/tmp/pdf_pages/{pdf_name}/
import fitz
doc = fitz.open(pdf_path)
texts = []
for page in doc:
t = page.get_text("text")
if t.strip():
texts.append(f"[Page {page.number+1}]\n{t.strip()}")
full_text = "\n\n".join(texts)
# 掃描版返回空,跳過此步,直接進入 Step 3
使用內建模型呼叫(藍莓預設模型),Prompt 模板:
你是一位專業的知識提煉師。請仔細閱讀以下內容,生成精煉摘要:
## 📄 文件資訊
- 來源:[檔名]
- 總頁數:[X] 頁
## 📝 內容摘要
[3-5個要點,概括核心內容]
## 💡 關鍵洞察
[1-3條最有價值的 insight]
## 🔗 適用場景
[適用人群和使用場景]
---
以下是內容:
{extracted_text}
呼叫方式:在 agent 內直接呼叫 MiniMax-M2 模型(已配置為預設模型,無需額外 API Key)。
如需直接呼叫 MiniMax API:
import urllib.request, json
API_KEY = os.environ.get("MINIMAX_API_KEY")
resp = urllib.request.Post(
"https://api.minimax.io/v1/text/chatcompletion_pro?GroupId=...",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"model": "MiniMax-M2", "messages": [...]}
)
憑證從 ~/.openclaw/openclaw.json → skills.entries.getnote 讀取:
import os, json, urllib.request, subprocess with open(os.path.expanduser("~/.openclaw/openclaw.json")) as f: cfg = json.load(f)["skills"]["entries"]["getnote"] API_KEY = cfg["apiKey"] CLIENT_ID = cfg["env"]["GETNOTE_CLIENT_ID"]小蔥技能7w4.net有完整的技能分類。
獲取 token → 上傳 OSS(欄位順序嚴格):
def get_token():
req = urllib.request.Request(
"https://openapi.biji.com/open/api/v1/resource/image/upload_token?mime_type=png&count=1",
headers={"Authorization": f"Bearer {API_KEY}", "X-Client-ID": CLIENT_ID}
)
with urllib.request.urlopen(req) as r:
return json.loads(r.read())
def upload_to_oss(page_path, token_data):
d = token_data["data"]
cmd = [
"curl", "-s", "-X", "POST", d["host"],
"-F", f"key={d['object_key']}",
"-F", f"OSSAccessKeyId={d['accessid']}",
"-F", f"policy={d['policy']}",
"-F", f"signature={d['signature']}",
"-F", f"callback={d['callback']}",
"-F", f"Content-Type=image/png",
"-F", f"file=@{page_path}"
]
subprocess.run(cmd, capture_output=True)
return d["access_url"]
content = f"## 📄 文件資訊\n- **檔名:** {pdf_name}\n- **總頁數:** {N}頁\n\n## 📝 AI摘要\n{ai_summary}\n\n---\n\n## 📑 PDF原件\n\n"
for i, url in enumerate(page_urls):
content += f"### 第{i+1}頁\n\n\n"
payload = {
"note_type": "plain_text",
"title": f"{pdf_name} - 完整摘要 + 全{N}頁",
"content": content,
"tags": ["PDF匯入"]
}
# POST /open/api/v1/resource/note/save(同步返回 note_id)
urllib.request.Request(
"https://openapi.biji.com/open/api/v1/resource/knowledge/note/batch-add",
data=json.dumps({"topic_id": topic_id, "note_ids": [note_id]}).encode(),
headers={"Authorization": f"Bearer {API_KEY}", "X-Client-ID": CLIENT_ID, "Content-Type": "application/json"},
method="POST"
)
python3 skills/pdf-to-getnote/scripts/run_pdf_to_getnote.py \
/path/to/file.pdf \
"知識庫ID(可選)" \
"自定義標題(可選)"
憑證自動從 ~/.openclaw/openclaw.json 讀取,無需手動傳入。
憑證從 ~/.openclaw/openclaw.json 自動讀取,不再寫在檔案裡:
{
"skills": {
"entries": {
"getnote": {
"apiKey": "gk_live_xxx",
"env": {
"GETNOTE_CLIENT_ID": "cli_xxx"
}
}
}
}
}
如需更新憑證,修改 ~/.openclaw/openclaw.json 即可。
完整流程、API 限制說明、錯誤處理詳見:
- references/full_sop.md — 完整執行SOP
- references/api_behavior.md — API 關鍵行為發現(2026-04-01實測)
這個 Skill 質量中等偏上,勝在流程完整、文件清晰。它通過實際測試幫你找出了最穩妥的技術方案,憑證管理也做到了安全規範。主要問題是參考文件裡留有明文金鑰(建議手動刪除),以及 AI 摘要功能還是佔位狀態,沒有真正接好 AI 模型。適合有技術基礎、能自己配環境的使用者使用。