前言 票务类详情接口和电商商品接口存在明显差异,演出数据存在多场次、多票价档位、状态动态变更的特点。普通直连方案容易出现场次字段错位、售罄状态更新延迟、重复请求消耗接口配额等问题。本文基于官方开放接口,设计一套带本地缓存、字段清洗、状态校验的封装方案,适合业务侧做演出信息同步、价格监控场景,避开网上单纯请求 Demo 的写法,聚焦生产环境数据稳定性。 前置准备 对接前需要在开放平台申请应用凭证,获取 appkey 与 secret。核心入参为演出项目 ID,接口返回数据包含演出名称、场馆、演出时间、票价区间、票档库存、观演须知等多层嵌套 JSON 结构,很多字段存在可选为空的情况,必须做兼容处理。 完整代码示例 python 核心逻辑解析 代码核心亮点是缓存机制 + 数据归一化。每次请求优先读取内存缓存,短时间重复查询不会频繁调用远程接口,降低接口调用额度消耗。 线上对接踩坑总结 演出状态实时变动,缓存时间不能设置过长,库存监控场景建议缩短至 5~10 分钟;基础信息同步可延长缓存。 部分演出存在多时段、多票种,不能只取第一条价格,需要遍历全部票档。 接口返回字段会随演出类型变化,脱口秀、演唱会、话剧返回字段存在差异,代码要做好空值兜底,防止程序异常。 请求频率需要限流,短时间批量查询容易触发平台风控,建议单应用 QPS 控制在 5 以内。
import requests
import time
import json
class DamaiDetailApi:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.cache = {} # 简易内存缓存
self.cache_expire = 1800 # 缓存有效期30分钟
self.base_url = "https://open.alitrip.com/api"
def get_detail(self, item_id):
# 读取缓存,减少重复调用
now_ts = int(time.time())
if item_id in self.cache:
cache_data = self.cache[item_id]
if now_ts - cache_data["ts"] < self.cache_expire:
return cache_data["data"]
params = {
"appkey": self.app_key,
"itemId": item_id
}
headers = {"Content-Type":"application/json;charset=utf-8"}
resp = requests.get(self.base_url, params=params, headers=headers,timeout=10)
if resp.status_code != 200:
return {"code":resp.status_code,"msg":"请求失败","data":None}
raw = resp.json()
# 字段归一化清洗
result = self.data_normalize(raw)
# 写入缓存
self.cache[item_id] = {"ts":now_ts,"data":result}
return result
def data_normalize(self,raw_data):
"""多层嵌套字段清洗,统一输出结构"""
if raw_data.get("code") !=0:
return raw_data
detail = raw_data.get("data",{})
output = {
"item_id":detail.get("itemId"),
"show_name":detail.get("showName",""),
"venue":detail.get("venueName",""),
"show_time_list":[],
"price_list":[],
"sale_status":detail.get("saleStatus"),
"notice":detail.get("notice","")
}
# 场次解析
for show in detail.get("showTimeList",[]):
output["show_time_list"].append({
"time":show.get("showTime"),
"status":show.get("status")
})
# 票价档位解析
for price_info in detail.get("priceList",[]):
output["price_list"].append({
"price":price_info.get("price"),
"stock_status":price_info.get("stockStatus")
})
return output
if __name__ == "__main__":
api = DamaiDetailApi(app_key="your_key",app_secret="your_secret")
res = api.get_detail(item_id="1074839455822")
print(json.dumps(res,ensure_ascii=False,indent=2))data_normalize函数对多层嵌套返回值做扁平化处理,统一输出字段,自动处理空值,避免业务代码到处写多层get判断。同时提取场次、票价、售卖状态,方便后续业务做价格监控与状态判断。