Python实现——天气小挂件

目录

效果展示

使用到的Python库讲解

代码实现思路

整体代码

如何获取如风天气的API

一、注册与创建应用

二、API调用规范

三、注意事项

四、扩展功能


效果展示

请输入城市名(支持中文):哈尔滨

 _   _       _     _       
| | | | ___ | |__ (_)_ __  
| |_| |/ _ \| '_ \| | '_ \ 
|  _  | (_) | |_) | | | | |
|_| |_|\___/|_.__/|_|_| |_|


🌤 当前天气信息
╭──────────────╮
│ 城市 │ 天气 │ 温度(°C) │ 湿度(%) │
├──────┼──────┼──────────┼──────────┤
│ 哈尔滨 │ 晴   │ 25         │ 46         │
╰──────────────╯

🕒 当前时间: 2025-05-28 14:53:22

💬 今日名言:
"Success is not final, failure is not fatal: it is the courage to continue that counts."
— Winston Churchill


使用到的Python库讲解

        requests 这个库是 Python 里处理网络请求的大哥,基本上你想和网页或者 API 打交道都绕不开它。它用起来就像跟朋友聊天一样自然,比如发个 GET 请求直接 requests.get(url) 就完事了,POST 请求也不用自己处理表单编码,自动帮你搞定。自带连接池管理和 SSL 验证这些高级功能,还能处理国际域名和 Cookie 持久化,最近还加上了 SOCKS 代理支持,搞爬虫或者调接口特别顺手。

        datetime 是 Python 自带的日期时间管家,代码里要记录时间戳、计算时间差都得靠它。比如用 datetime.now() 抓取当前时间,strftime 把时间转成指定格式的字符串,timedelta 处理倒计时或有效期计算特别方便。你代码里可能用来记录请求发起时间,或者给日志加时间戳。

        pyfiglet 这库纯粹是给终端加颜值的,一行代码就能把普通文字变成炫酷的 ASCII 艺术字。比如程序启动时用 figlet_format("Welcome") 生成个带特效的标题,支持几十种字体样式,从复古打字机风到星战字幕效果都能玩。要是再配合 colorama 这类颜色库,整个命令行界面瞬间高大上。

        rich 库相当于给终端装了美图秀秀,它那个 Table 类做数据展示简直绝了。你代码里建的表格自带边框样式和颜色分级,box.ROUNDED 这种参数能让表格边角变圆润,数据对齐、列宽自适应都不用操心。Console 对象还能统一管理输出风格,要突然切到文件日志或调整颜色方案都很方便,比普通 print 强十八条街。


代码实现思路

       我们实现了一个带可视化界面的天气查询工具,整体思路可以分几个部分来看:

        首先是天气数据抓取模块,核心用了和风天气的API。程序先通过城市名称查询对应的地理编码(比如北京对应101010100),再拿着这个编码去获取实时天气数据。这里用了两个API接口,先查城市ID再查天气,比直接传城市名更稳定可靠。异常处理部分用try-except包裹,遇到网络问题或无效城市时会返回友好提示。

        然后是时间显示功能,直接调用了datetime模块获取当前时间。虽然代码里没处理时区转换,但本地时间对普通用户来说更直观。这里有个小细节,返回的时间格式用strftime做了标准化处理,保证显示效果统一。

        名言模块通过quotable.io的随机名言接口实现。这个设计挺巧妙,每次查询天气都会附带一句名人名言,增加了程序的趣味性。异常捕获确保即使接口不可用也不会导致程序崩溃。

        界面美化部分用了pyfiglet和rich库的组合拳。城市名称用艺术字体渲染,配合圆角表格和彩色文字,把普通的命令行输出变成了精致的可视化面板。特别是用Table类制作的天气信息表,通过列对齐和颜色标记让数据呈现更专业。

        主程序把这三个模块串起来,形成完整交互流程。用户输入城市后,程序像流水线一样依次获取数据、处理异常、组装展示内容。控制台输出的颜色标记(比如红色错误提示、黄色斜体名言)让信息层次更分明,比普通打印语句体验好很多。

        整体来看,这个程序把多个第三方API和库的优势结合起来,既保证核心功能的稳定性,又在用户体验上花了不少心思。如果要说改进空间,可以加入未来三天预报功能(像部分天气API支持的那样),或者把查询记录保存到本地文件方便回顾。


整体代码

import requests
from datetime import datetime
from pyfiglet import figlet_format
from rich.console import Console
from rich.table import Table
from rich import box

# 和风天气 API Key(替换成你的)
API_KEY = "替换成你的API Key"

