MoreRSS

site iconThe Wandering Allison修改

试图找回自主表达权的普通人。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

The Wandering Allison的 RSS 预览

2025 阅读复盘

2026-01-07 08:00:00

不是读书总结,只是一点数据复盘。

看 NeoDB 年终总结 页面时意识到可以自行改年份看往年数据,于是把前两年的拉出来对比了下。

年份
2023 155 4 1 24 Null
2024 99 4 Null 16 6
2025 249 1 5 10 Null

2023|2002024|2002025|200

看起来数字变动很大,不过实际阅读数字应该相差并不太多,23 年有 40 来本漫画/绘本,24 年则是有套 14 册的医学科普只能在 NeoDB 标记成一本,25 年数字唬人,实则有超过一半是绘本/漫画,加加减减凑下来,文字为主的书每年都是 100 左右。

2025 读过 249(不含网文和同人),中文 70 多,英文 170 上下(纯文字大概 30+),此外有几本无字绘本,两本西班牙语识字绘本,以及一本德语自然图鉴(不认识字,纯看图)。

书籍类型,虚构类(小说/戏剧)14,绘本 140 左右?(数不过来了),余下都是非虚构。

书籍形式,全面拥抱电子化和图书馆的一年。实体书 19 本,一多半借自图书馆,自有的几本看完全部卖出。中文电子书,Z-Library/Anna’s Archive、微信读书(下半年几乎没用),以及本地图书馆电子库(只能用微信小程序在手机上看,非常让人恼火)。英文电子书,绘本全部借自 Libby,文字为主的英文书大部分 Anna’s Archive,小部分 Libby,另外很多英文书我会电子书和有声书交错着读,有声书也多半借自 Libby。

阅读体验(评分)。五星我向来十分吝啬,要十足喜爱或震撼才会打出这个分数,有十本,不过绘本我明显手松了点,现在回头盘点会发现有些五星还是差些火候。四星和三星分别是 30+ 和 40+。两星则是史上最多,14 本。剩下的大批只标记了读过没有打分,绘本类是因为翻得太快过于囫囵吞枣,文字类则是有些为难,卡在聊可一读和勉强推荐的界限中间,读完不至于骂街,不读好像损失也不大,索性就都不评分了。这样看来多数是在 3-3.5 的这个区间,所以说五星制不科学嘛!一星空缺,差到这份上的我必然是不会读了。

列完数字聊聊纯主观的感受。2025 好像没有太多让我非常兴奋的书,这是没办法的事,读得多了标准不可能不提高。所以相伴而来的就是,我似乎读了太多纯打发时间的书,但如果让我再选一次,可能我还是会读,不是这本就是那本,我总得需要点东西塞进我的脑子和耳朵。另一个需要反省的点是,我还是读得太东一榔头西一棒子了,2026 在消遣性阅读之外,应该有一份学习书单和几个更体系化更主题性的阅读。

此外,我真的需要看这么多绘本吗?其实 2025 年之所以会看这么多,纯粹是因为中文书看得少了(懒得去下资源),Libby 全是英文书,我的英语又还没有好到随便打开一本英文就能无痛读下去,可不读东西我又难受,这时绘本就成了消遣放松的不二之选。当然我不是说绘本没有好作品,有几位作者我确实会长期关注,但──我还是更想读体量更大一点的东西。此时怨念就成了到底何年何月我的英语才能好到可以不假思索像翻开任意中文书那样唰唰往下刷进度呢。不过话说回来,虚构作品我还是喜欢读中文,尤其是同人或者网文,中文的美感和情绪共振英语很难带给我。所以我的英文阅读几乎全是集中在非虚构上,自然或者科普,专有词汇不少,速度就更难提起来。

至于阅读记录,2026 我应该不会像过去几年一样按月份逐本点评了。读过的很多想写更详细的书评,可2025 每个月少则十几多则三十的数量根本让我赶不过来进度,在读和写之间我大部分又会选择再看本新的(不过 25 年的记录我还是会补完的,可能在农历年前吧)。新年的第一天我还想今年不要读那么多,把步调放慢,结果才七号,又读完十本了。对自己完全无可奈何。或者说,我应该要克制尝鲜的念头,而去啃一些更需要脑力和精力的大部头,不能只追求纯粹的愉悦和消遣。

