如何用curl技巧将DepMap自定义数据多步下载合为单命令?
DepMap自定义数据下载流程自动化方案
DepMap数据库支持通过任务系统下载自定义数据(例如「Expression Public 23Q4」),原本需要手动执行四步curl操作:
- 执行第一条curl命令获取任务ID
- 使用任务ID轮询任务进度百分比
- 任务状态变为
SUCCESS时提取下载URL - 通过下载URL获取目标文件
原第一步的curl命令如下:
curl https://depmap.org/portal/api/download/custom -H 'content-type: application/json' \ --data-raw '{"datasetId":"expression","dropEmpty":true,"addCellLineMetadata":false}'
能否用curl单命令实现自动化?
纯curl本身做不到——curl只是HTTP请求工具,没有流程控制、逻辑判断和轮询的能力。但可以结合shell脚本与jq(JSON解析工具),把整个流程打包成一个可执行脚本,或者压缩成单行shell命令。
完整自动化脚本(推荐)
这个脚本包含错误处理和状态反馈,可读性强、易维护:
#!/bin/bash # 1. 发起自定义下载任务,获取任务ID TASK_RESPONSE=$(curl -s https://depmap.org/portal/api/download/custom \ -H 'content-type: application/json' \ --data-raw '{"datasetId":"expression","dropEmpty":true,"addCellLineMetadata":false}') TASK_ID=$(echo "$TASK_RESPONSE" | jq -r '.taskId') if [ -z "$TASK_ID" ]; then echo "获取任务ID失败,请检查请求参数或网络状态" exit 1 fi echo "已获取任务ID: $TASK_ID" # 2. 轮询任务状态,直到完成或失败 while true; do STATUS_RESPONSE=$(curl -s "https://depmap.org/portal/api/download/custom/status/$TASK_ID") STATUS=$(echo "$STATUS_RESPONSE" | jq -r '.status') PROGRESS=$(echo "$STATUS_RESPONSE" | jq -r '.progress') echo "当前进度: ${PROGRESS}% | 任务状态: ${STATUS}" # 判断任务状态 if [ "$STATUS" = "SUCCESS" ]; then DOWNLOAD_URL=$(echo "$STATUS_RESPONSE" | jq -r '.downloadUrl') break elif [ "$STATUS" = "FAILED" ]; then echo "任务执行失败,请稍后重试" exit 1 fi # 每5秒轮询一次,可根据需求调整间隔 sleep 5 done # 3. 下载目标文件 echo "任务完成,开始下载文件..." curl -O "$DOWNLOAD_URL" echo "文件下载完成,保存为当前目录下的同名文件"
单行命令版本(仅演示,可读性差)
如果一定要写成单条命令,可以把脚本压缩成一行(需确保已安装jq):
TASK_ID=$(curl -s https://depmap.org/portal/api/download/custom -H 'content-type: application/json' --data-raw '{"datasetId":"expression","dropEmpty":true,"addCellLineMetadata":false}' | jq -r '.taskId'); while true; do RESP=$(curl -s "https://depmap.org/portal/api/download/custom/status/$TASK_ID"); STATUS=$(echo "$RESP" | jq -r '.status'); PROGRESS=$(echo "$RESP" | jq -r '.progress'); echo "进度: ${PROGRESS}% | 状态: ${STATUS}"; if [ "$STATUS" = "SUCCESS" ]; then URL=$(echo "$RESP" | jq -r '.downloadUrl'); curl -O "$URL"; break; elif [ "$STATUS" = "FAILED" ]; then echo "任务失败"; exit 1; fi; sleep 5; done
注意事项
- 需要提前安装
jq工具:Debian/Ubuntu用apt install jq,macOS用brew install jq - 轮询间隔可根据任务耗时调整,避免过于频繁请求给服务器造成压力
内容的提问来源于stack exchange,提问作者Intrastellar Explorer
相关产品推荐
相关产品推荐

