如何将Kibana下载CSV的curl命令转为Python requests并解决400报错
问题解决方法
错误原因
报错核心是Kibana未正确识别请求中的jobParams查询参数,你之前将带参数的完整路径直接写入API_PATH拼接请求时,路径中的特殊字符、转义符未被正确处理,导致参数解析失败。
修正方案
不要将查询参数直接拼接在URL路径中,使用requests原生的params参数传递查询参数,requests会自动处理编码逻辑。
完整修正代码
import requests from requests.auth import HTTPBasicAuth import json import urllib3 # 关闭自签SSL证书告警 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 基础配置 USER = 'user' PASSWORD = 'password' HOST = 'https://elk.cloud.dive.tech' API_PATH = '/api/reporting/generate/csv_searchsource' PORT = 5601 # 填写你实际的jobParams原始JSON结构,不需要转义、不需要提前编码 job_params = { # 替换为你自己的任务参数,比如搜索条件、时间范围、索引模式等 } headers = {"kbn-xsrf": "reporting"} # 第一步:提交导出任务 resp = requests.post( url=f"{HOST}:{PORT}{API_PATH}", headers=headers, # 自动将jobParams转为JSON字符串并作为查询参数传递 params={"jobParams": json.dumps(job_params)}, verify=False, auth=HTTPBasicAuth(USER, PASSWORD) ) # 第二步:Kibana导出为异步任务,需要轮询获取结果 if resp.status_code == 200: task_info = resp.json() download_path = task_info['path'] # 轮询下载地址,直到任务完成 while True: csv_resp = requests.get( url=f"{HOST}:{PORT}{download_path}", headers=headers, verify=False, auth=HTTPBasicAuth(USER, PASSWORD) ) if csv_resp.status_code == 200: # 拿到CSV内容,可写入本地文件 csv_content = csv_resp.content with open('export.csv', 'wb') as f: f.write(csv_content) break
特殊情况处理
如果你已经有curl命令中编码完成的jobParams字符串,不需要做JSON转换,直接传递即可:
# 直接填入curl命令中jobParams=后面的完整值,去掉转义符\ encoded_job_params = "你原来curl里的jobParams完整值" resp = requests.post( url=f"{HOST}:{PORT}{API_PATH}", headers=headers, params={"jobParams": encoded_job_params}, verify=False, auth=HTTPBasicAuth(USER, PASSWORD) )
内容的提问来源于stack exchange,提问作者Tlaloc-ES
相关产品推荐
相关产品推荐