最后,丢一个毫无用处的 2025 读过列表,实在是有数据在手就忍不住想把它晒出来。

2025 读过(倒序)
躁郁之心
Round: A Whimsical Picture Book About Discovery in Nature for Kids
The Tea Party in the Woods
Tigers Between Empires
Rapido y Lento/Fast And Slow
One Day This Tree Will Fall
How Does Santa Go Down the Chimney?
DON’T TRUST FISH
Hello, is this planet Earth?
Hurricane
Here is New York
Father Christmas
Los pequeños
I Am We: How Crows Come Together to Survive
Little Shrew
The Storm
Mushroom Hunting: Forage for Fungi and Connect with the Earth
山川纪行
The Night Walk
今天也要好好地过
Hello, Earth!
How to Be a Woman Online
What You Need to be Warm
Everything & Everywhere
Brother Eagle, Sister Sky
打破社交媒体棱镜
A Stone Is a Story
Pocket Nature Series: Cloud Spotting
Sam and Dave Dig a Hole
Du Iz Tak?
给智人的极简人类进化史
We Are Starlings: Inside the Mesmerizing Magic of a Murmuration
游牧的智慧
A Walk in the Woods
Whale Fall: Exploring an Ocean-Floor Ecosystem
Beastly Puzzles
Woe: A Housecat’s Story of Despair
Fox: A Circle of Life Story
The Museum of Odd Body Leftovers
鱼不存在
The Conference of the Birds by Peter Sis
You Belong Here
Plasticus Maritimus: An Invasive Species
Keeping the City Going
This Is Orange: A Field Trip Through Color
Fluent Forever
Elizabeth, Queen of the Seas
Raising Hare
The Little Wooden Robot and the Log Princess
Big And Small/Grande y Pequeno
Moonshot
隐性疲劳
破形记
Fungarium
The Way Home in the Night
Pimsleur Japanese Level 1 Lessons 1-5
To see an owl
Grumpy Monkey
I Am Wind: An Autobiography
Kunstformen der Natur. Sonderausgabe.
源自尘埃的世界
松鼠先生和月亮
Beaks!
The Strangest Thing in the Sea
Polar
陌生的阿富汗
Night Creatures
And Then You’re Dead
Four Thousand Weeks
Hunchback
The Fox Went out on a Chilly Night
Puffin
The Little Ghost Quilt’s Winter Surprise
The Little Ghost Who Was a Quilt
Red Sings from Treetops
A Shell Is Cozy
Swirl by Swirl
旅行在樹梢
Things I Don’t Want to Know
流明
Emily Carr and Her Dogs
Frederick
How to Catch a Mole
The Boy, the Mole, the Fox and the Horse
那个苹果也很好
在古老的土地上
病者生存:疾病如何延续人类寿命
我就是这样变笨的
The Leaf Detective
初老的女人
Jonathan Cleaned Up … Then He Heard a Sound
Ocean Meets Sky
饮食的迷思
Pool
恶女书架
老女孩
It Fell from the Sky
Barnaby Unboxed!
西伯利亚一年
The Night Gardener
The Monarch
八堂自然课
The Barnabus Project
Rain Before Rainbows
The White Darkness
Pepper & Me
Cloth Lullaby
多面的谷氨酸
The House of Owls
Mushroom Rain
Once Upon a Northern Night
Spork
The Mushroom Fan Club
On a Mushroom Day
我活下来了
The Snowman and the Snowdog
The Snowman and the Snowdog
We Should All Be Feminists
Best Foot Forward
Starry Messenger
Can You Keep a Secret?
In Defense of Food
Madlenka
The Pilot and the Little Prince
You’ll Find Me
Is a River Alive?
如何找到想做的事
ISLAND STORM
The Lost Spells
In and Out the Window
Migration
Migration
Snow Birds
树的秘密语言
Curiosity
The White Cat and the Monk
Heatwave
Town Is by the Sea
Blue
How to Keep House While Drowning
Bird Builds a Nest
A Bird Day
Look What I’ve Got!
As An Oak Tree Grows
English Pastoral
Mighty
The Backyard Bird Chronicles
In the Night Kitchen
Because of an acorn
Dear Reader
Over and Under the Wetland
Biblioburro
Over and Under the Pond
The Serviceberry
Over and Under the Waves
Over And Under The Canyon
Over and Under the Snow
White Snow, Bright Snow
Over And Under The Rainforest
Do You Remember?
The Hawk’s Way
Sidewalk Flowers
雪舞者
Santa’s First Christmas
Small in the City
Little Owl’s Night
My Baba’s Garden
古典的回声
The Tiger Who Came to Tea
Me and You
读库1504
大汗之城
The Lord of the Rings (BBC Dramatization, Consumer Edition)
献灯使
生而为女,不必抱歉
时间熊,镜子虎和看不见的小猫
在西伯利亚森林中
格外的活法
扔掉水晶鞋
飞鸟奇缘
恐龙疗法3:你是我最好的朋友
老头我,负责收拾一切
We Found a Hat
This Is Not My Hat
I Want My Hat Back
我曾这样寂寞生活
Stolen focus
巴基斯坦寻根之旅
何以为鸟
The Mole Sisters and the Fairy Ring
The Mole Sisters and the Way Home
The Mole Sisters and the Piece of Moss
Hello, Squirrels!
Bringing Down the Moon
Up in the garden and Down in the dirt
The Crucible
木骨禅心
The Search for the Giant Arctic Jellyfish
When Dad Showed Me the Universe
手机断舍离
手机大脑
马可瓦尔多
发酵完全指南
I Talk Like a River
满是空虚之物
哥伦比亚的蘑菇
创造自然
随机快乐
险境奇谈
我的健康厨房 范志红谈厨房里的饮食安全
Mei Li
念念远山
读库1304
Five Flying Penguins
一神论的影子
我们花园里的鸟
我们唱歌的鸟
抓住十二只喜鹊的尾巴
Feathers
The City of Ember
They All Saw a Cat
Bird Day
Little Witch Hazel
妖怪事典
The Elephant and the Bad Baby
Goodnight Moon
营造天书
长恨歌图
Atlantic Puffin
The Emperor’s Egg
Life as a Barnacle
Broken Glass
无器械健身
追寻逝去的时光 第一卷:去斯万家那边
宇宙来我手中啄食
格里格外
无钱幸福
末日愚人
强风吹拂
让路给小鸭子
绝佳时间
美国式死亡
The Tomten
我们在非洲
The Tomten and the Fox
Little Polar Bear
The Snowman
我用中文做了场梦
Kakapo Rescue

