n8n 社群節點
給會讀原始碼的人的 文件分享節點
n8n-nodes-everypage 把工作流程中的任何 PDF 變成追蹤分享連結:二進位進,分享 URL + QR + 嵌入出,文件被閱讀的當下觸發經 HMAC 驗證的即時觸發器 — AI Agent 節點還能把這一切當作型別化工具來驅動。
節點如何運作.
一個節點、三種資源 — File、Link Variant 與 Event — 加上一個訂閱讀者活動的觸發節點。欄位名稱與 EveryPage 的 Zapier 及 Make 應用程式一致,工作流程跨平台轉換不必重新學習。
- 1
安裝社群節點
在自架的 n8n 上:Settings -> Community Nodes -> 安裝 n8n-nodes-everypage(或以 npm 安裝到 ~/.n8n/nodes)。套件沒有任何執行期依賴 — 這是通過驗證的社群節點的要求 — 您安裝的正是您能讀到的。
- 2
以 API 金鑰連接
在帳戶頁面建立金鑰(帳戶 -> API 金鑰 — 以 ep_live_ 開頭),貼入新的 EveryPage API 憑證。節點會立即向 API 驗證,Base URL 欄位只有在指向測試部署時才需要更改。
- 3
接進流程
把任何前一步的二進位資料交給節點,它會回傳分享三件組 — 連結、QR 碼、嵌入程式碼 — 供後續步驟使用。啟用觸發器時 Webhook 訂閱會自行註冊;停用即移除。伺服器上沒有任何要設定的東西。
幕後機制
每次遞送都經驗證
即時觸發器透過 HMAC-SHA256 簽章的 Webhook 送達,節點逐一驗證 — 常數時間的簽章比對,加上五分鐘的重放容許 — 之後您的工作流程才會執行。未通過驗證的遞送以 401 拒絕。
原生二進位
PDF 以 n8n 二進位資料傳遞 — 沒有「先上傳到 URL」的迂迴。代理、Code 節點或下載步驟直接交付位元組;QR 碼也以同樣方式回傳,是可直接用於列印與合併流程的 PNG。
為自架者而生
附獨立逐串流游標的輪詢後備模式,涵蓋無法接收入站 Webhook 的實例;MIT 授權的原始碼代表您能讀到實際執行的每一行;multipart 與 HMAC 管線只用 Node 內建模組。
您的資料保護長一眼放行的分析
閱讀測量不用 Cookie,讀者 IP 位址永不儲存 — 每位讀者取得的是加鹽的匿名化身分。如果您因為在乎資料的落腳處而自架工作流程,這就是同一種直覺,應用在文件分析上。
觸發器:當 EveryPage 發生這些事.
EveryPage Trigger 節點透過簽章 Webhook 訂閱九種事件 — 發生當下即推送 — 並為封閉網路提供輪詢後備。任何訂閱都可選擇只鎖定單一文件。
文件被閱讀
即時讀者看完了一份文件 — 附瀏覽頁數、停留時間、國家與連結變體歸因。
下載
即時有讀者(不是您)儲存了副本。記錄、評分或跟進。
表單填寫 / 電郵閘門擷取
即時 · Pro訪客完成了電郵閘門或潛在客戶表單 — 每個擷取欄位就緒可整形轉發,而潛在客戶還在閱讀中。
留言與回條
即時讀者在文件上留下意見,或確認收到文件 — 意見在對方仍停留頁面時送達,回條則是稽核軌跡的送達證明。
生命週期事件
即時連結耗盡瀏覽次數上限、連結背後的內容被替換、邀請被檢視、打樣選擇變更 — 讓下游系統保持誠實的維護事件。
輪詢模式
後備為無法接收入站 Webhook 的實例而設:依您的排程走訪事件饋送,配備獨立逐串流游標與帶命名空間的事件 ID — 不重複觸發,也不遺漏。
操作:一個節點,整套 API.
File、Link Variant 與 Event 資源,欄位型別化且依方案顯示。每個產出檔案的操作都輸出分享三件組 — 連結、QR URL、嵌入程式碼 — 鎖定耐久識別碼,永不依附可改名的短網址。
Upload
二進位 PDF 進,追蹤連結出 — 附完整的分層設定面:檢視模式、通行碼、到期或永不到期、電郵閘門、自訂短網址、浮水印、瀏覽上限、頁面範圍、保護開關、通知。
Import From URL
節點自行從 URL 抓取 PDF — 過程不附帶您的 EveryPage 憑證 — 然後上傳。
Get / Get Many / Update Settings
取得單一文件或列出全部(UUID 或短 ID),並就地變更任何設定子集 — 只傳送您加入的選項。
Replace Content
Pro替換連結背後的 PDF — UUID、短 ID、短網址、QR、設定與閱讀歷史全數保留。
Get QR Code
追蹤 QR 碼以二進位 PNG 輸出,可直接用於列印與合併流程。
Get Readership
依方案形狀的分析報告 — 摘要、漏斗、工作階段、聯絡人 — 以 JSON 交給下一個節點。
Link Variants
Pro建立、列出、更新、撤銷與刪除逐收件人追蹤連結 — 一份文件、逐人閱讀數據,內建 GDPR 標籤塗銷。
Events: Get Many
大量拉取事件饋送 — 瀏覽、下載、閘門 — 附 since 游標與 Return All 分頁,為增量倉儲載入而生。
Delete
預設移至垃圾桶 — 在清除日期前可還原,附收據 — 或永久清除。
給您的代理一份能證明被讀過的文件.
節點以 usableAsTool 出貨,n8n 的 AI Agent 節點可將 EveryPage 直接作為型別化工具呼叫:「上傳這份報告,給我追蹤連結」、「誰讀了 Q3 提案?」。把成果以追蹤連結發佈、而非附件的代理,是產出可以稽核的代理。
排程 → AI Agent → Code → EveryPage → Slack
匯入這個工作流程:AI 報告 → 追蹤連結 → Slack
每週一由 AI 代理撰寫週報,一個零依賴的 Code 節點把它渲染成 PDF,EveryPage 回傳追蹤連結,Slack 收到連結 — 您因此得知是否有人讀了代理的產出。複製 JSON 後直接貼到 n8n 畫布上(Ctrl/Cmd-V),或使用 Workflow -> Import from Clipboard。
{
"name": "AI report → EveryPage tracked link",
"nodes": [
{
"parameters": {
"content": "## AI report → tracked link\nEvery Monday an AI agent writes the weekly ops report, a Code node renders it to a PDF (no dependencies), and EveryPage turns it into a **tracked share link** — so you know whether anyone actually read what the agent produced.\n\nSwap the Slack step for email, Teams, or your CRM. Add `requireEmail: true` in the EveryPage node's options to gate the report (Pro).",
"height": 260,
"width": 420
},
"id": "a1b2c3d4-0000-4000-8000-000000000001",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-220, -180]
},
{
"parameters": {
"rule": {
"interval": [{ "field": "weeks", "triggerAtDay": [1], "triggerAtHour": 8 }]
}
},
"id": "a1b2c3d4-0000-4000-8000-000000000002",
"name": "Every Monday 08:00",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [-220, 60]
},
{
"parameters": {
"promptType": "define",
"text": "Write this week's operations report for the team: a short executive summary, then sections for shipped work, metrics, risks, and next week's focus. Plain text, no markdown syntax. Around 500 words.",
"options": {}
},
"id": "a1b2c3d4-0000-4000-8000-000000000003",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.7,
"position": [0, 60]
},
{
"parameters": {
"model": { "__rl": true, "value": "gpt-4.1-mini", "mode": "list" },
"options": {}
},
"id": "a1b2c3d4-0000-4000-8000-000000000004",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [0, 260]
},
{
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "// Render plain text to a minimal, valid, multi-page PDF - no dependencies.\nconst esc = (s) => s.replace(/\\\\/g, '\\\\\\\\').replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\nconst text = String($input.first().json.output ?? $input.first().json.text ?? 'Empty report');\n\nconst lines = [];\nfor (const raw of text.split('\\n')) {\n let line = raw.replace(/[^\\x20-\\x7e]/g, '');\n if (line === '') { lines.push(''); continue; }\n while (line.length > 92) { lines.push(line.slice(0, 92)); line = line.slice(92); }\n lines.push(line);\n}\nconst pages = [];\nfor (let i = 0; i < lines.length; i += 46) pages.push(lines.slice(i, i + 46));\nif (!pages.length) pages.push(['(empty)']);\n\nconst pageCount = pages.length;\nconst fontObj = 3 + pageCount * 2;\nconst objects = [];\nobjects[1] = '<< /Type /Catalog /Pages 2 0 R >>';\nobjects[2] = `<< /Type /Pages /Kids [${pages.map((_, p) => `${3 + p * 2} 0 R`).join(' ')}] /Count ${pageCount} >>`;\npages.forEach((pg, p) => {\n const contentObj = 4 + p * 2;\n objects[3 + p * 2] = `<< /Type /Page /Parent 2 0 R /MediaBox [0 0 595 842] /Resources << /Font << /F1 ${fontObj} 0 R >> >> /Contents ${contentObj} 0 R >>`;\n let stream = 'BT /F1 11 Tf 56 780 Td 16 TL\\n';\n for (const line of pg) stream += `(${esc(line)}) Tj T*\\n`;\n stream += 'ET';\n objects[contentObj] = `<< /Length ${stream.length} >>\\nstream\\n${stream}\\nendstream`;\n});\nobjects[fontObj] = '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>';\n\nlet pdf = '%PDF-1.4\\n';\nconst offsets = [];\nfor (let n = 1; n <= fontObj; n++) {\n offsets[n] = pdf.length;\n pdf += `${n} 0 obj\\n${objects[n]}\\nendobj\\n`;\n}\nconst xref = pdf.length;\npdf += `xref\\n0 ${fontObj + 1}\\n0000000000 65535 f \\n`;\nfor (let n = 1; n <= fontObj; n++) pdf += `${String(offsets[n]).padStart(10, '0')} 00000 n \\n`;\npdf += `trailer\\n<< /Size ${fontObj + 1} /Root 1 0 R >>\\nstartxref\\n${xref}\\n%%EOF`;\n\nconst fileName = `weekly-report-${new Date().toISOString().slice(0, 10)}.pdf`;\nconst binaryData = await this.helpers.prepareBinaryData(Buffer.from(pdf, 'latin1'), fileName, 'application/pdf');\nreturn [{ json: { fileName }, binary: { data: binaryData } }];"
},
"id": "a1b2c3d4-0000-4000-8000-000000000005",
"name": "Render PDF",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [280, 60]
},
{
"parameters": {
"resource": "file",
"operation": "upload",
"binaryPropertyName": "data",
"fileName": "={{ $json.fileName }}",
"options": {
"viewerMode": "flipbook",
"notifyOnView": true,
"expiryHours": 168
}
},
"id": "a1b2c3d4-0000-4000-8000-000000000006",
"name": "EveryPage",
"type": "n8n-nodes-everypage.everyPage",
"typeVersion": 1,
"position": [560, 60]
},
{
"parameters": {
"select": "channel",
"text": "=📄 This week's report is live: {{ $json.shareUrl }}\nEveryPage will tell us who actually reads it.",
"otherOptions": {}
},
"id": "a1b2c3d4-0000-4000-8000-000000000007",
"name": "Post link to Slack",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [840, 60]
}
],
"connections": {
"Every Monday 08:00": { "main": [[{ "node": "AI Agent", "type": "main", "index": 0 }]] },
"AI Agent": { "main": [[{ "node": "Render PDF", "type": "main", "index": 0 }]] },
"OpenAI Chat Model": {
"ai_languageModel": [[{ "node": "AI Agent", "type": "ai_languageModel", "index": 0 }]]
},
"Render PDF": { "main": [[{ "node": "EveryPage", "type": "main", "index": 0 }]] },
"EveryPage": { "main": [[{ "node": "Post link to Slack", "type": "main", "index": 0 }]] }
},
"active": false,
"settings": { "executionOrder": "v1" },
"pinData": {}
}
自架提醒:社群節點工具需要設定 N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true,AI Agent 節點才能呼叫它們。
為打造 n8n 的人而生.
節點從第一天就能勝任的四種工作流程。
自架維運
事件進倉儲,沒有中間人
Events: Get Many 以 since 游標將饋送分頁匯入 Postgres 或 BigQuery — 文件互動加入您自己的分析堆疊,中間沒有第三方雲端。
AI 代理建造者
能證明被讀過的報告
代理以追蹤連結而非附件發佈報告 — 首次閱讀時您會收到通知,閱讀報告會說出每個人實際讀到哪裡。
閘門潛在客戶 → CRM
對方還在讀,名單已進 CRM
即時表單觸發器整形擷取欄位並轉發給業務 — 可匯入的 gated-leads-to-crm 工作流程隨節點附上。
聊天代理
能回答「誰讀了它?」的代理
把 EveryPage 操作作為工具掛上聊天代理,它就能列出您的文件並隨需調閱閱讀數據 — agent-with-everypage-tool 工作流程示範了這個模式。
各方案解鎖的功能.
節點免費安裝,且可在所有 EveryPage 方案上連接。超出您層級的欄位會在說明中註明並連結定價頁;若執行仍觸及伺服器端限制,錯誤訊息會指名方案 — 絕不是一個光禿禿的 403。
| 在 n8n 節點中 | 免費 | Basic | Pro |
|---|---|---|---|
| 閱讀、下載、留言、回條與生命週期觸發器 — Webhook 與輪詢皆可 | ✓ | ✓ | ✓ |
| Upload、Import、Get/List、Update Settings、QR、Readership、Events 與 Delete 操作 | ✓ | ✓ | ✓ |
| 上傳時的保護開關(封鎖右鍵、列印、複製) | — | ✓ | ✓ |
| 表單填寫 / 電郵閘門擷取觸發器 | — | — | ✓ |
| Link Variants 與 Replace Content 操作 | — | — | ✓ |
n8n 常見問題.
我能用 EveryPage 的 n8n 節點自動化什麼?
文件流程的雙向。操作把工作流程中的任何二進位 PDF 變成附 QR 與嵌入程式碼的追蹤分享連結、管理設定與逐收件人連結變體、替換運作中連結背後的內容,並為您的資料倉儲大量匯出讀者事件。觸發節點在文件被閱讀、下載、留言、確認收到、通過閘門或燒毀的當下啟動工作流程 — 透過經驗證的 Webhook 或輪詢後備。
EveryPage 是擁有 n8n 整合的 DocSend 替代方案嗎?
是 — DocSend 完全沒有 n8n 節點。如果您想要住在自己工作流程裡的 DocSend 式文件追蹤,EveryPage 以原生二進位節點、經驗證的即時觸發器,以及不儲存讀者 IP 位址、符合 GDPR 的分析完成這件事 — 定價固定而非按人頭計費。
觸發器是即時的嗎?Webhook 有驗證嗎?
預設即時:啟用觸發器會註冊 Webhook 訂閱,事件在發生當下即推送。每次遞送都經驗證 — HMAC-SHA256 簽章、常數時間比對、五分鐘重放容許 — 未通過驗證的遞送以 401 拒絕。無法接收入站 Webhook 的實例可用輪詢模式,以逐串流游標走訪事件饋送,不重複觸發也不遺漏。
n8n 的 AI Agent 節點如何使用 EveryPage?
節點標記為 usableAsTool,AI Agent 節點可將其操作作為型別化工具呼叫 — 上傳產生的報告並回傳追蹤連結、查詢誰讀了某份文件、調閱閱讀摘要。在自架 n8n 上,設定 N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true;本頁與套件中的可匯入工作流程都是可運作的代理範例。
我能在 n8n Cloud 上安裝嗎?需要哪個方案?
自架優先:套件名為 n8n-nodes-everypage,在 npm 上線後即可從 Community Nodes 面板安裝 — 發佈正在進行中,n8n Cloud 的社群節點驗證也在同步推進。節點包裝的 API 今天就在所有 EveryPage 方案上開放(見開發者文件)。方案方面一切免費連接;表單觸發器、Link Variants 與 Replace Content 屬 Pro,因為它們驅動的產品功能是 Pro。
追蹤連結一定會到期嗎?
不會 — 到期是您逐份文件設定的控制項,永遠不是預設值。給連結一個到期日、一個瀏覽次數上限,或兩者都不設;在 Pro 方案上,連結可設為永不到期,工作流程發佈的連結想留多久就留多久。工作流程也能透過 Update Settings 自行管理到期。
在每個工作流程的終點放一個追蹤連結.
安裝節點、貼上 API 金鑰,您的工作流程產出的下一份文件就會告訴您有沒有人讀過 — 逐頁回報,經由您能驗證的 Webhook。
比較方案相關: 所有整合 · Make 整合 · 原生 Webhook · DocSend 替代方案 · 不儲存 IP 的 PDF 分享