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 处理的逻辑。与大语言模型进行交互是另一个有趣的话题,我们将在之后的文章中做更多介绍。
2025-01-12 06:22:41
又是一个不眠夜。
自从上一篇博客以来已经有大半年没有动笔来写文章了。因为总有许多工作要处理,而除此之外,有更多让我沉迷的事情。但今天是一个好的机会,虽然失眠的日子越来越少(这是好事),但是在这难得的氛围里,我终于又能撰写这一年的年终总结了。
回顾 2024 这一年,我仍然在我的全职工作中投入了大量的精力。今年一年带给我的成长不但是技术水平的提升,也是 “如何处理事情” 以及 “如何更高质量交付任务” 的能力提升。对我来说这是非常忙碌的一年,但在工作报酬之外,我得到的经验也是十分可贵的。
除此之外,我继续去做了许多有意思的事情:首先便是继续旅游。这一年里我探索了两个新的目的地:泰国以及日本。其实说到日本,它也不算是一个 “新” 的目的地了。早在疫情之前,我便和家里人乘坐邮轮去过一趟日本。当然当时只呆了一天,并没有在日本过夜。并且现在回想起来,说实话,光靠 6-8 个小时岸上旅游的时间,你根本无法感受一个国家的风貌。2024 年的两次日本旅行我分别探索了大阪和东京(以及附近地区),总共在日本呆了多一周的时间,对这个国家方方面面的感受也更加细致。
有趣的是,第一次去日本的时候,我们只办理了单次使用的电子签证。结果从日本一回来,我和 Minda 一商量,对日本的印象都挺好。之后的几天我们又去了趟大使馆,申请了赴日本的多次旅游签证。本来 2024 年 10 月份我有去加拿大的旅行计划,没想到提交加拿大签证申请之后竟然被拒签了(加拿大使馆反馈说我的入境目的不够令人信服,我了解到一些其他南亚裔国家居民甚至更容易申请到加拿大签证),气不过的我和 Minda 一合计:干脆再去一趟日本旅游——于是多次签证就这么被用上了。
这一年我深入地贯彻了几乎 “每个月旅行一次” 的规划,投入了更多时间去研究便宜的机票和有趣的目的地,当然旅游的开支也有所增加。但如果提前规划好行程并比较合适的航线,是能够以非常划算的价钱完成整个旅行的。更棒的一点是,这样的旅行成为了我的月度 “刷新时间”,能让我以更高的效率来完成手头的工作(在旅行之后),因此对我来说是个非常划算的决定。哦对,香港 “九龙餐室” 的咖喱牛腩饭很好吃!
这一年我继续做了许多探索性的工作,这些工作占用了业余的一些时间(其实是很多时间,也许将这些时间留给写博客的话,我能够写出更多的文章)。我还不太愿意分享这些工作的具体细节,因为其中没有任何事情我认为是达到 “已经做出成果” 级别的。不过我很开心我能够继续保持这种探索的频率,这让我在这一年的每一周都在处理不同的问题。中间踩了很多坑的同时,也收获了一些乐趣和见识。希望新的一年能够继续努力。
最后一块忙碌的事情是阅读和游泳。这两项任务都没有达到我自己的目标。我一年只读了两三本书,并且都是技术类的。我更多的时间花在了在线查阅文档以了解新的内容上,当然也都是技术相关的内容。希望新的一年我能把更多时间花在阅读上,阅读一些人文社科的内容,来 “保持与这个世界的联系”。游泳完成的还算不错,达到了全年十二分之十的目标,因为新加坡雨季的关系,这块的目标并没有全部完成。
当然我还实现了去年的目标的其中一条:“增强英语口语交流能力”。我是通过和 ChatGPT 的 “高级语音模式” 频繁练习来达到这个目标的。与 ChatGPT 语音交流时,我会通过类似下边的指令来开始一段新的对话练习:
我正在做为一名英语学习者来练习我的英语口语能力。我需要你来挑选一个跟之前我们的练习都不一样的主题,扮演与我对话的人,跟我进行多轮英文对话。在这些对话之后,如果你觉得合适,可以对我们对话的内容进行总结,并逐句指出我的语法问题。然后,要求我复述对应正确的英文表达方式。
贯彻这种练习方式,在这个目标上我取得了一些显著的进步。现在,我能够使用英语和我们公司以英文为母语的同事进行比较长时间的对话,或者以英文分享培训材料。
其实我感觉我有很多技术主题想要分享,有一些是没有来得及写,另一些主题可能更适合以公司的名义发布到官方渠道中。不过无论如何,我一定会在新的一年抽出来更多时间,去给大家输出更多高价值的内容。
写到这里,突然发现我的年终总结的风格从一开始的天马行空,抒发对生活的情感,越来越变成像绩效考核式的量化总结了。我不知道这样的变化会不会带来问题,但是我愿意去花更多时间,来继续迫使自己将时间投入到对生活的感受上。考虑到每一年的时间都过得飞快,因此我今年对自己只有三个目标:
这三条都是比以往宽泛地多的目标,对吧?但是借着每年给自己做规划的宝贵机会,我是真的想结合上一年的感受和体验,在新的一年里做出一些小小的改变。通过这些不那么具体的目标,我有了足够的灵活度来思考分配这些宝贵的业余时间,来让自己的每一年都充满不同。
2022 年我将这个博客加入了一项名为十年之约的开放计划,这项计划旨在鼓励更多的简体中文独立博客作者,持续的坚持更新他们的博客内容。写这篇年终总结的时候,我也翻看了 saveweb/review-2024 这个项目,有超过几百位独立博客的作者总结了他们过去的一年。说实话,我觉得大部分人都很厉害,至少比我厉害:他们做了一些很酷的事情或者项目,年终总结的篇幅或者文学素养都比我要更高。我期待自己在新的一年里仍然保持活跃的精力,来持续输出更多的内容,不负时光的约定。
明年见!
2024-08-21 21:10:00
本文的作者是费轩。
在黔追寻阳明行迹的六天里,最常听到的问题便是“阳明学对现代人的精神内耗能够起到什么作用?”其实,如果阳明只是一位古圣人,那么便无法对沦没于无聊日常生活的今人有什么借鉴意义,因为史诗、传奇的时代已经一去不复返了。然而,我却愿意将阳明视为我们的同时代人。王阳明在明代中期的政治 – 生存处境中,深刻地遭遇到个体性危机,作为一位敏锐的思想家和严肃的行动者,他以全副身心性命面对这一历史变局,阳明学便是这一历程的思想产物。
14 世纪末中国人口约六千五百万,至 1600 年已激增至一亿五千万左右。人口膨胀造成大量的冗余士人,他们虽然接受四书五经的经典教育,有着治国平天下的自我期许,但是无法通过科举的激烈竞争进入到国家政治体制之中,因此成为政治编外士人。里甲制趋于解体,被束缚在土地上的人口不断流动,进入到市镇当中。第一批耶稣会传教士的到来,使得新的天文、历法和算学知识,乃至不同以往的对宇宙的整体理解,在士人阶层中产生影响。明代政治的暴虐,君主的酷杀,以及由武宗开端的任性乱政或怠政,所有这一切,对“天地君亲师”的传统礼制都造成了深刻的影响。这一影响对于那些对时代敏感的士人而言,可以说是颠覆性的。阳明学正是在这样的环境中发生和发展。
阳明在少年时有着过人的精力,但他深思而敏感。阳明深思到什么程度?他格竹不成,于事事物物中穷理不得,竟然引发身体的病痛和精神的困顿。如果阳明到今天医院的精神科就诊,医生恐怕会将他诊断为抑郁状态吧!内在的激情过于旺盛,却无处释放,找不到人生的方向:他或是沉溺于兵法,出关逐胡儿骑射,或是沉溺于辞章之学,与诗友文人往来唱和,或在身为高官的父亲的庇佑下从事举业。以阳明的才智,他投身于其中任何一项事业,都会有所成就。但是,所有这些都使他感到不满足。他的肺病,简直可以说是内火郁积而来的。与那些编外士人相比,阳明是幸运的,因为他已经赢在了起跑线上,父亲王华为他早年的仕途费尽心力,甚至遭人非议。鲁迅《狂人日记》中的狂人,终于“候补上任”了,于是他的狂病不治而愈,回归“正常”。但是,步入仕途,只能让阳明的“精神病症”隐而不显,过了一段时间,工作又不能使他感到满足,于是修仙逃禅,归家养病。对于大多数获得编制的士人而言,休闲逃禅只是政治失意后的退路而已,所谓“退隐”,不过是暂时蛰伏起来,以逍遥的态度积蓄力量,一旦有合适的机会,便会毫不犹豫地重新回到政治。几乎对于所有中国士人而言,政治就是他们身心性命的全部,是他们此生此世的宗教信仰。
在龙场驿大酒店与友人夜谈,朋友说道:如果阳明在龙场没有悟道,那么阳明就死了。死的不是阳明的肉体——他终其一生都没有摆脱病痛的困扰,而是立志做圣人的那个青年阳明——阳明的精神。立志是无中生有的工夫。当他被贬至龙场,置身于荒蛮,处身于“赤身裸体”的无家可归状态时,“天地君亲师”的整全礼制随同洞穴的黑暗而归于隐没。所念只在“俟死”而已。
无中生有,就是向死而生。自心的觉悟,是照亮无明的炬火。这样的时刻,不是发生一次就可以许诺终生圆通的,在接下来的人生历程中,仍然会有困窘,仍然会面对初心退转的考验。
正德十四年平朱宸濠之乱,阳明对兵法的运用可谓出神入化,然而平乱后阳明陷入毁谤之中,甚至性命难保。其时阳明的精神状态,如他自述所言:终日恍恍,如在梦寐。避居杭州净慈寺养病也好,逃遁入九华山中也罢,阳明在这番考验中身心焦灼。在弟子蔡世新所绘阳明像中我们可以看到,平乱后的阳明面目瘦削、颧骨突出。他的友人也提到,平乱后,阳明鬓发斑白。
我们在这里看到的不是天生其德、高超圆融的自信自得,而是明确一己之有限性的戒慎恐惧。对于王阳明来说,自心觉悟是不断重临的考验,是在历史和时势当中不断激活的极端体验。自信觉悟不是一个如洒扫应对一样,可以欲求并求得,可以通过允执厥中的实践操练就能达至的一次性事件。这就是为什么在龙场悟道后多年,又有正德十四年和十五年的良知学突破。
听钱明老师讲,玩易窝在旅游开发之前,不仅是当地人的才采石场所,而且沦为了堆放垃圾的洞穴。今天展现在我们面前的玩易窝,是经过开掘与修整的。历史何其吊诡,对五百年来中国文化与士人精神产生如此巨大影响的阳明悟道地,竟然在几十年前以采石场和垃圾堆的形象存在,在今天又被纳入到旅游产业当中,成为人们拜谒古圣人的圣地。历史真是以戏剧性的方式向人们展现其自身的。
当明武宗沉迷于巡游享乐,不再亲祀天地,当明世宗在大礼议中以一己之私将本生父母列入帝后谱系,在在对“天地君亲师”的礼制秩序形成嘲讽与颠覆时,在专制君主的阴鸷酷杀和士大夫得君行道的期待中,在廷杖的屈辱与士大夫争相就杖并引以为豪的人性幽暗中,阳明和历史中的其他觉悟者们,难道没有觉出荒诞来吗?朱子说:“尧舜三王周公孔子所传之道,未尝一日得行于天地之间也。”历史的觉悟者并非对历史的非理性视若无睹,而是如阳明所说:“此念生于孩提,此念可去,是断灭种性矣。”正是这种不忍人之心,才使得深知历史 – 天命无常的觉悟者,以出世的精神做入世的工夫。
2024-05-30 09:21:08
本文的作者是费轩。
热气透过大敞的窗户涌入,我偏头看向内室的玻璃,觉得脸上干净不少。虽然瘦了,但是下巴显得分明。两道眉毛仍然紧凑在一起,不能舒展开来。宿舍内的书几乎已经搬空,每周返校工作,随身携带一些书,是韦伯和沃格林的。
就在这间屋子,还记得 2022 年刚搬进来时与 hl 畅聊、品茶、尝试咖啡;还记得那年底被封在宿舍楼中,担心不知何时被转运,蹲在卫生间手洗一大盆衣服;还记得 11 月底几乎每天到 hl 屋中激愤地诉说,看他一支烟接着一支烟地抽,然后沉默;还记得 2023 年 3 月的那次甲流,在屋中高烧两日,hl 送来生煎包和馄饨;更记得身心俱疲的 5 月,四五点钟天将要蒙蒙亮时,听着窗外传来的各种鸟叫,从未感到如此清晰、如此吵闹,想到那个人的拒绝和两个月的过往,咽下孤独,觉得喉咙发紧。
以前经常读到某位哲学家在自述中写到某年某月“大病,几死”。当时疑心是作者为了传奇色彩而夸张。有的人也许属于自我感觉不好,如李泽厚和熊十力,从中年开始就不断抱怨自己身体如何如何差,命不久矣,但却都很高寿。如果有幸忝列这一思想谱系,我在自述中大概也可以使用这句话,用来形容去年底的经历。23 年底到 24 年初厚厚的一沓检查报告和病历还留在文件夹中,按时序排列,原本想誊抄下时间节点,留下资料以便回顾,再做销毁。现在终于恢复了健康(甚至比大病之前还要健康),回顾也不想再做了,因为回忆使人痛苦,也因为精神已经松弛从而懒惰。这些病历很快就要去到它们该去的地方:碎纸机。
“西学为体中学为用,刚日读史柔日读经”,这幅联句还挂在老地方。22 年底每天醒来第一个看到的就是这幅联句,其时其境,可以说完全晓彻这两句话的含义,那时,我是以“取今复古,别立新宗”自认的。为什么总谈到一年半前已经“过去”了的事?难道是某种创伤记忆吗?难道就像那天给导师发了现场视频,老师秒回他在 35 年前的经历,一下触发了激情?衰颓固化的时代再也掀不起结构性变革的浪潮,个体自觉到与社会历史行程相切割,对生存处境的改善,只能乞灵于回到自己的一亩三分地,把小日过得精致到登峰造极,在各种分疏但却同一的体验中寻求认同,与世隔绝。这样,历史可真是终结了。
经此一遭,思想发生不少变化,当然,同心圆——那个回心之轴没有变。现在愈发明确,50 年一代学者(知青、文革一代)和在 50 年一代学者陶养下成长起来的 70 年一代学者(文化热一代,特别是在大学期间经历了 89 和后 89 的市场化浪潮),他们的思想不可能成为我精神解困的方法。90 一代在去政治化的环境中成长起来,这就决定了他们的非政治性(把去政治化说成也是一种政治,只不过反映出说者本身的政治性),使得他们面对 50、70 一代所未面对过的个体人生问题。出于智性上的清明,我不得不认为,这种个体人生问题,不是任何重新政治化的动能所能解决的,在当下,重新政治化的激情只能与已有建制和文化保守主义合流。90 一代很难像 70 一代那样受惠于 50 一代学者的思想(70 一代学者做的往往是把 50 一代学者思想精致化、国学化的工作),他们面对的是全新的问题,需要开辟全新的道路,在这方面,不能抱有任何便巧的幻想。
2024-03-24 14:36:37
本文最后更新于 2024 年 3 月 29 日
来自马来西亚的亚洲航空(AirAsia)近日推出了他们继 2022 年 SUPER+ 无限飞行年度计划之后的又一个年度订阅计划 AirAsia Unlimited Asean Pass(亚航东盟无限飞)。和上一年度的订阅计划不同,这一次的计划订阅费用变得更贵,并且仅限于在东盟国家的 69 条航线内的指定日期的航班内选择(要知道,去年的套餐是可以全球范围飞行的!)。然而抱着折腾不止的心态,我还是毅然决然购买了他们的年度飞行计划,踏上了一条折腾不止的不归路……
友情提示:这个计划本身有很多很坑的地方,如果没有做好折腾的准备,千万不要购买!
在亚行东盟无限飞计划的条款与条件页面中有诸多限制,这里先整理概括如下:
看起来是一个还算公平的计划,是这样吗?我算了一笔账,因为我居住在新加坡,并且持有的是中国内地护照,自疫情结束之后中国与东南亚许多国家都签订了互免签证协定。因此包括泰国、马来西亚与(将来很快的)印度尼西亚在内的许多国家,去旅行都会很方便。388 新币(约合 2000 人民币左右)的计划价格,只要平均每个月周末旅行一次,就可以完全值得回本。因此我义无反顾地购买了这项计划订阅。
我自认为完整阅读了计划的条款与条件后,便能清晰了解该计划的优缺点,于是购买计划后,我便开始预定机票,筹划着 5 月份的第一次旅行。然后我就遇到了这样的错误提示:
无法用于选定的航线或者日期?我又尝试了许多不同的目的地/时间选项,最后终于发现我忽略了无限飞订阅中的一个重要限制:所有的可用航班均以查询页面的展示为准,并不是除了限制日期外,所有日期都有航班,并且可用日期的航班也是有限的。以新加坡 – 吉隆坡的单程航班为例,可用于 2024 年 5 月 3 日(星期五)的预定航班如下:
新加坡 – 吉隆坡是全球最繁忙的国际航线,仅亚洲航空每天便有超过 12 班定期航班往返两座城市之间。而适用于无限飞的航班却选择“十分有限”。另外,该计划在许多目的地之间的限制,使“周末游”变得不是十分可行,以新加坡往返兰卡威的航班为例,2024 年 5 月 – 6 月期间,无限飞适用于如下日期:
因此,从新加坡到兰卡威的周末游变得就不是十分可行。AirAsia 官网上提供的查询工具非常简陋,仅能查询特定月份的两个目的地之间的单程航班的一般供应量情况:
抱着折腾不止的心态,我找到了该工具的数据源[Wayback Machine]:这是一个记录了从 2024 年 5 月 – 2025 年 4 月期间,无限飞计划的所有可用航班及其供应量的列表。值得注意的是,似乎该列表是动态增长的。在本文初次写就时,该列表中共有 17955 项可用的航班信息,而如今列表中拥有超过 2.1 万条航班信息数据。我对该数据进行了一些统计,发现一些有趣的数据事实如下:
import re
import json
from typing import NamedTuple, List, Dict
class Flight(NamedTuple):
Origin_Country_Name: str
Destination_Country_Name: str
Origin_Airport_NameAndCode: str
Destination_Airport_NameAndCode: str
DepartureDateMYT: str
TrafficLightSequence: str
class FlightRoute(NamedTuple):
origin_code: str
destination_code: str
def get_airport_code(string: str) -> str:
return re.findall(r'\(([A-Z]{3})\)', string)[0]
with open("O2availableseat.json", "r") as _f:
flights: List[Flight] = json.loads(_f.read())
flight_info: Dict[tuple, list] = {}
for flight in flights:
origin_code = get_airport_code(flight["Origin_Airport_NameAndCode"])
destination_code = get_airport_code(flight["Destination_Airport_NameAndCode"])
route = (origin_code, destination_code)
if route not in flight_info:
flight_info[route] = []
flight_info[route].append(flight)
flight_info = dict(sorted(flight_info.items(), key=lambda x: len(x[1]), reverse=True)) # sort by number of flights DESC
如果你需要更直观的查询这些数据,我已经将它共享到 Google Sheet 在线文档中,你可以随时浏览或将这些数据下载到本地。你可以使用这些数据来规划你的行程,比如说找到可以供周末旅游的航线,或者研究是否值得购买亚航无限飞。