console = Console()

# 获取天气数据
def get_weather(city):
    try:
        # 1. 城市名称转为城市 ID(支持中文)
        loc_url = f"https://geoapi.qweather.com/v2/city/lookup?location={city}&key={API_KEY}"
        res = requests.get(loc_url)
        print("城市查询返回状态码:", res.status_code)
        print("城市查询返回内容:", res.text)
        loc_data = res.json()

        if not loc_data.get("location"):
            return None, "城市未找到", "N/A", "N/A"

        location_id = loc_data["location"][0]["id"]
        city_name = loc_data["location"][0]["name"]

        # 2. 获取当前天气信息
        weather_url = f"https://devapi.qweather.com/v7/weather/now?location={location_id}&key={API_KEY}"
        weather_data = requests.get(weather_url).json()
        now = weather_data["now"]

        return city_name, now["text"], now["temp"], now["humidity"]
    except Exception as e:
        return None, "获取失败", "N/A", "N/A"

# 获取当前时间(当地时间不处理时区偏移)
def get_current_time():
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# 获取名言(英语)
def get_quote():
    try:
        res = requests.get("https://api.quotable.io/random")
        data = res.json()
        return f'"{data["content"]}"\n— {data["author"]}'
    except:
        return "无法获取名言"

# 主程序
def main():
    city = input("请输入城市名(支持中文):").strip()
    if not city:
        print("请输入有效的城市名。")
        return

    city_name, weather, temp, humidity = get_weather(city)
    if city_name is None:
        console.print("[bold red]❌ 获取天气失败,请检查网络或城市拼写。[/bold red]")
        return

    time_str = get_current_time()
    quote = get_quote()

    # 美化输出
    title = figlet_format(city_name, font="slant")
    console.print(f"[bold cyan]{title}[/bold cyan]")

    table = Table(title="🌤 当前天气信息", box=box.ROUNDED, style="bold magenta")
    table.add_column("城市", justify="center")
    table.add_column("天气", justify="center")
    table.add_column("温度(°C)", justify="center")
    table.add_column("湿度(%)", justify="center")

    table.add_row(city_name, weather, temp, humidity)
    console.print(table)

    console.print(f"🕒 当前时间: [bold green]{time_str}[/bold green]")
    console.print(f"\n💬 今日名言:\n[italic yellow]{quote}[/italic yellow]")

if __name__ == "__main__":
    main()

如何获取如风天气的API

一、注册与创建应用
  1. ​访问官网并注册​
    打开和风天气开发者平台(https://dev.qweather.com/),点击“注册”按钮,填写邮箱或手机号完成验证。

  2. ​登录并创建应用​
    登录后进入控制台,选择「应用管理」→「创建应用」,填写应用名称(如“天气小程序”),选择「Web API」类型,勾选需要的服务(如实时天气、预报等)。

  3. ​生成API Key​
    提交后系统会自动生成一个32位的API Key(如a4ae83df500b4cc4bd53c7a1214bbbcd),可在应用列表中查看。


二、API调用规范
  1. ​请求域名区分​

    • ​开发测试​​:使用 devapi.qweather.com,适合本地调试(免费版)。
    • ​正式环境​​:使用 api.qweather.com,需付费订阅后使用。
  2. ​参数与请求示例​
    以获取北京实时天气为例,构造请求URL:

    import requests
    key = "你的API_Key"
    location = "101010100"  # 北京的城市ID,也支持经纬度或中文名称
    url = f"https://api.qweather.com/v7/weather/now?key={key}&location={location}"
    response = requests.get(url)
    data = response.json()  # 解析JSON数据

    返回数据包含温度、湿度、天气状况等字段。

  3. ​数据压缩与处理​
    和风天气返回的数据可能采用Gzip压缩(如ESP32开发场景),需用解压库处理。普通开发环境下Python的requests库会自动处理。


三、注意事项
  1. ​调用限制​
    免费版每日限制1000次请求,超限需升级付费套餐。

  2. ​安全规范​

    • 避免在客户端代码中直接暴露Key,建议通过服务端中转请求。
    • 所有请求需使用HTTPS协议,否则会被拦截。
  3. ​常见错误码​

    • 401:API Key无效或权限未开通。
    • 400:参数错误(如location格式错误)。

四、扩展功能
  • ​天气预报​​:替换接口为/v7/weather/3d获取3天预报。
  • ​历史数据​​:付费用户可调用历史天气接口,需单独申请权限。
  • ​城市ID查询​​:通过/v2/city/lookup接口将中文地名转为城市ID。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WenJGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值