2026-06-13 03:17:45
二零二五年真是过得飞快。重新翻看日历,才意识到这一整年自己竟然做过这么多的事情。在赤道线上的小岛待久了,对时间流逝的感知也变得越来越迟钝。这里没有分明的春夏秋冬。在平凡的日子里,我靠着电子日历上每天填满的日程来提醒自己:生活并不是停在原地。
而真正能令我意识到时间在流动的,是那些离开小岛的日子。坐上六七个小时的长程航班,一路向北或是向南,看到那些熟悉或陌生的街道,大口呼吸当地的空气,吃上一顿惦记了很久的饭,而后好好地睡上一觉。只是回头看这一年,才发现这种流动和变化不止发生在自己的生活里。每天面对的工作、使用的工具,以及那些正在影响整个世界的技术,也都在悄悄改变。

人们在生活中开始强烈依赖 AI 去回答问题或是编写程序的时间可能还不到一年。2024 年底,最常用的编程大语言模型可能是 Anthropic 的 Sonnet 3.5,它在一项编程基准能力测试 SWE-bench Verified 上的准确率是 49%。而 2025 年底发布的开源大语言模型 GLM-4.7 在这一项上的准确率已经达到 73.8%。
二零二五年最让人感到惊喜的,是以中国科技公司为主的,发布开源大语言模型的热潮。这些大语言模型性能优异,显著缩小了开源模型与闭源模型之间的能力差距。它们的出现大幅降低了推理服务的平均成本,使更多人、更多场景能够使用或接入 AI 能力。这其中有代表性的是深度求索的 DeepSeek 系列模型、智谱的 GLM 系列模型,以及月之暗面的 Kimi 系列模型等。
量大管饱的 AI 模型比性能顶尖但是昂贵的模型在应用侧更有价值。2024 年底人们对于 AI 的认知或许只有基于网页的 ChatGPT。而随着 MCP 协议和生态的发展,再加上模型普遍支持思维链、工具调用与更大的上下文窗口,AI 的形式不仅限于基于文本框的知识问答,而是成为了能够与外部环境做交互,基于任务循环和多轮调用来解决复杂问题的人工智能体(AI Agent)。
其中一类复杂问题被称为程序设计。编写并调试程序不仅依赖知识和经验,在思考程序架构时还应考虑到业务背景和设计模式。解决这一类问题时,2025 年初的 AI 或许只有实习生的水平。而经过一年进化后的 AI 至少相当于拥有 3 年左右工作经验的全职工程师。
当然,程序设计只是其中一类复杂问题。正如前 OpenAI 研究员姚顺雨在那篇著名文章《下半场》中提及的那样,当模型在越来越多的测试中逼近甚至超越人类时,真正困难的或许不再只是提高测试成绩,而是定义值得解决的问题,并判断 AI 是否真正创造了现实价值。而这可能是 AI 能够给人类带来更大收益的方向。几乎有一多半软件在 2025 年都添加了 AI 功能模块。
我去年有一篇文章在介绍 n8n,这是一款具有良好用户界面的工作流自动化软件。用户明确定义的工作流确保了关键步骤一定会被执行。而未来的 AI Agent 大概率不但会贴近这种可靠性,还可针对不同场景灵活处理问题。OpenClaw 的流行说明用户开始接受完全以自然语言的形式定义任务和问题,并尝试授予权限并完全委托在本地运行的智能体解决问题。
程序员会失业吗——我不止听过一个人说出类似的担忧,尤其是在 AI 解决问题的能力突飞猛进,以一种不可想象的速度开始快速替代人类进行编程活动的大背景下。说实话,我对于这个问题并不是很担心。
这是因为软件工程师的职责不仅包括编写程序。在典型的一天的工作中,我投入编程这项任务的时间占比可能只有 30% 左右。他(她)是一名 “问题解决者”:这份工作的价值在于讨论并理解需求、提出有价值的解决方案,并最终落实该方案。这需要充分理解任务上下文,进行沟通以及管理进度和预期。而其中编程这一环节可能只是 AI 能完成的最简单任务之一。AI 可以按照要求撰写可运行的程序。但至少到现在,它还是不能为我的博客文章起一个令我满意的标题,也不能理解来自需求方的 “五彩斑斓的黑” 究竟想到达到什么目标。其中一些任务依赖情感支持而非纯粹技术。
另外,前端 / 后端程序员的边际也已不再清晰。在一些企业内部,就连产品经理和软件工程师的职责也已经开始模糊。几年之前在一些组织内,就已经开始要求程序员兼任软件测试工程师的职责。如今 AI 时代,人工智能能够写出更多行的代码,而审阅乃至完全理解这些代码确实增加了开发者的负担。特别是在为不熟悉的领域编写代码时,一些工程师开始放弃仔细阅读 AI 生成的代码。这些体积快速增长的代码仓库变得越来越难维护,同时也为软件测试和质量控制带来了更多挑战。
2025 年一年我不怎么亲自写代码。反之我将大量的精力投入到理解层出不穷的 AI 相关的新概念上。我尝试理解一些 Agent(人工智能体)框架的工作原理,反复比较各种模型在处理特定任务上的性能差异,以及深入探索结合这些最先进技术的实际使用场景。感到惭愧的是,我花了很多时间去努力当一名学生,而(至少 2025 年)没有什么可输出的东西。就连这篇年终总结博客,都是在 2026 年上半年就要结束的那个月才勉强写完。我希望至少能在 2026 年我能在博客中输出更多有价值的内容,争取恢复到以前的更新频率。
很难给这一年下一个什么样的定义。当我为撰写这篇年终总结博客而翻看去年的日历时,我才意识到其实这一年也做了很多事情,去了很多地方。总之还算满意。依时间序的话,这一年我到过:新加坡、澳门、北京、陕西西安、安徽省、云南昆明、海南岛、普吉岛、香港、冲绳、天津、布里斯班、广东深圳、马来西亚新山,以及广西省。其中一些地方纯属由于图便宜买的转机机票带来的 “附带行程”,虽然时间短暂,给我们带来的印象却依然深刻。