失败购物分享

2026-01-01 08:00:00

好久没写生活向的内容了,把之前清单里的这篇拎出来解决掉。

1.不锈钢咖啡滤网
当时买来做手冲咖啡用,想着替代一次性的纸质滤纸更环保些。滤网也确实很细,只是用了一段时间之后下水的速度非常非常慢,过滤时间变长导致咖啡口感相当差劲。卖家产品说明里写用洗洁精泡泡就好,但我是洗洁精、小苏打甚至柠檬酸配合刷子挨个试了一遍全不奏效,一气之下扔了。扔完发现我应该留着它做希腊酸奶用的……

2.可量化油壶
这种油壶一般是倒油口那里做了个缓冲区,但是这就导致其实有一部分油会和空气接触氧化,而且我买的那款断口不利索,每次壶嘴那里都要残留点油渍,相当烦人。一壶油用完还得彻底清洗壶身再晾干,实在过于麻烦。之后我意识到,以我几乎三餐都自己做但一年也才用 500 ml 不到植物油的用量(烹调和烘焙偶尔还会用到黄油),无论如何都难以超过摄入警戒线,直接把油壶扔掉,每次只买 250 ml 小包装的橄榄油/亚麻籽油。

3.一次性吸管
好多好多年前逛宜家,朋友说买包吸管日常备着我就顺手也抓了一袋,完全用!不!上!最后在夏天喝冰拿铁时硬是用个超级高的杯子每次拿吸管搅搅,五六年了终于用完了。

