curl无法稳定下载响应文件的问题排查求助
curl无法稳定下载响应文件的问题排查求助
各位大佬好,我最近被一个curl脚本的问题搞疯了——这个脚本本来是用来批量下载一些原始txt数据的,需要先过登录、OTP验证这些前置步骤,之前偶尔试几次还能成功,现在完全没法正常下载了,我翻遍了能找到的解决方案都没搞定,想请大家帮忙看看。
先说说核心问题:脚本的流程是先获取csrf cookie、完成登录、验证OTP,然后读取data.txt里的ID构造请求URL,下载响应到modules.json,再用这个文件里的内容生成最终的下载链接去拿目标数据。但现在卡在下载modules.json这一步,就是下面这行curl命令,完全没法稳定拿到响应文件:
$CURL_BIN "-o$M_JSON"\ -H "$TOKEN_VALUE" \ -X GET $GET_M_URL
我已经确认了几个关键信息:
- 代码完全没改过,之前偶尔能跑通,现在彻底不行了
- 构造出来的
GET_M_URL在浏览器里能正常打开,返回正确的内容 - 登录和OTP步骤看起来都执行了,cookie文件
cookies.txt里也有csrftoken和sessionid
下面是我的完整脚本,麻烦大家帮忙看看哪里可能有问题:
登录与OTP验证部分
#!/bin/bash LOGIN_URL=urlhere.com/account/login COOKIE_URL=urlhere.com/account/csrf_cookie OTP_URL=urlhere.com/account/totp/login/$1/ YOUR_USER="user" YOUR_PASS="pass" COOKIES=cookies.txt M_JSON=modules.json CURL_BIN="curl -s -c $COOKIES -b $COOKIES -e $LOGIN_URL -J -L" CURL_DOWNLOAD_BIN="curl -s -c $COOKIES -b $COOKIES -e $LOGIN_URL -O -J -L" destdir=/script/test.txt # 存储csrftoken到cookies.txt curl -s -c $COOKIES $COOKIE_URL > /dev/null TOKEN_VALUE="csrfmiddlewaretoken=$(grep csrftoken $COOKIES | sed 's/^.*csrftoken[[:blank:]]*//')" # 登录,更新csrftoken和sessionid curl -b $COOKIES -c $COOKIES -d "$TOKEN_VALUE&email=$YOUR_USER&password=$YOUR_PASS" $LOGIN_URL # 更新token变量为新的csrftoken TOKEN_VALUE="csrfmiddlewaretoken=$(grep csrftoken $COOKIES | sed 's/^.*csrftoken[[:blank:]]*//')" # 发送OTP验证请求 $CURL_BIN \ -d "$TOKEN_VALUE" \ -X POST $OTP_URL
批量下载部分
file='data.txt' while read line; do # 读取每行数据拆分ID read -a strarr <<< "$line" P_ID=${strarr[0]} E_ID=${strarr[1]} GET_M_URL="urlhere.com/pd/$P_ID/ev/$E_ID/details/?summary_status=true" cat <<< "$GET_M_URL" > "$destdir" # 就是这行无法稳定下载到M_JSON $CURL_BIN "-o$M_JSON"\ -H "$TOKEN_VALUE" \ -X GET $GET_M_URL sleep 5 ./job.sh eval_file='eval_mods.txt' while read line; do read -a strarr <<< "$line" GET_RAW_FILE=urlhere.com/ev/$E_ID/evm/$strarr/raw_files/ $CURL_DOWNLOAD_BIN \ -H "$TOKEN_VALUE" \ -X GET $GET_RAW_FILE done < $eval_file done < $file
我自己也怀疑过几个方向,但都没解决:
- 是不是csrf token的传递方式错了?我直接把
csrfmiddlewaretoken=xxx作为请求头,但会不会应该放在X-CSRFToken头里? - cookie在后续请求里有没有正确带上?
$CURL_BIN里已经加了-c -b,但会不会有什么细节没注意到? - 是不是服务器有反爬机制?脚本里的curl没设置User-Agent,浏览器里有,会不会被拦截了?
- 是不是sleep时间不够?我加了5秒,但会不会需要更长?
真的快愁死了,有没有大佬能指点一下?非常感谢!
备注:内容来源于stack exchange,提问作者Dingo




