和风天气JWT格式获取数据说明

该文章已生成可运行项目,

和风天气JWT格式获取数据说明


  • 🌿和风天气JWT格式介绍:https://dev.qweather.com/docs/configuration/authentication/#json-web-token
  • ✨👉注意:这里提供的不是最终的方案,只是提供获取的思路。

目前还是可以通过APIKEY方式,获取天气数据,这里仅介绍通过和风天气JWT格式,获取数据实现的方法。

  • ⚡注意:为了提高安全性,SDK 5+将不再支持API KEY。从2027年1月1日起,我们将限制使用API KEY进行身份认证的每日请求数量。

📗针对原使用APIKEY获取基础上进行修改

  • 🌿生成Ed25519密钥
    使用OpenSSL创建Ed25519密钥的方法。
  • 提示:官方建议使用OpenSSL 3.0.1及以上版本创建Ed25519和验证签名。在大多数Linux和macOS的最新版本中已经集成OpenSSl 3.0+,对于Windows,我们推荐使用winget安装OpenSSL。
    提示:你也可以通过在线工具、熟悉的开发语言或第三方库生成Ed25519私钥和公钥。
  • 打开命令提示符终端(CMD),粘贴下列文本生成公钥和私钥:
openssl genpkey -algorithm ED25519 -out ed25519-private.pem && openssl pkey -pubout -in ed25519-private.pem > ed25519-public.pem
  • 在本地,当前文件夹下所生成的密钥:
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • 🌿上传公钥
    当你完成密钥对的生成后,你需要将其中的公钥添加到和风天气控制台,用于JWT身份验证。
    可以参考和风说明文档操作:https://dev.qweather.com/docs/configuration/project-and-key/
  • 在项目列表中点击你需要添加凭据的项目:
    在这里插入图片描述
  • 生成JWT

一个完整的JWT包括三个部分:Header,Payload和Signature.

Header
Header包括下列参数并保存为JSON对象格式:

alg 签名算法,请设置为EdDSA
kid 凭据ID(一定要是标注为jwt字样的凭据凭据ID才行,不能使用API KEY的凭据ID),你可以在控制台-项目管理中查看:(APIKEY 凭据ID不能和JWT凭据ID混用)
在这里插入图片描述

{
    "alg": "EdDSA",
    "kid": "T8GYP76CD2"//JWT凭据ID
}

Payload
Payload包括下列参数并保存为JSON对象格式:

  • sub 签发主体,这个值是凭据的项目ID项目ID在控制台-项目管理中查看
    在这里插入图片描述

  • iat 签发时间,这个值表示JWT签发生效的时间,UNIX时间戳格式。为了防止时间误差,建议你将iat设置为当前时间之前的30秒,并确保你的服务器或设备的时间和日期是正确的。

  • exp 过期时间,这个值表示JWT在何时过期,UNIX时间戳格式。较长的过期时间可以减轻负载,但是较短的时间可以提高安全性。你应该根据使用场景设置过期时间,例如在服务端,可能适合较长的时间,在前端则适合较短的时间。目前允许的有效期最长为24小时(86400秒)。

{
    "sub": "29KVA6G27T",//项目ID
    "iat": 1703912400,
    "exp": 1703912940
}
  • Signature
    将Header和Payload分别进行Base64URL编码并用英文句号拼接在一起,使用你的私钥(ed25519-private.pem中的密钥字符串)对其进行Ed25519算法的签名,之后对签名结果,同样需要进行Base64URL编码

注意:必须使用Base64URL编码,而不是Base64,两者有些许差别。

拼接在一起,最后,请将Base64URL编码后的Header、Payload和Signature使用英文句号(.)拼接在一起,组合为最终的Token,即 header.payload.signature,最终看起来像是:

eyJhbGciOiAiRWREU0EiLCJraWQiOiAiQUJDRDEyMzQifQ.eyJpc3MiOiJBQkNEMTIzNCIsImlhdCI6MTcwMzkxMjQwMCwiZXhwIjoxNzAzOTEyOTQwfQ.MEQCIFGLmpmAEwuhB74mR04JWg_odEau6KYHYLRXs8Bp_miIAiBMU5O13vnv9ieEBSK71v4UULMI4K5T9El6bCxBkW4BdA
  • 🔬验证拼接的JWT正确性
  • 🔖在和风个人账户控制台-帮助与支持-JWT验证:

将Header,Payload和Signature三部分拼接成的完整的JWT完整的Token输入验证框中,点击验证。

在这里插入图片描述

  • JWTl解码和编码在线验证: https://jwt.io/
    在这里插入图片描述
  • 其他JWT编码和解码:https://www.json.cn/jwt
  • 🌿发送JWT请求
    将上述创建的完整Token作为参数添加到Authorization: Bearer请求标头,例如:
curl --compressed \
-H 'Authorization: Bearer eyJhbGciOiAiRWREU0EiLCJraWQiOiAiQUJDRDEyMzQifQ.eyJpc3MiOiJBQkNEMTIzNCIsImlhdCI6MTcwMzkxMjQwMCwiZXhwIjoxNzAzOTEyOTQwfQ.MEQCIFGLmpmAEwuhB74mR04JWg_odEau6KYHYLRXs8Bp_miIAiBMU5O13vnv9ieEBSK71v4UULMI4K5T9El6bCxBkW4BdA' \
'https://abcxyz.qweatherapi.com/v7/weather/now?location=101010100'
  • 🔧API 配置
  • 参考官方文档:https://dev.qweather.com/docs/configuration/api-config/