4.pixel pen
Google Pixel Slate 官方标配里是没有这支手写笔的,看别人用平板都似乎很潇洒地写/画,我抱着或许也用得上的想法给 pixel slate 也配了支笔。好几年了,用的次数可能两只手就数得过来。其实要算起来,这台机器也算是一个失败购物,纯娱乐,生产力是(几乎)一丁点也没有,我觉得不需要它也可以。但我就是好奇 ChromeOS 系统!而且它可以在平板上体验完整的 Chrome 浏览器,总比买台没用的安卓平板好吧(什么,iPad?本果黑拒绝为苹果花哪怕一分钱)。

5.无线迷你搅拌机
想得很美好,可以拿来打个葱姜蒜或者香料又或者牛油果的,但有这事前充电、事后刷机器的功夫,我拿菜刀拍几次或者勺子捣几下就结束了。不过我有洗碗机的话可能它的利用率又不一样吧。

6.罗技 K380 键盘
笔记本常年连着外接显示器就需要外接键盘,我对键盘没什么要求,试过机械键盘但还是最喜欢笔记本上那种薄膜键盘的手感,也不想多花钱就随便挑了这个大路货。最大的问题是,我其实不需要蓝牙!每次开了机都得等几秒钟它才能连上这个感觉很糟糕,既然我常年都不需要挪动键盘位置完全可以买个 2.4 G 或者直接上有线键盘。可能之后卖二手看看有没有人要,再换个不是只支持蓝牙的。

7.电动牙刷
我用过两个飞利浦(一个中端机型,一个低端机型)和一个小米。差不多十年前,花了四五百买的飞利浦非常精准地在刚过两年保修期的那个月坏掉了。网上一刷都是同样的控诉,但我不信邪又买了只低端的,再次,刚过保就出问题。这时国产品牌也铺天盖地出电动牙刷了,我就又换了只小米,again,两年魔咒。我气炸了,后来想想可能移动电池的寿命就是这么久,所以所有厂家都非常鸡贼地把保修期也定了这么长。现在我常年回购狮王细齿洁宽版,非常好用!而且用十年也比不上我第一支飞利浦牙刷的一半价格。想想过去真是个超级大傻子。

8.欧包藤篮
凡是做欧包的人很难不买这个塑形的藤篮,但问题在于,在欧洲人家似乎没有我们这边这可怕的梅雨潮湿诅咒吧?正常使用藤篮之后是不会洗的,多余的粉就留在里面防黏下次继续用。然而不管我怎么保存,总是要么生霉,要么生虫。干燥地区太阳下晒晒就没事,我这儿每年固定有一两月湿度可能到 90,怎么晒都没用啊!后来我意识到只要不追求欧包上那一圈圈的花纹,有没有这个篮子完全没差,所以现在我都用洗菜的滤水篮子垫张油纸做二次发酵,一样很成功。

9.五年日记笔记本
今年是第五年,几乎没写过。幸好我颇有先见之明没有花大价钱买 Leuchtturm 或者其他类似牌子,当时就想着这种严格规定日期的方式多半会引起我的逆反心,果然如此。打算当普通本子随便写写画画赶紧用完。之后就算我想实践五年日记的形式完全可以搭个静态站调调格式让它把不同年份同样日期的内容放在同一页面显示就行,别说五年,十年二十年也不成问题。

