友鏈這東西,説出來有點浪漫。
2025 年了,個人博客基本沒有什麼流量,更多像是一座座散落在海上的小島。
偶爾有海風吹過,但大多數時候,就是悄悄發光、自娛自樂。
而友鏈……就像是在這些小島之間鋪上一條條細細的橋。
你看不到橋的盡頭,但知道那裏至少還有一個同樣孤獨、同樣固執的人。
為什麼拖了這麼久才開放友鏈申請?
剛寫博客那陣子,我其實沒太敢申請友鏈。不是因為不想被發現,而是因為我真的是那種比較內向的類型。
內容少也不自信,總覺得“我這樣去申請友鏈,會不會顯得很冒失?”
再加上每個人對友鏈的理解都不太一樣:
- 有人只收特定領域的高質量博客
- 有人覺得必須線下認識
- 也有人堅持要有一定的線上互動次數
即便對方沒有列要求,我心裏還是會嘀咕:“我們不熟,貿然提出會不會不太禮貌?”
傳統的友鏈申請方式大多是:留言、郵件,或在 GitHub 提 issue。看似簡單,但對我這種“有自助收銀台絕不走人工”的 I 人來説,其實是需要一點點勇氣的。
直到有一次,我在看一位老師的博客時,看到有人問:“這麼多友鏈,你是怎麼維護的?”
老師回: “腳本。”
那一瞬間我有點被點醒了:
既然我不好意思主動打招呼,那是不是可以先讓別人跟我打招呼不要那麼困難?
説幹就幹:自動化友鏈要處理些什麼?
為了做到“自動添加”,其實需要處理的事情很簡單:
- 對方網站必須能訪問
- 不能讓廣告站點鑽空子
- 對方真得掛上了我的友鏈
於是我要求申請方提供友鏈頁地址,然後腳本負責驗證:
- 確認主站是正常可訪問的
- 主站域名與友鏈頁域名一致(避免廣告跳轉)
- 友鏈頁中確實存在我的網站
通過就添加,沒通過就直接拒絕,簡單粗暴但有效。
技術實現:我是怎麼做的?
1. 友鏈數據剝離成 JSON(重點)
一開始我的友鏈是寫在 Astro 的頁面裏的。
但這意味着:
改一個字 → 就得重新打包部署
非常麻煩。
後來改用 SSR(服務端渲染) 後,我意識到:
完全沒必要把友鏈打包進頁面裏。
數據完全可以在服務端“即時讀取”。
於是我把友鏈抽成一個 links.json 文件,並且 不再使用 import 引入它。
因為一旦 import,它就會在構建時被寫死。
正確的方式是:
const raw = await fs.readFile(linksPath, 'utf-8')
const { friends } = JSON.parse(raw)
這樣:
- JSON 是獨立的數據源
- SSR 每次渲染頁面都會讀取到最新內容
- 修改 JSON \= 友鏈立即生效
- 無需重新打包
這也是我把友鏈從頁面剝離出來的根本原因。
2. 頭像檢查 + 上傳 OSS
用户提交的頭像鏈接永遠無法保證靠譜:
- 有的不是圖片
- 有的沒 content-type
- 有的會失效
我的解決方案是:
- 先判斷擴展名是否是圖片
- 再通過請求檢查 content-type
- 最後統一上傳到 OSS
我用的是 ossutil ——
因為它是 CLI,不需要把 AccessKey 寫進代碼裏,對我這種 Node 不熟練的人來説更安全。
(當然也可以不用 OSS,不過不管是速度還是穩定性都不如 OSS 省心)
3. 檢查對方是否掛了我的鏈接
為了避免“我掛你,你不掛我或者廣告”的情況出現,腳本會:
- 訪問對方主站
- 檢查友鏈頁是否同域
- 抓取頁面,看是否包含我的鏈接
確認通過,才會添加。
4. 自動更新 JSON + 順手 Git 提交
友鏈通過驗證後,腳本會:
- 把條目寫入
links.json - 自動執行
git add → commit → push
因為是 SSR,頁面下一次請求時就會看到最新的友鏈數據。
不需要重新打包,也不需要重新部署。
整個流程非常輕量。
SSR 這個環節的重要性
在寫腳本之前,我也想過純靜態博客能不能實現自動化友鏈。
答案是:能,但非常折騰,不值得。
純靜態的問題:
- 頁面打包後就是死的,無法在服務端執行校驗邏輯
- 用户無法直接讓服務器寫入文件
- 想走 GitHub Actions,需要用户先有權限 push(顯然不行)
雖然理論上可以:
- 表單提交 → 雲函數寫文件 → 雲函數 push GitHub → Actions 構建 → 部署
但整個鏈路太長太容易出問題。
相比之下:
SSR:寫一個 API 就全部搞定
Cloudflare、Vercel 都能跑 SSR
甚至沒服務器也能跑
所以最後我還是選擇了最乾淨、最好理解、擴展性最高的方案:
在 SSR 里加一個接口,讓它幫我跑腳本、改 JSON、推 Git 就完事了。
最後的一點小感慨
整個自動化流程,説白了,就是給像我這樣的 I 人一點點緩衝空間。
我非常尊重那些堅持手工審核友鏈的朋友
那是對自己博客節奏和邊界的堅持,我完全理解。
但我也知道,有不少朋友可能跟我一樣:
- 覺得對方的博客不錯
- 想互相交換友鏈
- 卻遲遲按不下那個“開口”的按鈕
這個腳本解決不了我鼓起勇氣去申請別人友鏈的問題。
但至少 如果你也是這樣的 I 人,來我的博客交換友鏈時,你完全可以毫無心理負擔
想找我交換友鏈的朋友,歡迎直接訪問我的博客 hejunjie.life,也可以在本站的文章中看到完整的代碼實現