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

Amadeus航班报价API无法设置日期范围的技术求助

问题解答

1. 解决日期范围参数报错问题

你之前误用了参数名称,Flight Offers Search API v2的日期范围参数是departureDateRange,而非dateTimeRange或dateWindow。该参数支持两种格式:

  • 相对窗口格式:[基准日期]/[时长],例如2024-07-04/I3D表示基准日期前后各1天(共3天)的出发窗口
  • 固定范围格式:[起始日期],[结束日期],例如2024-07-01,2024-07-04

注意:不能同时传入departureDate和departureDateRange参数,二选一即可。

修改后的参数示例:

parameters = {
    "originLocationCode": self.iata_departure_code,
    "destinationLocationCode": "DUB",
    "departureDateRange": "2024-07-04/I3D",  # 替换原departureDate参数
    "adults": 1,
    "currencyCode": "USD",
    "maxPrice": 2000,
    "max": 20,
}

2. 6个月日期窗口查询的最优方案

由于Flight Offers Search API单次请求支持的日期范围有限(官方建议单次不超过30天,避免响应过大或超时),最优方案是分批次循环调用API,同时做以下优化:

优化1:缓存认证Token

你的代码目前每次查询都会重新获取Token,浪费请求资源且降低效率。建议初始化时获取Token并添加过期检查:

import time
import requests

class FlightSearch:
    def __init__(self):
        self.iata_departure_code = "SAC"
        self.bearer_token = self.authenticate()
        self.token_expiry = None  # 记录Token过期时间

    def authenticate(self):
        auth_token_endpoint = "https://test.api.amadeus.com/v1/security/oauth2/token"
        api_key = "xxxxxx"
        api_secret = "xxxxxxx"
        header = {"Content-Type": "application/x-www-form-urlencoded"}
        parameters = {
            "grant_type": "client_credentials",
            "client_id": api_key,
            "client_secret": api_secret,
        }
        response = requests.post(url=auth_token_endpoint, headers=header, data=parameters)
        data = response.json()
        self.token_expiry = time.time() + data["expires_in"]  # 计算过期时间
        return data["access_token"]

    def is_token_valid(self):
        # 提前60秒重新获取Token,避免过期
        return time.time() < self.token_expiry - 60

    def search_flights(self, departure_range):
        # 检查Token有效性,过期则重新获取
        if not self.is_token_valid():
            self.bearer_token = self.authenticate()
        flight_offers_endpoint = "https://test.api.amadeus.com/v2/shopping/flight-offers"
        header = {"Authorization": f"Bearer {self.bearer_token}"}
        parameters = {
            "originLocationCode": self.iata_departure_code,
            "destinationLocationCode": "DUB",
            "departureDateRange": departure_range,
            "adults": 1,
            "currencyCode": "USD",
            "maxPrice": 2000,
            "max": 20,
        }
        flight_response = requests.get(url=flight_offers_endpoint, params=parameters, headers=header)
        return flight_response.json()

优化2:分批次生成日期范围

使用datetime模块生成6个月内的多个日期批次,比如每次查询30天,分6次完成:

import datetime

def generate_date_ranges(start_date_str, months=6, days_per_batch=30):
    start_date = datetime.datetime.strptime(start_date_str, "%Y-%m-%d")
    end_date = start_date + datetime.timedelta(days=months*30)
    current_start = start_date
    date_ranges = []
    while current_start < end_date:
        current_end = current_start + datetime.timedelta(days=days_per_batch-1)
        if current_end > end_date:
            current_end = end_date
        # 生成固定范围格式的参数值
        date_ranges.append(f"{current_start.strftime('%Y-%m-%d')},{current_end.strftime('%Y-%m-%d')}")
        current_start = current_end + datetime.timedelta(days=1)
    return date_ranges

# 使用示例
flight_search = FlightSearch()
# 生成从2024-07-01开始6个月的日期批次
all_ranges = generate_date_ranges("2024-07-01", months=6)
all_flight_data = []
for date_range in all_ranges:
    batch_data = flight_search.search_flights(date_range)
    all_flight_data.extend(batch_data.get("data", []))

额外注意事项

  • 遵守API速率限制:测试环境有请求次数限制,避免短时间内大量调用导致限流
  • 处理分页:如果单次请求结果超过max设置的数量,需通过响应中的next链接获取后续页数据
  • 错误捕获:添加异常处理逻辑,处理429限流、500服务器错误等异常响应

内容的提问来源于stack exchange,提问作者Taylor Python

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 16:11:04