10.「人体工学」坐垫和靠背
前几年我达到了一种坐在椅子上超过半小时就背痛不止的程度,不管怎么调整坐姿都无济于事。恰好那几天看到少数派的购物分享就病急乱投医地买了,稍微好过了那么一丁丁点吧,但该痛还是痛。没想到之后在我非常三天打鱼两天晒网的锻炼之下,居然就不药而愈了。所以,锻炼比外物有用。真的不适到影响生活了,那还是赶紧先看医生。至于这个坐垫和靠背,加上之后我还必须得搭个脚踏,不然脚离地面的高度又过高了,而且锻炼之后脊背感觉靠在上面也不得劲儿,最后还是都扔掉了,坐姿靠自觉保持,不舒服了就站起来动一下。

居然正好攒了十条出来,虽然这期的标题是 shopping fails 1,但还是最好不要再有 2 。(多半会有的,人在河边走,哪能不湿鞋……)

网络阅读 007

2025-12-22 08:00:00

本文属于 Articles 系列,前情提要或后续更新请见:

发现我还有这篇草稿,随便发一下好了。一些过去(已经不知道是多久之前攒下的)我觉得有意思的文章。

One Giant Stunt for Womankind
Blue Origin’s all-female flight proves that women are now free to enjoy capitalism’s most extravagant spoils alongside rich men. 之前看到所谓全女性成员的太空之旅,豆瓣还有某 KOL 写小作文煽情其中一位在遭遇性暴力用法律手段维护自己后重新追逐她的「宇航员」梦想。前半部分没有问题,后半部分则问题太大了。和富人的「娇妻」(aka 贝索斯的现任)以及一众社会名流(比如 Katy Perry) 搭乘富人玩具上天那不叫探索太空,更不叫追逐「宇航员梦想」,充其量只是太空乘客好吗。接着就刷到了这篇报道,真是讽刺好笑。

水垢与帝陵:世界上不同的美
很神奇,刷到这篇文章时我正在读王南的《大汗之城》,其中提到北京城当初的规划,或者说中国古人的建筑审美,就是「虽为人作宛若天开」,建筑不应孤立存在,而是和周边景观相辅相成。而这篇文章的中心也正是这个,由自然界的万千美感延伸到建筑设计。更为神奇的是,这是将近十年前的文章,却又被转发到了我的豆瓣首页,内容也并不显得过时。这才是互联网真正应该存在的「长尾效应」。

分享40个科幻短篇
mark 下日后读。

Owls in Towels
一个收集裹在毛巾里的猫头鹰的网站。

余生
《四个春天》导演的家庭故事的后续。看得泪流不止。

到底什么是绝版书
多抓鱼的一篇推送,二手书平台写这个相当有发言权。

三文鱼,真的“自由”了吗?
购买之前需要多想一步。或者,我们真的需要吃这么多三文鱼(以及鳗鱼、高级牛肉等等等等)吗?看到一些人整天嚷嚷着就是要吃肉以及吃这些野外种群已经相当不乐观的动物,我真的忍不住我的白眼。

行走唐陵20年
正好可以和之前读过的《六朝遗石》两厢对照。

以及最后一篇是豆瓣新推出的官方 club 「友邻moment」的推文,我看了下这个系列都相当有意思,但我不想加入它们这个所谓俱乐部只想看长文,研究了下虽然前端页面豆瓣是给这种 club 账号设计了不同的显示效果,但本质还是一个用户 id,用豆瓣的日记 RSS 逻辑一样可以订阅文章更新,所以,感兴趣可以用这个地址订阅: 豆瓣友邻 moment RSS

2025 九月读书记录

2025-12-22 08:00:00

本月总结主打一个言简意赅。

有字儿的

老女孩

3.5 星。

前男友那一章真的是突兀且不合时宜,而且作为读者谁有义务去记你死掉的前男友啊?Who cares?可好些人为此打一星也太过了吧。而且异性恋怎么了,难道非得是“酷儿”“性少数”才能当单身女性代表发言?有些人的差评是不是太离谱。

讲中年单身女性的处境和各种思考倒是相当让人感同身受,我们需要有人讲述这样的生活。

恶女书架

两星。

