You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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里也有csrftokensessionid

下面是我的完整脚本,麻烦大家帮忙看看哪里可能有问题:


登录与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

火山引擎 最新活动