
(在这个万物皆需下载 App 的时代,一张用 curl 在终端呼唤天气的极致视觉浪漫)
深夜两点,键盘敲击声和最后半块海盐焦糖甜甜圈的香气在房间里打架。
今天是2026年2月23日,星期一。恰巧也是美国的“全国合理化日(National Rationalization Day)”——(轻抚下巴)听起来简直像是专门为我们这些喜欢过度设计(Over-engineering)的程序员发明的节日。
窗外,上海正下着 9.92°C 的中雨。冰冷的雨滴敲击玻璃的声音,和今晚美股因为 AI 恐慌暴跌 800 点的新闻一样让人清醒。听说某硅谷巨头又在疯狂锁定囤积算力芯片,大佬们在模型的深渊里卷得不亦乐乎。而此时此刻的我,盯着跳动的服务器错误日志,只想在纯黑的终端里安静地看一眼明天的天气。
既然大多数人都睡了,那我们聊点大厂技术沙龙里不敢说明白的真心话……
谁还在用那笨重得像发面馒头一样的天气应用?
回想一下那个让你抓狂的场景:你的 SSH 会话已经连了六个小时,排查完最后一个跨域 Bug 后,你揉了揉酸痛的颈椎,发现窗外已经完全黑了。“明天降温吗?出门需要穿那件厚风衣吗?”
通常情况下,你是怎么解决这个极其简单的诉求的? 你会切出编辑器,打开浏览器,输入某个气象网站。Boom!一个占满半个屏幕的 Cookie 授权弹窗糊在你的脸上。Boom!一个你根本买不起的汽车视频广告开始以最大音量自动播放。为了获取简简单单的“10°C,有雨”这几个字符,你被迫下载了 50MB 臃肿的 JavaScript 脚本和无数个后台追踪器。
如果你骨子里是个硬核开发者,你可能会选择去调用气象 API(比如 OpenWeatherMap)。但麻烦又来了——你需要先注册账号,验证邮箱,去控制台生成一串长达 64 位的 API Key,然后写一段长长的 Python 脚本,或者在 Bash 里把响应结果用 jq 工具进行一层层解析,仅仅为了从深层嵌套的 JSON 结构里把 feels_like(体感温度)给扣出来。
我在想,为了知道明天出门带不带伞,我们居然要走完一套堪比申请房贷的身份验证流程。这感觉就像是为了喝一口水,系统架构师非要逼着你先去考个潜水证。
这种割裂的、冗杂的用户体验,每天都在科技圈上演。在这个我们自诩为高效的赛博世界里,连获取天气都变得无比沉重。直到那个名叫 wttr.in 的开源项目出现在我的命令行里,它干净得就像是暗夜里一声清脆的响指。
撕开华而不实的伪装,回归 HTTP 的极简浪漫
wttr.in 是一个纯粹面向控制台的天气预报服务。它最初只是 Go 语言项目 wego 的一个小包装器,但在作者 Igor Chubin 的打磨下,它现在已经成长为每天处理上千万次查询的超级枢纽。背后由 WorldWeatherOnline 等上游提供数据源,搭配极简的 Python 路由,组成了这个极致优雅的艺术品。
它为什么能让人一眼惊艳?因为三个字:零依赖。
不需要注册账号,不需要申请恶心的 API Key,甚至不需要你使用 npm install 或者 apt-get 去本地安装任何二进制包。只要你的系统里有一个最基础的 HTTP 客户端工具,你只需要在终端里敲下这几个字母:
curl wttr.in
瞬间,一幅带有完美 ANSI 颜色转义的精美天气预报图,就会直接在你的命令行里铺展开来。它甚至懂得根据你的外网 IP 自动推断你所在的城市。

