我用curl
发送发帖请求,并用while
循环
这是我的代码:
send() {
count=1
while read id; do
printf "\e[1;77m[\e[0m\e[1;92m+\e[0m\e[1;77m] Sending message:\e[0m\e[1;93m %s\e[0m\e[1;77m/\e[0m\e[1;93m%s ... \e[0m" $count $counter
IFS=$'\n'
comment=$(curl -i -s -k -X $'POST' -H $'Host: localhost' -H $'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0' -H $'Accept: */*' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'Content-Type: application/x-www-form-urlencoded' -H $'X-Requested-With: XMLHttpRequest' -H $'Connection: close' --data-binary $'comment_text='$message'&replied_to_comment_id=' $'https://localhost/comments/'$media_id'/add/' -w "\n%{http_code}\n" | grep -a "HTTP/2 200"); if [[ "$comment" == *'HTTP/2 200'* ]]; then printf "\e[1;92mOK!\e[0m\n"; else printf "\e[1;93mFAIL!\e[0m \e[1;77mSleeping 120 secs...\e[0m\n"; sleep 60; fi;
sleep 1
let count++
done < id
}
输出为:
[+] Sending message: 1/10 ... OK!
[+] Sending message: 2/10 ... OK!
[+] Sending message: 3/10 ... OK!
[+] Sending message: 4/10 ... OK!
[+] Sending message: 5/10 ... OK!
[+] Sending message: 6/10 ... FAIL! Sleeping 120 secs...
[+] Sending message: 7/10 ... FAIL! Sleeping 120 secs...
[+] Sending message: 8/10 ... OK!
[+] Sending message: 9/10 ... OK!
[+] Sending message: 10/10 ... FAIL! Sleeping 120 secs...
在这里我错过了6,7,10
。
我的输出预期:
[+] Sending message: 1/10 ... OK!
[+] Sending message: 2/10 ... OK!
[+] Sending message: 3/10 ... OK!
[+] Sending message: 4/10 ... OK!
[+] Sending message: 5/10 ... OK!
[+] Sending message: 6/10 ... FAIL! Sleeping 120 secs...
[+] Sending message: 6/10 ... FAIL! Sleeping 120 secs...
[+] Sending message: 6/10 ... OK!
[+] Sending message: 7/10 ... OK!
[+] Sending message: 8/10 ... FAIL! Sleeping 120 secs...
[+] Sending message: 8/10 ... OK!
[+] Sending message: 9/10 ... OK!
[+] Sending message: 10/10 ... OK!
答案 0 :(得分:1)
这是带有一些注释的重构。
send() {
# indent your code for legibility
count=1
while read id; do
# ditto
# also double quotes around arguments
# also FIXME: don't hardcode screen codes
printf "\e[1;77m[\e[0m\e[1;92m+\e[0m\e[1;77m] Sending message:\e[0m\e[1;93m %s\e[0m\e[1;77m/\e[0m\e[1;93m%s ... \e[0m" \
"$count" "$counter"
# ACTUAL FIX: add an inner loop
while true; do
IFS=$'\n'
# Don't gratuitously use $'...' quoting for static strings
# Wrap for legibility
comment=$(curl -i -s -k -X 'POST' -H 'Host: localhost' \
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0' \
-H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate' -H 'Content-Type: application/x-www-form-urlencoded' \
-H 'X-Requested-With: XMLHttpRequest' -H 'Connection: close' \
--data-binary "comment_text=$message&replied_to_comment_id=" \
"https://localhost/comments/$media_id/add/" \
-w "%{http_code}\n" |
# ^ remove the silly newline before the HTTP code which you immediately discard with the grep
grep -a "HTTP/2 200")
if [[ "$comment" == *'HTTP/2 200'* ]]; then
printf "\e[1;92mOK!\e[0m\n"
# On success, break out of while true loop
break
else
printf "\e[1;93mFAIL!\e[0m \e[1;77mSleeping 120 secs...\e[0m\n"
# Actually sleep 120 secs like it says
sleep 120 # not 60
fi
# Don't sleep again
#sleep 1
let count++
done
done < id
}
要突出显示实际的修复方法,我们从
while read id; do
if curl then;
printf OK\n
else
printf FAIL\n
sleep
fi
done
进入内循环
while read id; do
while true; do # <- inner loop starts
if curl then;
printf OK\n
break # <- break out of inner loop on success
else
printf FAIL\n
sleep
fi
done # <- inner loop ends
done
您可能希望将while true
更改为在重试特定次数后或其他情况下中止的内容。