Skip to content

allen0099/CF-test

 
 

Repository files navigation

Meta Facebook 分享連結預覽好幫手 🙌

在社群媒體和通訊軟體中分享 Facebook 連結時,自動產生豐富的預覽資訊(Open Graph / Twitter Card / Telegram)的神奇魔法!✨

部署於 Cloudflare Workers,透過 KV 快取 metadata、Telegram Bot 管理封鎖清單、每次請求即時推送 Telegram log。

功能特色

  • 🔗 連結預覽代理 — 將 Facebook 分享連結轉為帶有 OG meta tags 的頁面,讓各平台正確顯示預覽
  • KV 快取 — 解析過的 metadata 存入 Cloudflare KV,避免重複抓取(預設 TTL 1 小時)
  • 📋 Telegram Log — 每次連結請求自動推送通知至 Telegram(含 URL、訪客 IP、快取狀態、封鎖狀態),支援 Forum thread 模式
  • 🚫 連結封鎖機制 — 支援 domain + path glob 模式封鎖,違規連結返回 403 頁面
  • 🤖 Telegram Bot 管理 — 透過 Bot 指令管理連結封鎖清單,支援多管理員
  • 🛡️ XSS 防護 — 所有動態 metadata 皆經過 HTML 轉義

如何使用

使用方式

將 Facebook 分享連結中的 https://www.facebook.com 替換成本服務的 domain 即可。

支援的連結格式:

Facebook 原始連結 代理連結
https://www.facebook.com/share/{type}/{id} https://YOUR_DOMAIN/share/{type}/{id}
https://www.facebook.com/share/{id} https://YOUR_DOMAIN/share/{id}
https://www.facebook.com/{username}/posts/{id} https://YOUR_DOMAIN/{username}/posts/{id}

訪問代理連結後,爬蟲會看到完整的 OG 預覽,一般使用者則在 2 秒後自動跳轉至原始 Facebook 頁面。

部署

前置需求

步驟

  1. 建立 KV Namespace
npx wrangler kv namespace create METADATA_CACHE
npx wrangler kv namespace create BLOCKLIST

將回傳的 id 填入 wrangler.jsonc 中的 kv_namespaces

  1. 設定環境變數

wrangler.jsoncvars 中設定:

變數 說明 預設值
TELEGRAM_LOG_LEVEL Log 層級 "all"
CACHE_TTL KV 快取 TTL(秒) "3600"
TELEGRAM_ADMIN_IDS 允許管理封鎖清單的 Telegram user ID(逗號分隔) ""
TELEGRAM_THREAD_ID Telegram Forum 話題 ID(留空則發送到一般群組) ""
  1. 設定 Secrets

以下為敏感資訊,透過 wrangler secret put 設定,不會出現在程式碼或設定檔中:

npx wrangler secret put TELEGRAM_BOT_TOKEN
npx wrangler secret put TELEGRAM_CHAT_ID
npx wrangler secret put TELEGRAM_WEBHOOK_SECRET
Secret 說明 取得方式
TELEGRAM_BOT_TOKEN Telegram Bot API token 透過 @BotFather 建立 Bot 後取得
TELEGRAM_CHAT_ID 接收 log 的 Telegram 群組/頻道 ID 將 Bot 加入群組後,透過 getUpdates API 查看
TELEGRAM_WEBHOOK_SECRET Webhook 驗證用的隨機 secret 自行產生(見下方說明)

產生 TELEGRAM_WEBHOOK_SECRET

使用任何安全的隨機字串產生方式,例如:

# Node.js
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

# PowerShell
-join ((1..32) | ForEach-Object { '{0:x2}' -f (Get-Random -Max 256) })

複製產生的字串,用於 wrangler secret put 和註冊 webhook 時的 secret_token 參數(兩者必須相同)。

  1. 部署
npx wrangler deploy
  1. 註冊 Telegram Webhook

部署完成後,向 Telegram 註冊 webhook,讓 Bot 指令能被 Worker 接收處理:

curl "https://api.telegram.org/bot<BOT_TOKEN>/setWebhook?url=https://YOUR_DOMAIN/webhook/telegram&secret_token=<WEBHOOK_SECRET>"

<BOT_TOKEN> 替換為你的 Bot token,YOUR_DOMAIN 替換為 Worker 的 domain,<WEBHOOK_SECRET> 必須與步驟 3 設定的 TELEGRAM_WEBHOOK_SECRET 相同。

驗證 webhook 是否設定成功:

curl "https://api.telegram.org/bot<BOT_TOKEN>/getWebhookInfo"

取得 TELEGRAM_THREAD_ID(Forum 群組):

如果你的 Telegram 群組啟用了 Forum(話題)模式,需要指定 thread ID 才能將訊息發送到正確的話題:

  1. 在目標話題中發送一則訊息
  2. 呼叫 https://api.telegram.org/bot<BOT_TOKEN>/getUpdates
  3. 在回傳的 JSON 中找到該訊息的 message_thread_id
  4. 將該值填入 wrangler.jsoncTELEGRAM_THREAD_ID

本機開發

npx wrangler dev

Telegram Bot 指令

透過 Telegram Bot 管理封鎖清單(需在 TELEGRAM_ADMIN_IDS 中的使用者):

連結封鎖

指令 說明
/block <pattern> [reason] 新增封鎖規則(支援 glob,如 *.example.comexample.com/path/*
/unblock <rule_id> 刪除指定封鎖規則
/list 列出所有連結封鎖規則

其他

指令 說明
/help 顯示所有指令說明

架構

Request → Route Matching → Blocklist Check (input URL)
                              ↓
                        Fetch Metadata (KV Cache → Facebook)
                              ↓
                        Blocklist Check (resolved og:url)
                              ↓
                        Generate HTML (escaped OG/Twitter/Telegram meta)
                              ↓
                        Response + Telegram Log (async, non-blocking)

License

MIT License

About

Avoid the boring "Login or sign up to view", provides the meaningful social media link preview in FB share link.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • JavaScript 99.2%
  • Dockerfile 0.8%