和风天气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']}}
- ✨注意:请不要同时使用多种身份认证方式,可能会导致身份认证失败



123

被折叠的 条评论
为什么被折叠?



