调用Tequila API出现403 Forbidden错误,求排查解决方法
解决Tequila flights_multi API 403 Forbidden错误
可能的原因及修复步骤
1. 移除无效的Content-Encoding请求头
你的请求头中包含"Content-Encoding": "gzip",但实际发送的是未压缩的JSON数据。服务器会尝试解压请求体,失败后返回403。直接删除这个头:
self.header = { "Content-Type": "application/json", "apikey": FLIGHT_SEARCH_API_KEY }
2. 确认API密钥的权限范围
检查你的API密钥是否开通了flights_multi端点的访问权限。部分免费或基础密钥可能仅支持单城市搜索,需要登录Tequila后台确认权限配置。
3. 修正日期生成的时区问题
当前代码使用本地时间生成日期,可能和API服务器的UTC时区产生冲突,导致日期范围无效。改用UTC时间生成:
from datetime import datetime, timedelta import pytz # 需要先安装pytz:pip install pytz utc_now = datetime.now(pytz.utc) TOMORROW = (utc_now + timedelta(days=1)).strftime("%d/%m/%Y") SIX_MONTHS = (utc_now + timedelta(days=1) + monthdelta(6)).strftime("%d/%m/%Y")
4. 简化请求参数测试
一次发送9个请求项可能触发限流或参数校验失败。先简化为单个请求测试,确认基础请求正常:
request_list = [ { "fly_to": "PAR", "fly_from": FLY_FROM, "date_from": TOMORROW, "date_to": SIX_MONTHS, "adults": 1 } ]
5. 检查请求参数的完整性
根据Tequila多城市API文档,每个请求项需补充"type": "flight"必填参数,补充后重试:
request_params = { "fly_to": code, "fly_from": FLY_FROM, "date_from": TOMORROW, "date_to": SIX_MONTHS, "adults": 1, "type": "flight" # 添加该必填参数 }
修改后的完整测试代码
import requests from datetime import datetime, timedelta from monthdelta import monthdelta import os import pytz FLIGHT_SEARCH_ENDPOINT = "https://api.tequila.kiwi.com/v2/flights_multi" FLIGHT_SEARCH_API_KEY = os.environ.get("FLIGHT_SEARCH_API_KEY", "Please provide a FLIGHT_SEARCH_API_KEY.") FLY_FROM = "LON" # 使用UTC时间生成日期 utc_now = datetime.now(pytz.utc) TOMORROW = (utc_now + timedelta(days=1)).strftime("%d/%m/%Y") SIX_MONTHS = (utc_now + timedelta(days=1) + monthdelta(6)).strftime("%d/%m/%Y") class FlightSearch: def __init__(self): self.header = { "Content-Type": "application/json", "apikey": FLIGHT_SEARCH_API_KEY } # 先测试单个请求 request_list = [ { "fly_to": "PAR", "fly_from": FLY_FROM, "date_from": TOMORROW, "date_to": SIX_MONTHS, "adults": 1, "type": "flight" } ] self.params = {"requests": request_list} try: self.response = requests.post(url=FLIGHT_SEARCH_ENDPOINT, headers=self.header, json=self.params) self.response.raise_for_status() print(self.response.json()) except requests.exceptions.HTTPError as e: print(f"Error: {e}") print(f"Response content: {self.response.text}") flight_search = FlightSearch()
额外排查点
- 检查请求频率:短时间内多次调用API可能触发限流,导致403,可添加请求间隔。
- 重置API密钥:若密钥被滥用,可能被Tequila封禁,建议重置后重试。
内容的提问来源于stack exchange,提问作者sijobi2222
相关产品推荐
相关产品推荐