[图注:你看这行云流水的字符画,像不像在满是预制菜的快餐店里,主厨直接端出了一盘带着泥土芬芳的现摘松露?干净,生猛,直击灵魂。]
但这还不足以让我专门为它写一篇文章。它真正的杀手锏,是那极其优雅的 “多态输出”(Polyglot Formats)。
在这个万物皆需微服务、强迫你下载独立 App 的时代, wttr.in 创造了一种“基于 URL 扩展名”的隐式 API 魔法。同一套底层数据,它能根据你的请求后缀,变幻出完全不同的形态:
- 如果你直接
curl wttr.in/Paris,它返回的是适合终端阅读的彩色字符画。
- 如果你在后缀加上
.png(例如 wget wttr.in/Paris.png),它会直接甩给你一张渲染好的透明背景位图,你可以用 ImageMagick 直接把它当水印打在你的摄影作品上。
- 如果你加上
?format=j1,它又会乖乖吐出结构严谨的 JSON 数据供脚本调用。
- 更绝的是,对于重度运维监控患者,输入
curl wttr.in/Detroit?format=p1,它甚至能直接输出 Prometheus 格式的指标数据,让你的 Grafana 监控大屏无缝接入气象面板。
它就像是一个藏在云端、精通多国语言的万能管家。只要你开口,它就用你最舒服的姿势把数据端上来。
拒绝废话的极客实战:把气象站搬进你的 Tmux
作为一名热爱折腾的极客,仅仅是看一眼就关掉,绝对是对 wttr.in 的亵渎。既然它轻量到没有边界,我们要把它无缝缝合进我们日常的工作流里。
场景一:单行极简模式,Tmux 状态栏的灵魂注入
如果你是 Tmux 或是 i3 window manager 的重度用户,你一定极度吝啬屏幕空间。 wttr.in 贴心地提供了一行输出模式。打开你的终端,试试输入这段指令:
curl 'wttr.in/Shanghai:Tokyo?format=3&period=60'
要把这个效果固化到 Tmux 的状态栏,你只需要在 ~/.tmux.conf 里加上这段魔法配置:
set -g status-interval 60
WEATHER='#(curl -s wttr.in/Shanghai:Tokyo\?format\="%%l:+%%c%%20%%t%%60%%w&period=60")'
set -g status-right "$WEATHER ..."
代码显微镜 (Code Microscope):(推了推不存在的眼镜)嘘,仔细看这段配置里的心机。在 tmux.conf 里,我们必须用 %% 来转义原始的 %。 format 参数里的 %%l 代表当前位置 (Location), %%c 代表天气状况的 Emoji, %%t 则是实际温度。最精妙的是后面的 period=60 参数——当你像我一样贪心地同时查询“上海”和“东京”时,它不会把长长的一串全部塞进状态栏,而是会像霓虹灯招牌一样,每 60 秒在两个城市之间平滑轮转。这不仅完美节省了屏幕像素,还大大降低了对服务端的并发请求压力。得益于这种精妙的设计,在终端里看天气,感觉就像是开着法拉利送外卖——快得离谱且游刃有余。
场景二:把实验性的高维地图嵌入现代终端
如果你不满足于纯文本,试试它的 v3 实验性地图视图。输入这行命令:
curl v3.wttr.in/Bayern.sxl
如果你使用的是支持 Sixel 协议的现代终端(比如 WezTerm 或是 iTerm2),奇迹就会发生——一张高分辨率的地形云图会直接跨越文本的壁垒,在你的纯黑命令行里像画卷一样铺展开来。
避坑指南(来自 Lyra 凌晨三点的踩坑记录):
- Emoji 乱码的“黑方块”诅咒:有很多同学兴冲冲地跑完命令,发现终端里本该出现太阳和雨滴的地方,变成了一堆黑白方块或是问号。这口锅
wttr.in 可不背。这是由于你的终端缺乏 Emoji 字体支持。强烈推荐安装 Noto Color Emoji。在 Linux 下,你需要在 ~/.config/fontconfig/fonts.conf 中把 monospace 的首选字体指向它,然后运行 fc-cache -f -v 刷新。
- URXVT 用户的蜜汁缩进:如果你是个老派的 URXVT 终端坚守者,你会发现天气图标后面的字间距宽得能跑马。这是因为 URXVT 有时无法正确计算部分特殊字符的宽度。记得在你的
.Xresources 配置文件里补上一句硬核的 URxvt.letterSpace: 0,强制教它做人。
剥开代码的糖纸:这是创新,还是重新造轮子?
在这个言必称大模型、连买个菜都要用 AI 预测消费者算力的浮躁年代,一个仅仅是拉取天气接口的工具,真的值得被极客圈如此吹捧吗?
让我们横向对比一下它的生态位。 左手边,是诸如 OpenWeatherMap 这样传统的直接 API。它们是纯粹的“原材料”,提供的是冰冷、干燥的原始 JSON。它们足够强大、极其稳定,但要求你必须是个手握全套厨具的厨师,才能把它加工成能咀嚼的信息。 右手边,是诸如 AnsiWeather 和原始的 wego 这样的本地 CLI 客户端。它们是“微波炉”,能把你买来的生肉烤熟,但前提是你得在自己的电脑里腾出一块地方,把这台微波炉安装好(配置各种语言的依赖环境)。
而 wttr.in 呢?它彻底颠覆了“客户端渲染”的思维定式。 它本质上是一个部署在云端的“全自动料理机”。它把繁琐的色彩渲染、字体对齐、甚至月相的星体计算(作者为此专门写了一个 pyphoon 库)全部扛在了服务器的肩膀上。然后,它让哪怕最简陋、最古老的 HTTP 客户端(curl),直接充当了 UI 阅读器。
这根本不是在造天气的轮子,这是在 重新发明终端内容的交付方式。 当我们的大厂前端架构师们还在为首屏加载该用 SSR 还是 CSR 吵得不可开交、为了减小 10KB 体积焦头烂额时, wttr.in 用一种近乎野蛮的极简主义告诉我们:真正高级的 API,是不需要阅读三页鉴权文档就能靠直觉盲打的。
当然,它的短板也正如它的优点一样危险。 因为服务端包揽了一切,它成了一个高度中心化的脆弱节点。当全世界的 Linux 极客不约而同地把它写进 ~/.zshrc 作为终端启动欢迎语时,这个纯粹依靠社区力量支撑的服务器,偶尔也会在晚高峰期疲态尽显,给你报个冷冰冰的 502 Bad Gateway。免费的公共资源和庞大的自动化脚本滥用,永远是开源世界里难以调和的矛盾。
不过,在见证了它带来的极致优雅后,这点小小的瑕疵,又算得了什么呢?
/ Dev Note /
夜更深了。屏幕上 curl wttr.in/Moon 敲出的那一轮由 ANSI 字符组成的残月,意外地和窗外上海雨夜里那看不见的月亮重叠在了一起。
美股的跌幅可能还会扩大,巨头们的算力焦虑依然会无情地统治着明天的科技头条,新概念和新框架每天都在以令人疲惫的速度迭代。但在我们这方寸大小的纯黑终端里,依然有那么一群人,愿意为了一朵用字符拼凑出来的云彩,为了让状态栏里的温度能每隔 60 秒优雅地跳动一次,倾注他们毫无功利心的才华与热爱。
生活不像 Docker 容器,坏了不能一键销毁重启;现实世界的天气,也不受终端参数的控制。但好在,在这个充满变数和焦虑的世界里,只要你敲下回车键,总有一个服务器会在远方亮起,用一行小巧的彩虹字符温柔地告诉你:
“明天有雨,记得带伞。”
晚安,赛博世界的守夜人们。这类能够无缝融入工作流的精巧工具,正是云栈社区乐于挖掘和分享的宝藏。如果明天你也决定在终端里看一眼天气,你会先查询哪个城市?
References:
—— Lyra Celest @ 湍流 τ
[湍流·今日风向] 旧秩序的裂痕:AI 攻破 COBOL 帝国与 IRS 的“休克疗法”
算力池里的化学键:放弃文字接龙,拆解大模型推理的拓扑美学
别再死磕原生NIO了!换上这台统治Java生态的“性能引擎”,我终于治好了并发焦虑
[湍流·今日风向] 字节跳动破解AI推理“分子式”,OpenAI 硬件初现端倪](https://mp.weixin.qq.com/s?__biz=MzcwNjAxODg1OQ==&mid=2247484475&idx=1&sn=7ddfb3e47e32b0a681d32cd21f89937c&scene=21#wechat_redirect)
[湍流·今日风向] OpenAI 硬件迷雾:Jony Ive 的 2027 终局与谷歌的“灭绝”预言](https://mp.weixin.qq.com/s?__biz=MzcwNjAxODg1OQ==&mid=2247484470&idx=1&sn=57f2da7c9623e9208da7e7a01fc0b8e2&scene=21#wechat_redirect)