寡淡无趣。几乎每一篇都像是碎片胡乱拼起来的,连个像样的表达都没有,要谈论什么是不是应该有一个比较明晰的、一以贯之的自我呢?未免太过空洞。我不会再看铃木凉美了。

在古老的土地上

印度人在埃及。(是不是看这个前提就觉得想看了?)或者说,是一个印度学者在埃及做田野调查以及做历史研究。

现代线比历史线精彩一点。但到底为什么这些学者非要沉迷于毫无必要的双线叙事?详细内容看下面两篇书评就好,我懒得多费唇舌了。

那个苹果也很好

留学生的法国生活记录。前几篇文化观察类的还挺有趣,越往后越流水账,尤其日本旅游那篇,抻得老长却又极其无聊。尤其是其中出现了一些出版界的人名(很好认,即使她没写全名我也知道是谁),我会忍不住想,如果不是作者本身就在这个行业内,以这个水准能出书吗?

其实还有更多吐槽但写出来太费劲儿了,谁来找我 Discord 聊天吧我可以连说一小时(什么)。

饮食的迷思

三星。

在书里写“饮酒可能对健康有益”的作者我觉得没法信任,你说呢?

整本书的核心观点就是饮食要尽可能多样化,以及多吃发酵食物。但其中也有不少言论和我之前读的营养学/饮食相关书籍理论相悖,而多看几本更是发现在营养学这一领域经常彼此矛盾,兼收并蓄姑且听着吧。

初老的女人

看到养猫但不处理有毒植物还狡辩说“没有植物就不是自己”很生气,原本三星半,现在三星。有几篇写死亡还不错,但我还是不会再看伊藤比吕美的书了,总是这种超短小杂志连载合集,很没劲,这稿费赚得太容易了吧?

我就是这样变笨的

俏皮话很多,讽刺拉满,可惜也只有这些,还没到结局气就已经泄了,感觉有头无尾,概念取胜。

病者生存:疾病如何延续人类寿命

三星。

有些新鲜观点,但越写越离题万里。

没字儿的

Barnaby Unboxed

八月读的 The Barnabus Project 的后续故事,我不喜欢这个走向。也懒得放图了。

It Fell from the Sky

画面细腻梦幻美丽,故事么略有点说教,不过还在接受范围之内。就是不知道怕虫的人看到这么细致的笔触全是在展示各类昆虫身体细节会不会疯掉。

It Fell from the Sky|600

It Fell from the Sky|600

It Fell from the Sky|600

Pool

Pool|600

无字绘本。游泳池里的幻想世界。画得不差,笔触细腻,但和我脑电波对不上

下面这张不知为什么会让我想起爱死机里 Zima Blue 那一集。

Pool|600

Ocean Meets Sky

一个关于思念的故事。画面极其梦幻美丽,情节虽然有点老套──但有效。我在最后没忍住也落泪了。

Ocean Meets Sky |600

Ocean Meets Sky|600

Ocean Meets Sky|600

Jonathan Cleaned Up … Then He Heard a Sound

有点荒诞过头,不是我的菜。

The Leaf Detective

最早研究“活着的”树叶的女科学家 Meg Lowman 的传记绘本。到热带雨林中、上到树冠上观察研究树叶的状态。比如树叶的寿命,最短可能只有几个礼拜,最长达到了惊人的 19 年。也是她首先提出了安装丛林观光云梯(姑且这么翻吧我不知道术语该是什么)的想法,为雨林地区发展出旅游项目,从而让一部分森林逃离了被砍伐的命运。

Lowman 的个人网站: canopymeg!

The Leaf Detective

The Leaf Detective

The Boy, the Mole, the Fox and the Horse

画风特别,甚至有点水墨画的写意味道,可惜文字全是心灵鸡汤,喝一口觉得鲜,整本都是未免有点腻。很温柔不错,但我无法被说服。以及,这个手写体真是让我认得眼睛都快瞎了!

The Boy, the Mole, the Fox and the HorseThe Boy, the Mole, the Fox and the Horse

简单装修 4.0

2025-12-21 08:00:00

