前兩天把部落格文章從 Typecho 遷移到 Hugo,光是設定 Front Matter 參數和重新配置圖片連結就費了很大功夫。
一個部落格的價值,首先是文章,緊接著就是評論。評論證明部落格在網際網路和真實世界產生的影響,承載了人與人之間的交互關係。私心一點地說,五湖四海的評論是重要的回憶,是構成「我」的一部分。
所以,將原站評論 copy 到新站的對應文章下是很有必要的。
配置 Waline
相比於 Wordpress、Typecho 等動態部落格,靜態部落格只能外掛評論系統,選擇眾多,各有優劣。在參考了這篇文章和查閱各個評論系統官網後,我最終選擇Waline。
Waline 的中文文檔內容翔實,設置LeanCloud數據庫和Vercel 服務端後即可進入評論管理後台 https://<你的服務端域名>/ui/ 。首次註冊成為管理員,在這裡可以管理評論和用戶。
導出 Typecho 評論
Typecho 太老了,用戶少,不如 Hexo、Wordpress 等社區活躍,網際網路上資料也很少。
筆者僅找到大佬怡紅院落寫的一個 Typecho 導出評論到 Valine 的插件 Export2Valine(也是 Waline 文檔中的)。
但上次更新是三年前,經測試已經失效,僅能導入第一條評論。查看導出的 jsonl 文件,顯然評論數據都已經完全導出。
先將該插件安裝到 Typecho (注意更改插件文件夾名稱為 “Export2Valine” !)。
參考這一篇 Typecho 遷移到 Hexo 的文章,該插件年久失修,需要作一些更改。
找到插件文件夾下的 Action.php ,第 42 行開始改成如下代碼(追蹤父評論):
$arr = array(
"objectId" => $comment["coid"],
"QQAvatar" => "",
"comment" => $comment["text"],
"insertedAt" => array(
"__type" => "Date",
"iso" => $time
),
"createdAt" => $time,
"updatedAt" => $time,
"ip" => $comment["ip"],
"link" => $comment["url"],
"mail" => $comment["mail"],
"nick" => $comment["author"],
"ua" => $comment["agent"],
"url" => "/{$slug}.html"
);
if($comment["parent"]) {
$arr["pid"] = $comment["parent"];
$arr["rid"] = $this->getRootId($comment["coid"]);
}
其他部分不用修改。
接著在 Typecho 後台-控制台-評論導出,打開下載的 jsonl 文件,刪除開頭的 #filetype:JSON-streaming {"type":"Class","class":"Comment"}\n\n 。
保存後關閉文件,將文件拓展名改為 .json 。
修正 json 格式
導出文件 jsonl 內中文都用轉義,只有一行,看起來一團亂麻。
為轉化成便於閱讀、編輯與導入的 json 格式,我們先利用編輯器的查找與替換功能,將 }\n{ 替換為
},
{
Xcode 的替換,換行符可以點擊左側小放大鏡標選擇插入。
此時每行一個評論對象。
同樣,將各個評論對象內的字段結構分開,將 "," 替換為
",
"
此時,我們可以看出每個評論對象內包含多個數據,形似
{"objectId":"3",
"QQAvatar":"",
"comment":"\u6d4b\u8bd5\u4e00\u4e0b",
"insertedAt":{"__type":"Date",
"iso":"2023-06-27T09:37:07.000Z"},"createdAt":"2023-06-27T09:37:07.000Z",
"updatedAt":"2023-06-27T09:37:07.000Z",
"ip":"223.104.150.16",
"link":**null**,"mail":"2868301418@qq.com",
"nick":"2868301418",
"ua":"Mozilla\/5.0 (Linux; Android 13; V2171A Build\/TP1A.220624.014; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/109.0.5414.86 MQQBrowser\/6.2 TBS\/046605 Mobile Safari\/537.36 V1_AND_SQ_8.9.63_4190_HDBM_T QQ\/8.9.63.11380 NetType\/4G WebP\/0.3.0 Ap",
"url":"\/\u4ea4\u53cb\u6807\u51c6-\u548c\u5e73\u5171\u5904\u4e94\u9879\u539f\u5219.html"},
{"objectId":"4",
"QQAvatar":"",
"comment":"\u600e\u4e48ip\u4e0d\u5bf9",
"insertedAt":{"__type":"Date",
"iso":"2023-06-27T09:38:15.000Z"},"createdAt":"2023-06-27T09:38:15.000Z",
"updatedAt":"2023-06-27T09:38:15.000Z",
"ip":"223.104.150.16",
"link":**null**,"mail":"2868301418@qq.com",
"nick":"2868301418",
"ua":"Mozilla\/5.0 (Linux; Android 13; V2171A Build\/TP1A.220624.014; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/109.0.5414.86 MQQBrowser\/6.2 TBS\/046605 Mobile Safari\/537.36 V1_AND_SQ_8.9.63_4190_HDBM_T QQ\/8.9.63.11380 NetType\/4G WebP\/0.3.0 Ap",
"url":"\/\u4ea4\u53cb\u6807\u51c6-\u548c\u5e73\u5171\u5904\u4e94\u9879\u539f\u5219.html"},
公共字段說明
- objectId: 評論的唯一標識符(如 “4” 和 “5”)
- QQAvatar: QQ頭像鏈接(當前為空字符串)
- comment: 評論內容(包含 Unicode 轉義字符,如
\u600e\u4e48表示"怎麼") - insertedAt/createdAt/updatedAt: 時間戳(ISO 8601 格式)
- ip: 評論者的 IP 地址
- link: 評論者提供的鏈接(可能為 null)
- mail: 評論者的郵箱地址
- nick: 評論者暱稱
- ua: 用戶代理(顯示瀏覽器/設備信息)
- url: 被評論的頁面路徑
特殊字段
- pid: 父評論 ID
- rid: 根評論 ID
如果 "link" 值為 null ,則 "link" 與 "mail" 間沒有換行。json 對換行不敏感,所以可以不管。
此時在文件首尾用 [ ] 將內容包裹起來,保存文件。
修改評論屬性
此時可以直接導入 LeanCloud 了,但尚有內容可以修改。
Export2Valine 將評論關聯文章的 url 設置為 \/slug ,比如 "url": "\/Summary-of-the-First-Semester-of-Junior-Year.html" ,其中 \/ 是轉義 / 。
想要把評論與新部落格的文章聯繫起來,需要手動修改 url 為新部落格的文章鏈接。
以筆者該部落格為例,Hugo 生成的網站根目錄下有 zh-cn,zh-tw,en,ja 四個文件夾(開啟了多語言),中文站的文章在 /zh-cn/post/文章分類/ 下。
筆者在本地部落格源文件就將文章按分類放入不同文件夾,比如 /content/post/Thoughts/最近寫的詩.md 生成網頁相對地址為 zh-cn/post/thoughts/最近寫的詩 。
如果你的新部落格文章在根目錄且名稱未更改,那自然不用修改 url。
若都在 /post/ 下,可以使用查找與替換將
"url":"\/
替換為
"url":"\/post\/
筆者是暫時替換為
"url":"\/zh-cn\/post\/
同樣,友鏈、說說之類的獨立頁面評論也應修改為新部落格對應頁面相對地址。 比如友鏈頁面
"url":"\/links.html
替換為
"url":"\/zh-cn\/friend\/
將 post 和獨立頁面中可以大規模應用查找替換的 url 先替換,否則導入後難以大批量替換。
使用查找與替換時,盡量多包裹共同內容,找「最大公約數」,避免錯誤修改。
注意轉義 \/ !!!
導入 LeanCloud
在 LeanCloud 控制台-數據存儲-導入導出,選擇修改好的 json 文件,Class 填寫 Comment ,導入。
注意,如果你之前在部落格 Waline 發過測試評論,或曾嘗試過導入 Comment,Waline 會先創建 Comment Class ,再導入就無法成功導入數據(LeanCloud 會提示成功,但沒有新數據導入)。
只能先在控制台-結構化數據,選擇 Comment 並刪除該 Class,再次嘗試導入。LeanCloud 頁面可能不會及時刷新結果,Ctrl+F5 刷新緩存就有了。
導入成功後,再針對每個評論 url 進行單獨設置。
比如筆者的 post 需要一個個歸類到 "url":"\/zh-cn\/post\/文章分類\/ 下,此時善用 LeanCloud 批量操作和按條件過濾功能。
後記
評論的整理並沒有耽誤筆者太長時間,120 條評論大部分是筆者自己在說說頁面的自言自語,所以 url 可以批量修正。僅有的十幾條他人評論分佈在寥寥三五個文章中,通過 post 篩選修改起來很快。不知道是好事還是壞事呢(笑)
自言自語也好,他人的留言也好,每一條於筆者都有著非同尋常的意義,隔一段時間回看就會有新的感受。
如最開始所言,這是筆者的成長軌跡,是筆者存活於世的證明,是「我」的一部分。
而你,我親愛的讀者,是你賦予我價值。
有空的話請多多評論吧~筆者真的會開心很久的說(如果評論善意的話)。

何時一樽酒,重與細論文。