很多时候我们想快速查一下天气,打开浏览器、搜索城市、等页面加载——太慢了。今天用 OpenCode,3 分钟从零撸一个命令行天气查询工具 weather-cli。
Python 实现,调用免费天气 API,不需要注册密钥,即装即用。
npm install -g @anthropic-ai/opencode)在终端输入 opencode 进入交互模式,就可以开始了。
我先描述需求,让 OpenCode 搭建框架。
> 我对 OpenCode 说:
> "创建一个 Python 天气查询命令行工具,用 argparse 解析参数,支持指定城市名和 -f 切换华氏度。用 wttr.in 免费 API,只使用标准库。"
OpenCode 自动生成了项目结构 weather.py,包含 argparse 参数定义和 urllib.request 网络请求框架。它会询问确认——确认后,基础代码就位了。
要点: 描述项目时把"输入→处理→输出"说清楚,OpenCode 就能一次生成完整骨架,不需要逐步细化。
有了骨架,接下来让它填充业务逻辑。
> 我对 OpenCode 说:
> "实现 fetch_weather 函数:用 urllib 请求 https://wttr.in/{city}?format=j1,返回解析后的 JSON。如果网络出错或 JSON 格式异常,打印错误并退出。"
OpenCode 生成了带 try/except 的请求函数,自动处理 URLError 和 JSONDecodeError 两种异常。
要点: 指定函数签名和行为时,把边界情况也说上("出错就退出"),OpenCode 会自动补全异常处理,比自己写还周全。
原始数据是 JSON,用户要看的是直观的天气信息。
> 我对 OpenCode 说:
> "写 format_weather 函数,从 API 返回的数据里提取温度、天气描述、湿度、风速、体感温度,用 emoji 和分隔线美化输出。温度单位可选 °C 或 °F。"
OpenCode 用 current_condition[0] 提取当前天气数据,按字段格式化输出,行首加 emoji 图标,分隔线分隔,一眼看清所有关键信息。
要点: 前端/输出格式这类重复性高的工作交给 AI 最合适——你只需要描述"要什么样子",不需要手写格式代码。
> 我对 OpenCode 说:
> "加 main 函数整合所有逻辑,运行时先打印'正在查询...',然后调用 API 和格式化函数。最后帮我跑一下测试,查询 Tokyo 的天气。"
OpenCode 补全 main() 函数,然后自动运行 python weather.py Tokyo,终端输出了查询结果——Tokyo 28°C,阴天,湿度 78%。一次跑通,无需调试。
要点: 要让 OpenCode 帮你测试,直接说"帮我跑一下"就行,它会执行命令并展示结果。
#!/usr/bin/env python3
import argparse
import json
import urllib.request
import urllib.error
import sys
def fetch_weather(city: str) -> dict:
url = f"https://wttr.in/{city}?format=j1"
try:
with urllib.request.urlopen(url, timeout=10) as resp:
return json.loads(resp.read())
except urllib.error.URLError:
print(f"网络错误:无法连接到天气服务")
sys.exit(1)
except json.JSONDecodeError:
print("数据格式异常,请稍后重试")
sys.exit(1)
def get_forecast(data: dict, units: str) -> list:
forecasts = []
for day in data["weather"][:3]:
date = day["date"]
high = day[f"maxtemp{'C' if units == '°C' else 'F'}"]
low = day[f"mintemp{'C' if units == '°C' else 'F'}"]
desc = day["hourly"][4]["weatherDesc"][0]["value"]
forecasts.append(f" {date} {low}~{high}{units} {desc}")
return forecasts
def format_weather(data: dict, city: str, units: str = "°C") -> str:
cur = data["current_condition"][0]
t_key = f"temp_{'C' if units == '°C' else 'F'}"
f_key = f"FeelsLike{'C' if units == '°C' else 'F'}"
lines = [
f"\n📍 {city} 天气",
"─" * 36,
f"🌡 当前温度: {cur[t_key]}{units}",
f"🌤 天气状况: {cur['weatherDesc'][0]['value']}",
f"💧 空气湿度: {cur['humidity']}%",
f"💨 风速风向: {cur['windspeedKmph']} km/h ({cur['winddir16Point']})",
f"🧥 体感温度: {cur[f_key]}{units}",
f"👁 能见度: {cur['visibility']} km",
"─" * 36,
"📅 未来三天:",
]
lines.extend(get_forecast(data, units))
lines.append("─" * 36)
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(
description="命令行天气查询工具(数据来源 wttr.in)"
)
parser.add_argument(
"city", nargs="?", default="Beijing", help="城市英文名,默认 Beijing"
)
parser.add_argument("-f", "--fahrenheit", action="store_true", help="使用华氏度")
args = parser.parse_args()
units = "°F" if args.fahrenheit else "°C"
print(f"⏳ 正在查询 {args.city} 天气...", end="", flush=True)
data = fetch_weather(args.city)
print("\r" + " " * 30 + "\r", end="")
print(format_weather(data, args.city, units))
if __name__ == "__main__":
main()
使用方式:
# 查北京天气(默认) python weather.py # 查东京天气 python weather.py Tokyo # 查纽约天气,用华氏度 python weather.py "New York" -f
整个开发过程不到 3 分钟,代码正好 80 行,零依赖、开箱即用。这次体验让我对 AI 辅助编程有了新的认识:
效率提升明显。 从创建文件到跑通测试,全程没有手写一行代码。用自然语言描述需求 → AI 生成代码 → 运行验证,这个循环比传统开发快了 5 倍以上。
质量出乎意料。 异常处理、超时设置、编码规范这些细节,AI 自动补齐了,比自己手工写还严谨。尤其是 flush=True 这种小细节,换我自己大概率会忘。
关键是"说清楚"。 用 OpenCode 最重要的能力是准确描述需求。输入、输出、边界条件讲明白了,AI 给出的代码质量就高;含糊其辞时,就需要多轮迭代。
如果你还没试过 AI 编程助手,不妨花 3 分钟装个 OpenCode,从这个小工具开始体验。