本文属于 Blog Customization 系列,前情提要或后续更新请见:

简单记一下最近的博客变化,不详细写了,基本都是 AI 干的活儿。

  • 写了个简单的 Python 爬虫把之前时灵时不灵的豆瓣书籍封面全部下载下来转格式成 WebP 存到了 Backblaze,共计 1800 张图片。
  • 把后续的书影音同步换成用 API 从 NeoDB 自动抓取标记信息并同步到博客 GitHub 仓库的 CSV 文档。
  • 新增了 隐私政策 页面。
  • 为 Waline 设置了 90 天以上评论 IP 和 UA 信息的 自动删除
  • 新增了 series shortcode。

放一下 series 的代码。

在博客 layouts/shortcodes 下新增 series.html 文件:

<style>
 .callout {
 border-left: 4px solid #2d6cdf;
 background: #eef3fb;
 padding: 1rem;
 margin: 1rem 0;
 border-radius: 4px;
 font-family: sans-serif;
 }
 .callout p {
 margin-top: 0;
 margin-bottom: 0.5rem;
 }
 .callout ul {
 margin: 0;
 padding-left: 1.5rem;
 }
 .callout li {
 margin-bottom: 0.25rem;
 }
 .callout a {
 color: #2d6cdf;
 text-decoration: none;
 }
 .callout a:hover {
 text-decoration: underline;
 }
</style>

{{ if .Page.Params.series }}
 {{ $currentTitle := .Page.Title }}
 {{ $seriesName := index .Page.Params.series 0 }}
 {{ $seriesSlug := $seriesName | urlize }}

 <div class="callout notice">
 <p><strong>本文属于 {{ $seriesName }} 系列,前情提要或后续更新请见:</strong></p>
 <ul>
 {{ if (index .Site.Taxonomies.series $seriesSlug) }}
 {{ range (index .Site.Taxonomies.series $seriesSlug).Pages.ByDate }}
 <li>
 {{ if eq .Title $currentTitle }}
 {{ .Title }}
 {{ else }}
 <a href="{{ .RelPermalink }}">{{ .Title }}</a>
 {{ end }}
 </li>
 {{ end }}
 {{ end }}
 </ul>
 </div>
{{ end }}

对应文档 front matter 增加 series property,并在文档内使用 /{/{< series >}/}/ 即可(去掉反斜杠)。Hugo 会自动读取博文的 series 信息并将所有同系列文章按创建时间生成序列显示(但是它好像识别不了中文名称,我也懒得修了,都写英语吧……)。

使用 Vercel Cron 自动清理 Waline 评论 IP 和 UA

2025-12-21 08:00:00

本文属于 Waline 系列,前情提要或后续更新请见:


2025.12.30 Update:

根据 Waline 的 issues 请问是否有办法设置不收集评论者的IP、UA和所属地信息? · walinejs · Discussion #1315 · GitHub 也可以直接添加 hooks 禁用。如果不需要通过 IP 禁用特定评论防止 spam 可以直接采用这种方式。


之前我一直犹豫没换评论系统的缘故就是 Waline 和 Twikoo 默认会前台展示 IP 和 UA(user agent),后面换了才知道即使前台显示关闭,后台还是会记录具体 IP,这实在是让我难受。我猜多数用这俩评论系统的博主以及留言的人也不一定会知道具体的 IP 会一直被保留在数据库里吧。

理智上我知道这些信息是多数网站都会记录的,但直接交给个人还是感觉不一样。评论系统收集这些也的确有正当性──避免 spam、及时封禁。可我就是不想保留访客的这些资料。琢磨了一阵子后我想着改写 Waline 的评论写入逻辑有点麻烦,那就不如我写个定时跑的任务来自动清除数据库的 IP 和 UA 字段。本质上 Waline 也是用 access key 来和数据库互动,那我也用同样的手段来管理好了。

以及,AI 创作声明:

由于之前和 Gemini 都说的英文,等到我想着整理一份中文步骤发现实在太累,所以下面都是 AI 写的,我只大概改了改(写得比我快多了……)。