我感激与 Minda 有始终和睦的夫妻关系。她总是能对与我相关的绝大多数事情保持包容,而这一点是难能可贵的。我们互相为对方考虑,然而实际上她为我考虑的总比我为她考虑的多出很多。相处过程中的很多事情我之前从未意识到,但我争取以后在每个合适的节日或纪念日都不忘对她表达我的感激。并且在下次决定买花回家之前,先考虑家里应至少有一个花瓶的问题——不能再用空的酱油瓶来盛花了。我必须感谢我的好友刘其然在这几点上向我传授她的深刻理解。
上学的时候,总盼着能快一点毕业。可到了这几年,却又希望时间能过得慢一些。我习惯给一年中的每一周编号,并在工作目录里按周归档我的文件。2025 年的目录里渐渐排满一个又一个文件夹,直到有一天,下一个文件夹不再属于这个目录。稍感欣慰的是,每次回看这些年写下的年终总结,我都能发现,自己仍在不同角度体验和观察这个世界。只要还有新的感受、新的认识,这一年便不算白过。
2025 年末,我请了一周的年假,与 Minda 在广西自驾。宽阔的高速公路上几乎看不见别的车,轮胎碾过路面的低沉声响与广播里的音乐混在一起,窗外的群山和田野正在被落日染成金黄。我尝试记住这一瞬间,却不由得起了一身鸡皮疙瘩。太阳完全落下山,导航没有及时提示出口,我们就这样错过了下高速的路口,而下一个出口还在二三十公里以外。Minda 安慰我说,没事儿,走哪条路都能到,不过是多绕一段路。于是我们继续沿着漆黑的高速向前开,路还很长,但好在还有时间。
2025-10-16 23:21:27
本文的作者是博主的一位发小。
半年前,hl 回清华,我们一同在五道口的意大利面馆吃了一顿,饭后一路走回学校。我动议他回老宿舍看看,他欣然接受。还记得他站在窗前向北眺望夜景——北边是校外,成片的郊野公园与圆明园相接。谁能想到这位公子哥离校那年和离校后发生这么多事情呢?我们在 23 年都受到巨大的精神挑战,其剧烈程度,几近将我们打倒不起。看他眺望窗外的背影,我说:“你果然没有那种重回故地的慨叹”,他同意。这几年,可以慨叹的事情太多了吧!
今天竟然是我在 1303b 过的最后一晚!然而我也并未发出什么慨叹。 22 年住进博士楼,偶然分配至此,与 hl 做了短短两月的舍友。即使他两月后转到楼下的单人间,但是 22 年底那些刷手机信息夜不能眠的日子,每天都到楼下一层去找他交流信息,揣测、断定,激愤得形诸于颜色。然而却见他喝着加冰的威士忌,喝着我推荐他买的鸭屎香单枞,看他点烟、沉思,当然神色也是阴郁的。如果不去找他高谈阔论,想必胸中的块垒之气是不得抒发的。
还记得那天晚上给老师拨了电话,问他是否住在校内,他立刻反应道“需要我现在过去吗?”又听他讲“这次动员的广度和深度”如何如何。今天想来,只有苦笑,还有感叹。每个人的过去都像陈死人的血肉一样滋润从泥土中长出的生命之芽,对于学者这些历史性的存在者来说更是如此!这几年几位 1930 年代出生的思想史家相继去世,他们的晚年无一不孤寂,或自觉或不自觉地与大陆、港台、美国学界切割,随着 20 世纪的落幕而隐退。读张灏的纪念文集,印象最深的便是“20 世纪之子”这个称谓(还有张灏晚年时常慨叹:俱往矣!读之令人不忍),惠我思想的李先生何尝不是如此,我的老师何尝不是如此!最能振发我的思想与心灵的,便是他们了。莫非我对 20 世纪,就像高中二战军迷对苏、德军服、坦克的历史癖一样吗?我想不是的,我一向缺少这样轻松的消遣。历史是多么沉重啊!
前些日子困闷不爽,找朋友高谈阔论(实际上更多是我单方面输出“负面情绪”),说到自己只在 20 世纪活了三年,为何有这么深的 20 世纪情结呢?20 世纪的遗产,能否因应这几年以来的现实,是个疑问,然而我的 20 世纪情结究竟从何而来呢?我不认为它来自于书本的移植,虽然但凡情结之类的东西,都与意淫难解难分。这是个谜,并且是支持我继续现在工作的绝大动力。毕竟,对那种钱钟书式的博雅的学问,我并不感冒。
记忆虽然可以通过编年串联起来,但是印象中深的,在这间小屋中,也就那么几个瞬间。大部分时间,都是懒散地按部就班地生活。23 年四月底五月初,因为喜欢一个人而不得,想到他,除了渴望、遗憾、不解,还有怨恨。知道他喜欢拍鸟,辨识各种鸟叫,不巧我的宿舍朝北,下面正是一大片树林,春末初夏的鸟叫很早,四五点钟便已经吵闹,而我是久矣习惯开窗睡觉的——即使进了蚊虫也不以为意。听到鸟叫便想起他,早早地醒来不能入睡,以至于恨听鸟叫,流下苦涩的泪水。他是来过这间宿舍的,也曾向窗外眺望,为何当时没有从身后搂住他呢?真遗憾!彻底放下这段求而不得“恋情”,已经是在大病初愈之后了。那是第二年的五六月份,从地铁车厢门走出,忽然想到删掉微信,就这么删了。
我在这间小屋也活了三年!而且是全身心地、发动意识地、痛切感受地活了三年!20 世纪那三年我还是个婴儿呢,什么也不记得。23 年那些痛苦的日子不必说了,如此苦心极力、戚戚惶惶,如此神经衰弱、充满戾气,终至于年底病倒,两个月没有回到这间小屋。第二年开学后回来试探性地重新住宿,从一周一两天开始,一到晚上就产生恐慌与气闷,直到临睡前冲了热水澡、准备服下安眠药才缓解。再到一周住三四天,再到工作日全部住宿。也是五六月份,晚饭后在操场散步,一圈一圈地走,手机放在兜里,就透过眼镜全身心地感受周遭,看宿舍楼顶,看足球场上的大灯,看远处的双清公寓,看天空和云彩,真是劫后余生的感觉!经此一遭,看熟悉的场景竟然都有新鲜的感受了,然而这新鲜中带着念天地、古今之悠悠,独怆然而涕下的历史的沉重,劫后余生的庆幸,当然还有怕——怕再遭这么一遭罪,不知自己还能不能挺过来。甚至对于已有的经历而言,都不能说是挺过来,而是熬过来。当然,劫后余生久了,感官重归于木讷,看到熟悉的场景便无所谓感触了。
晚上出门锻炼前,给hl发了条微信——毕竟他也在这里住过,告诉他这是我在 1303b 住的最后一晚,他半开玩笑,带着一如既往地公子哥式的幽默调侃,但又有那么点老年人的沉重,给我回复:“一个时代落幕了。”确实,很快,也许就在 9.1 号,这间屋中的床铺桌板衣柜就要被拆除,墙上由他多年前张贴的古画复制品,以及那张我经常误看作鲁迅的闻一多像,都要被铲除了!也曾住过这栋楼,早我们数年毕业的亦师亦友的hy兄留给他,并由他留给我的席子和小茶桌,也不在我带走的物品之列。它们将被留在这里,当成垃圾,碾碎、消失。而我的那幅徐悲鸿鹰图的木版水印挂轴,和朋友戏仿康有为字体的竖轴,在新宿舍也没有墙面能够安放,只得卷起收走了。接下来这几个月,可以说是反刍在这间小屋中三年来的经历和思考,我很爱这个比喻:就像一头受伤的狼一样,舔舐着自己的伤口。独狼舔舐自己的血,而这血就像乳汁一样滋润它。
四邻都已搬走,在屋中功放布鲁克纳早年的交响曲,实在是莫大的享受,看了一下唱片封面,是罗日杰斯特文斯基指挥苏联文化部交响乐团的布鲁克纳交响曲全集录音(1983-1988),oboe 响了起来,大提琴的旋律之美,堪比柴可夫斯基冬日梦幻那首交响曲的慢板。
2025 年 8 月 26 日夜
于紫15旧寓
2025-07-29 20:18:07
今天,我发现我的星展银行(新加坡)的信用卡中有一笔莫名其妙的账单。于是我立刻跟星展银行的客服取得了联系,并且协助我撤销这笔 “盗刷交易”。在中国用了这么多年的支付宝和微信支付,从来没有遇到过未授权交易的情况,而有了信用卡的这几年间,这已经是我第二次遇到这种情况了。
第一次被 “盗刷” 是在招商银行用那个 MasterCard 国际全币种信用卡的时候,有一天我突然发现卡片里的账单多出了一笔不认识的交易,于是立刻通过银行的热线与信用卡中心的客服取得了联系,帮我锁卡、换卡,撤销交易一条龙服务,最终更换了一张新卡来解决问题。不过这已经是 2021 年左右的事情了。
在此之后,我在用卡安全这方面一直 “感觉良好”——比如,我每次拿到卡之后,都会做这么几件事情:
不过即使是这样,我这次还是被盗刷了。盗刷的账单在我这里看起来是这样的:
Activation Blizzard UK LiLondon GB USD -39.99
动视暴雪?看起来很像。我搜索了一下相关的资料,最终在动视暴雪的官方网站下找到了有关未授权交易的专题页面。根据网站提供的资料,看起来这笔 39.99 美元的资金交易属于其中的 “数字产品升级” 类别(我猜可能是游戏装备?)。
在小红书我也搜索了一下,也有类似的用户疑似信用卡资料泄漏,而被动视暴雪扣款,最终争议成功的案例。在贴子中,那个作者表示自己也经常玩游戏,因此一开始也没有觉得这笔交易很可疑。这和我的情况是类似的,所以我有点怀疑是 Steam 把我的支付信息给泄漏了,也许吧,谁知道呢。
向银行报告之后,第二天我便接收到一封电子邮件,说明商家并没有对此账单收费,因此相关费用已经从账单中消除。除了需要等待几天更换信用卡之外,并没有其他的损失。不过,对于信用卡的用户来讲,还是要时刻关注一下自己的信用卡账单,避免这种未授权交易带来的损失。
2025-06-26 06:06:42
我就是 vczh 口中那个 “中学时花了 100 小时编程” 的孩子。高考后,在物理老师邓华的推荐下,我选择了计算机专业。进入行业后我也曾焦虑:万一哪天干不动、不想写代码了怎么办?vczh 的这篇文章告诉了我答案:如果有一天你变得不喜欢编程了,那就不要编程。人生在世除了让自己开心,没有什么是必须做的。
本文全文转载自 @geniusvczh 在 2025 年 6 月 16 日发布的 X.com 文章,排版格式略有调整
又到了每年选志愿的时候。一个想法是否经得起时间的考验,就要看他是否不会跟着总路线一起摇摆。虽然每次的措辞不一样,但是我现在跟码农行业如日中天的 10 年前保持差不多的想法:一个人只要在中学阶段能花超过 100 个小时编程,我就认为他可以安心报计算机,为什么呢?
现在已经活了半辈子了,我越来越觉得 you only live once YOLO 非常的有道理。人终归都是要死的,你做的一切努力都终将白费,所以只有活得开心的人,才没有白来地球 online 一趟。如果你在即将死亡的时候觉得,要是能再来一次就好了,那你就是一个成功的人,我认为这是唯一衡量你是否成功的标志。
如果你中学阶段真的花了 100 个小时编程,那我就认为你是热爱编程的。这种热爱通常不会随着年龄的增长而快速衰退,你一定想在开始工作甚至在中年阶段依然可以写自己喜欢写的代码。然而就算你当了程序员,上班写的代码也可能是无聊的,所以下班后还得写让自己爽的代码。
不管怎么说,报计算机专业终会找到的工作钱会多一点,不管是不是当程序员。而且你从进去大学开始就能一直做自己热爱的东西,工作后还能买得起昂贵的台式机,还有底气拒绝加班,下班后写自己的代码不用看用户的脸色,没人用也不会造成困扰,那么你就可以从此刻开始不停享受写代码带来的快乐。
毕业后,每一年都在做自己喜欢的事,哪怕社会经济出了问题你一下子失业了,晚上写自己喜欢的代码,也可以让你忘却烦恼,白天有更好的情绪。一直有工作自然是好的,暂时没有也不会有很大的压力,保持一个好的情绪,甚至能让你多活好多年,在退休后还能比别人多十几年时间享受写代码的乐趣。
当然人也是会变的。年轻的时候觉得自己只喜欢写代码,到了中年发现多了一些别的爱好,看着 GacUI 代码增长的速度远低于10年前就知道。不过没关系,如果有一天你变得不喜欢编程了,那就不要编程。人生在世除了让自己开心,没有什么是必须做的。
所以报计算机是为了什么呢?就是为了能够一直写代码。如果你真的不喜欢编程,却要被迫写代码维持生计,那是一件非常痛苦的事,搞不好还会熬出抑郁症。所以为什么说我只鼓励在中学阶段写过 100 小时代码的人报计算机呢?
过去几十年见过形形色色的人从零开始学编程,最后会喜欢上的只是极少数。如果你没写过代码,那按照统计,你极大概率是不会喜欢写代码的。不过人生是你自己的,你愿意赌博,那我也不会阻止你的
2025-02-25 13:11:58
在消息推送服务 Pushover 的文档中,介绍了消息共有 5 种不同的优先级别(-2、-1、0、1 与 2)。这些级别对应了不同的消息推送模式,本篇文章对这些消息级别进行讨论。
根据文档描述,这种优先级别不会发送任何推送通知。在 iOS 系统中,只会使主屏幕中的图标角标的通知数量增加,相当于是一种 “静默通知”。结合单独的 Pushover “应用程序/API 令牌”(Application/API Token)来使用时,这种优先级别特别适合发送一些提示性的信息,比如在任务执行过程中产生的日志,或者重要程度低到主动想起来才有必要看的一些信息。
这种优先级别会产生一条手机通知推送,但推送不会有任何的震动或者铃声。在 Pushover 的免打扰模式启用时,普通优先级(0)的消息会降低为该优先级的推送模式。通常,一些需要引起关注,但如果长时间不关注也不会造成太大负面影响的事件的消息推送可以考虑使用该级别。比如天气更新、日常新闻,或监控的日常股票价格走势等。
这是默认的消息推送优先级别。以该优先级别发送的消息会正常产生推送通知,响铃以及震动。这种优先级别通常适合推送 “希望使用推送服务本意” 的事件类型,如需要引起注意的运维事件、需要响应的消息,以及到某个时间点需要进行何种动作等。
以高优先级别推送的消息会绕过 Pushover 用户设置的免打扰时间,并且消息在 Pushover 中以红色底色显示,以引起用户注意。除此之外,消息的推送模式与普通优先级别的消息相同。用户通常会在休假或完成重要任务期间开启免打扰时间。而需要通过这种优先级发送的消息的重要程度足以打断用户正在聚焦的某些工作。通常是需要立即采取行动的事件、重要天气提示以及重要任务执行异常等通知。
注意,高优先级的震动以及铃声通知无法绕过系统的静音设置,除非在 Pushover 客户端中手动设置。
紧急优先级具有与高优先级一致的推送策略,但会重复推送直到用户响应为止。同时,在 iOS 客户端中,用户可以为高优先级和/或紧急优先级的消息设置“重要警告”。在“重要警告”模式下,即使你已将 iPhone 静音或设置了专注模式,也会收到通知。这种模式通常适用于 Oncall 或紧急消息。
在紧急优先级模式下,推送消息时结合 retry 和 expire 两个选项可以控制重复推送的频率以及总共次数。retry 选项用于控制用户未响应时,消息应当多长时间推送一次。可以设置一个 30 秒或以上的值。expire 选项用于控制消息的过期时间,消息一旦过期,则不会再尝试去推送给用户,其最大值是 10800 秒(3 小时)。Pushover 还有一个总共 50 次的消息推送限制,而无论 retry 和 expire 的值被设置为多少。
2025-02-16 22:40:11
我们也许已经使用过一些自动化工作流的服务或工具,如 IFTTT 或 iOS 系统中的快捷指令。这些服务可在某些事件发生时,自动按照预设好的逻辑执行对应的指令——“在股票价格涨至 XX 时提醒我卖出”,又或者 “每天早上 9:00 自动进行软件每日签到”,都可以通过这些工具来轻松实现,就像部署了一个个人助理一样。
这些工具有着各自的局限性。例如 IFTTT 的免费版本仅提供了 3 条激活的工作流配额,超出的部分需要付费月度订阅。而 iOS 中的快捷指令则依赖于手机本身,当设备网络断开或者电量耗尽时,相关指令便不再执行。本文介绍了一款可在本地部署的工作流软件 n8n,该软件提供了强大的无代码或低代码工作流配置功能,能实现从简单到复杂的自动化工作流的能力,并可以配置和调用外部大语言模型作为 AI Agent(代理型人工智能)来完成智能判断和工具调用等功能。

