You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:03:21