本教程适用于:

  • Waline + LeanCloud
  • 部署在 Vercel
  • 希望定期清理评论中的敏感信息(IP / UA)

核心功能:使用 Vercel Cron 定期清理数据库中 90 天前的评论数据,将敏感信息(IP 地址和浏览器 User Agent)抹除。

一、前置条件

  1. Waline 使用 LeanCloud 作为存储
  2. Waline 已正常运行并能写入评论
  3. 项目部署在 Vercel
  4. 你拥有 LeanCloud MasterKey

二、创建清理接口

在 GitHub 上托管的 Vercel 项目仓库中新建一个 Serverless Function,例如:

/api/cleanup.js

将下面代码完整粘贴进去:

const AV = require('leancloud-storage');

const DAY = 24 * 60 * 60 * 1000;
const BATCH_SIZE = 200;

let initialized = false;

function initAV() {
 if (initialized) return;
 AV.init({
 appId: process.env.LEAN_ID,
 appKey: process.env.LEAN_KEY,
 masterKey: process.env.LEAN_MASTER_KEY,
 serverURL:
 process.env.LEAN_SERVER_URL ||
 `https://${process.env.LEAN_ID.slice(0, 8)}.api.lncldglobal.com`,
 });
 initialized = true;
}

async function cleanOldComments(cutoff) {
 const Comment = AV.Object.extend('Comment');
 let cleaned = 0;

 while (true) {
 const q = new AV.Query(Comment)
 .lessThanOrEqualTo('createdAt', cutoff)
 .exists('ip')
 .limit(BATCH_SIZE)
 .select([]);

 const results = await q.find({ useMasterKey: true });
 if (results.length === 0) break;

 results.forEach(o => {
 o.set('ip', null);
 o.set('ua', null);
 });

 await AV.Object.saveAll(results, { useMasterKey: true });
 cleaned += results.length;
 }

 return cleaned;
}

module.exports = async (req, res) => {
 if (req.headers.authorization !== `Bearer ${process.env.CRON_SECRET}`) {
 return res.status(401).json({ error: 'Unauthorized' });
 }

 initAV();

 const cutoff = new Date(Date.now() - 90 * DAY);

 try {
 const cleaned = await cleanOldComments(cutoff);
 res.status(200).json({
 message: cleaned ? `Cleaned ${cleaned} records.` : 'No records to clean.',
 });
 } catch (e) {
 res.status(500).json({ error: e.message });
 }
};

三、配置环境变量

在 Vercel 项目中添加以下环境变量:

变量名 说明
LEAN_ID LeanCloud App ID
LEAN_KEY LeanCloud App Key
LEAN_MASTER_KEY LeanCloud Master Key
CRON_SECRET 自定义字符串,用于校验 Cron 请求

前三个变量在部署 Waline 时已添加过,无需再变动。CRON_SECRET 的值可随意自定义。

四、设置 Vercel Cron

在项目根目录更新 vercel.json

{
 "name": "comment",
 "version": 2,
 "github": {
 "silent": true
 },
 "builds": [
 {
 "src": "robots.txt",
 "use": "@vercel/static"
 },
 {
 "src": "index.cjs",
 "use": "@vercel/node"
 },
 {
 "src": "api/cleanup.js",
 "use": "@vercel/node"
 }
 ],
 "rewrites": [
 {
 "source": "/api/cleanup",
 "destination": "api/cleanup.js"
 },
 {
 "source": "/((?!robots\\.txt$).*)",
 "destination": "index.cjs"
 }
 ],
 "crons": [
 {
 "path": "/api/cleanup",
 "schedule": "0 0 1 * *"
 }
 ]
}

即,在 buildsrewrites 下新增 cleanup.js 路径,以及增加定时任务 crons,我这里选择的是 "0 0 1 * *" 每月一号跑一次,可根据自己需要变更。

手动执行方式:命令行 curl 执行或者 Vercel Dashboard 的 Cron “Run now”。