为什么选用 n8n 这款工具?最大的原因是这是目前最好用的可以在本地部署的工作流自动化工具。这款工具提供了我对一个工作流自动化工具的所有基本期待,包括:
n8n 和其他仅提供订阅制的工作流软件的不同之处是,他们有一个在 GitHub 上开源的免费社区版本。该版本除了阉割了一些高级功能(如环境变量配置和多人凭据共享等)以外,所有基本功能都是比较齐全的。除此之外,n8n 也提供了云服务的版本,但该版本(n8n Cloud)没有免费层级。因此,我们推荐在本地服务器搭建 n8n 环境。对于仅希望快速体验 n8n 功能的用户,在 Bilibili 与 YouTube 等平台均有许多演示视频,可供快速评估 n8n 软件的功能。
根据 n8n 的文档,其提供了两种本地部署的选项:通过 npm 包管理器,或者通过 Docker 容器安装。通过 npm 的安装方式直观且快速,可在几分钟内就在本机部署好并运行 n8n 实例:
npm install n8n -g
n8n start
默认情况下,n8n 使用本地 SQLite 数据库用作数据存储。另外,作为生产环境使用时,你也许希望配置 n8n 的服务器域名、回调消息的接收 URL 以及启动端口等参数,这些在 n8n 文档的配置章节中有多篇文档描述。在这里我给出我启动 n8n 使用的脚本命令,以供参考:
#!/bin/bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
export VUE_APP_URL_BASE_API=https://ai.example.com/
export EXECUTIONS_TIMEOUT=3600
export GENERIC_TIMEZONE=Asia/Beijing
export N8N_PROTOCOL=https
export N8N_HOST=ai.example.com
export N8N_PORT=5678
export WEBHOOK_URL=https://ai.example.com/
n8n
我是使用 npm 的方式部署并运行 n8n 实例的,我在本地服务器配置了 Nginx 对 n8n 进行了反向代理。最终的运行结果如下图所示:

