博客 / 詳情

返回

自動化我的友鏈申請腳本:讓孤島互相連起來

友鏈這東西,説出來有點浪漫。

2025 年了,個人博客基本沒有什麼流量,更多像是一座座散落在海上的小島。
偶爾有海風吹過,但大多數時候,就是悄悄發光、自娛自樂。

而友鏈……就像是在這些小島之間鋪上一條條細細的橋。
你看不到橋的盡頭,但知道那裏至少還有一個同樣孤獨、同樣固執的人。


為什麼拖了這麼久才開放友鏈申請?

剛寫博客那陣子,我其實沒太敢申請友鏈。不是因為不想被發現,而是因為我真的是那種比較內向的類型。

內容少也不自信,總覺得“我這樣去申請友鏈,會不會顯得很冒失?”
再加上每個人對友鏈的理解都不太一樣:

  • 有人只收特定領域的高質量博客
  • 有人覺得必須線下認識
  • 也有人堅持要有一定的線上互動次數

即便對方沒有列要求,我心裏還是會嘀咕:“我們不熟,貿然提出會不會不太禮貌?”

傳統的友鏈申請方式大多是:留言、郵件,或在 GitHub 提 issue。看似簡單,但對我這種“有自助收銀台絕不走人工”的 I 人來説,其實是需要一點點勇氣的。

直到有一次,我在看一位老師的博客時,看到有人問:“這麼多友鏈,你是怎麼維護的?”
老師回: “腳本。”

那一瞬間我有點被點醒了:
既然我不好意思主動打招呼,那是不是可以先讓別人跟我打招呼不要那麼困難?


説幹就幹:自動化友鏈要處理些什麼?

為了做到“自動添加”,其實需要處理的事情很簡單:

  1. 對方網站必須能訪問
  2. 不能讓廣告站點鑽空子
  3. 對方真得掛上了我的友鏈

於是我要求申請方提供友鏈頁地址,然後腳本負責驗證:

  • 確認主站是正常可訪問的
  • 主站域名與友鏈頁域名一致(避免廣告跳轉)
  • 友鏈頁中確實存在我的網站

通過就添加,沒通過就直接拒絕,簡單粗暴但有效。


技術實現:我是怎麼做的?

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. 檢查對方是否掛了我的鏈接

為了避免“我掛你,你不掛我或者廣告”的情況出現,腳本會:

  1. 訪問對方主站
  2. 檢查友鏈頁是否同域
  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,也可以在本站的文章中看到完整的代碼實現

user avatar _raymond 頭像 tekin_cn 頭像 643104191 頭像 hooray 頭像 yaochujiadejianpan 頭像 powerful_simon 頭像 smalike 頭像 mosong 頭像
8 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.