请求URL
通常来讲,一个完整的API请求URL由scheme,host,path,path parameters和query parameters组成:

  • scheme: 仅支持HTTPS协议。
    host: 开发者的API Host,请在控制台-设置中查看。
    在这里插入图片描述

path: API的请求路径(或称之为API端点、Endpoint)。
path params: 路径参数均为必选参数。
query params: 查询参数,包括必选和可选参数,多个查询参数使用&分割。

https://abcxyz.qweatherapi.com/airquality/v1/station/{LocationID}?lang=en
\___/   \____________________/\____________________/\___________/\______/
scheme           host                  path              path      query
                                                        params     params 

Python验证程序

import requests
import jwt
import time
#填ed25519-private.pem里的内容
private_key='''-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIMt6oO4GC+QnzZFEp/Q245fpquD+j5wKApSJaY2MHFuJ
-----END PRIVATE KEY-----'''

headers = {
    "kid": "T8GYP76CD2", #凭据id
     "typ": None  # 显式设置为None来移除typ字段
}
payload={
    "sub": "29KVA6G27T",    #项目id
    'iat': int(time.time()) - 30,
    'exp': int(time.time()) + 86000
}
# pip install cryptography
# encoded_jwt = jwt.encode(payload, private_key, algorithm='EdDSA', headers = headers)
# 直接使用算法名称生成 JWT 令牌
encoded_jwt = jwt.encode(payload, key=private_key, algorithm='EdDSA', headers=headers)

print(f"JWT:  {encoded_jwt}")


#api host headers
api_host = 'https://p578kpmqqn.re.qweatherapi.com'#填写自己的apihost
headers = {'Authorization': f'Bearer {encoded_jwt}'}
city_api = '/geo/v2/city/lookup'  #城市代码查询api
now_api = '/v7/weather/now'#实时天气api

#城市代码查询
# city='北京'#填写城市名查询天气
# params = {'location': city}
# url = f'{api_host}{city_api}'
# response = requests.get(url,headers=headers,params=params)
# city_id = response.json()['location'][0]['id']  # 获取城市代码
# city_name = response.json()['location'][0]['name']  # 获取城市名称
# country = response.json()['location'][0]['country']  # 获取国家名
#实时天气数据获取
city_id='101250301'#填写城市代码查询天气
url= f'{api_host}{now_api}'
headers = {'Authorization': f'Bearer {encoded_jwt}'}
params = {
    'location': city_id,  #城市代码(必须)
    'lang': 'zh',#语言
    'unit': 'm'#数据单位设置,可选值包括unit=m(公制单位,默认)和unit=i(英制单位)
}
response = requests.get(url,headers=headers,params=params)
print(response)
print(response.text)
# now_weather_data = response.json()
print("完整API响应数据:")
print(response.json())  # 直接打印完整的JSON响应
# 打印当前天气数据
# print(f'城市: {country} {city_name}')  # 打印城市名
# print(now_weather_data['now']['text'])  # 打印当前天气状况
# print(f'温度: {now_weather_data["now"]["temp"]}°C')  # 打印当前温度
# print(f'体感温度: {now_weather_data["now"]["feelsLike"]}°C')  # 打印当前体感温度
# print(f'湿度: {now_weather_data["now"]["humidity"]}%')  # 打印当前湿度
# print(f'风向: {now_weather_data["now"]["windDir"]}')  # 打印当前风向
# print(f'风力等级: {now_weather_data["now"]["windScale"]}')  # 打印当前风力等级
# print(f'风速: {now_weather_data["now"]["windSpeed"]} km/h')  # 打印当前风速
# print(f'数据更新时间: {now_weather_data["updateTime"]}')  # 打印数据更新时间

'''
报错NotImplementedError: Algorithm 'EdDSA' could not be found. Do you have cryptography installed?
解决pip install --upgrade cryptography
pip uninstall PyJWT
推荐安装版本:pip install PyJWT[crypto]==2.6.0
'''

  • 运行结果:
 python .\HAPI.py
JWT:  eyJhbGciOiJFZERTQSIsImtpZCI6IlQ4R1lQNzZDRDIifQ.eyJzdWIiOiIyOUtWQTZHMjdUIiwiaWF0IjoxNzUyNzQ0MTkzLCJleHAiOjE3NTI4MzAyMjN9.MHYpyWLN9PN7YnCxCUij1OxpcBL4AqqFwLheGt-X-YZuySUM87Ubz7lqCtJU_xiuUtBzaOkZYjqD1VzayFfRAg
<Response [200]>
{"code":"200","updateTime":"2025-07-17T17:18+08:00","fxLink":"https://www.qweather.com/weather/beijing-101010100.html","now":{"obsTime":"2025-07-17T17:16+08:00","temp":"35","feelsLike":"35","icon":"100","text":"晴","wind360":"0","windDir":"{'code': '200', 'updateTime': '2025-07-17T16:52+08:00', 'fxLink': 'https://www.qweather.com/weather/beijing-101010100.html', 'now': {'obsTime': '2025-07-17T16:48+08:00', 'temp': '35', 'feelsLike': '36', 'icon': '100', 'text': '晴', 'wind360': '45', 'windDir': '东北风', 'windScale': '2', 'windSpeed': '6', 'humidity': '29', 'precip': '0.0', 'pressure': '998', 
'vis': '30', 'cloud': '7', 'dew': '17'}, 'refer': {'sources': ['QWeather'], 'license': ['QWeather Developers License']}}
  • ✨注意:请不要同时使用多种身份认证方式,可能会导致身份认证失败
本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值