如果你从没使用过类似的工具,n8n 官方在 YouTube 上提供了一系列非常好的初学者课程(英文版),这将很好地帮到你。当然,在这篇文章中,我也会向你传授构建一个好的工作流的秘密要点,这不仅适用于 n8n,也适用于其他的工作流自动化软件。
面对着空无一物的 n8n 工作流画布,你是否有那么一瞬间迷失了方向,不知道自己接下来要做什么?回想生活中的实际需求,不知道身边有哪些事情可以被工作流软件 “自动化”?我的建议是首先要找到一个使用 n8n 软件来自动化的简单目标,这个目标可能是:
其实坦率地说,如果要论这些平台的开放性来说,一些在国际上广泛使用的软件的开放程度要比中国内地使用的大多数软件要高得多。比如 Telegram、WhatsApp 都有 API 可供编程调用,而像微信等软件,即使你使用了一些编程手段去调用,也会因为违反用户协议而可能遭致封禁。说到底还是生态环境不一样。
接下来,我们以 App 内的每日签到为例,来展示如何使用 n8n 代替每天繁琐的人类劳动。这可能是使用 n8n 的一个很好理由。
要构建一个工作流,你需要从以下几方面来思考:
对于 App 每日签到工作流,我们希望在每天早上 9 点自动执行它,每次执行时,它会像用户在手机 App 点击 “签到” 按钮一样,发起一个 HTTP 网络请求。除此之外,该工作流不需要任何外部数据,也不需要在数据之间进行提取或转换。
我们通过在 n8n 主页面右上角点击 “Create Workflow”(创建工作流)按钮,以创建一个新的空白工作流。在空白画布的中央,点击 “Add first step”(添加第一个步骤)按钮,以添加一个工作流触发器:

由于我们的工作流在每天早上 9 点自动运行,因此在这里我们选择 “On a schedule”(定时)选项,然后在打开的窗口配置对应的定时策略。

接下来我们添加 App 签到功能的节点。通常要求签到的 App 是不提供公开 API 的(因为这些软件期望用户每天手动点击签到,以增强用户粘性),因此,我们需要用一些技巧来抓取签到操作对应的网络请求。我们以 iOS 上的步骤为例,这需要在手机上安装一个抓包工具,如 App Store 上的 Stream 等。打开要签到的 App,在点击签到按钮步骤之前,打开相应抓包工具的录制或监控功能,然后点击 App 中的签到按钮后,关闭对应的抓包工具。这样一来,你就抓取到了包含签到请求的尽可能少的请求列表,这有助于你分析具体的有效请求。
分析签到请求的一个技巧是,通过观察请求列表中包含类似 “签到” 含义的 URL 的对应 GET 或 POST 请求,看到这些请求的响应信息,一般都会有服务器端 API 返回的签到确认信息,像下面的样子:
"sign_message": "签到成功"
许多抓包软件都有请求重放功能,该功能有助于你确认对应的请求是否是有效的签到请求。在第二天对疑似的请求进行重放,从而确认哪个请求是对应的签到请求。由于这些请求包含了 App 的用户登陆状态,因此请求的结构体可能比较大,最方便的方式(大多数抓包软件都有提供)是复制请求为 cURL 格式。而 n8n 的 HTTP Request(HTTP 请求)模块可以允许粘贴一个 cURL 命令以做解析,非常方便:

设置好之后,可以点击橙色的 “Test step”(测试步骤)按钮,来执行对应的 HTTP 请求,你能从右侧的结果窗口看到 HTTP 的响应。一切设置妥当后,别忘了点击工作流编辑器右上角的 “Save”(保存)按钮,保存编辑的工作流。然后在主页面中打开对应工作流的开关,这样一来,每天上午 9 点 n8n 就可以为你执行自动签到了。
当然,n8n 的官方网站也提供了许多用于生产环境的工作流示例,这些工作流展示了与第三方系统(如 CRM 系统)集成的用例。一些复杂的工作流还包括将数据交由 AI Agent 处理的逻辑。与大语言模型进行交互是另一个有趣的话题,我们将在之后的文章中做更多介绍。