如果代理已关闭,请获取新代理

时间:2017-01-18 21:05:44

标签: bash proxy

我正在编写我的第一个bash脚本

LANG="en_US.UTF8" ; export LANG
PROXY=$(shuf -n 1 proxy.txt)
export https_proxy=$PROXY
RUID=$(php -f randuid.php)
curl --data "mydata${RUID}" --user-agent "myuseragent" https://myurl.com/url -o "ticket.txt"

此脚本也使用curl,但如果代理已关闭,则会出现此错误:

  

无法连接PROXY:PORT

如何重新运行bash脚本,以便它可以从proxy.txt

获取另一个代理地址

提前致谢

2 个答案:

答案 0 :(得分:3)

循环运行直到curl成功,例如:

export LANG="en_US.UTF8"
while true; do
    PROXY=$(shuf -n 1 proxy.txt)
    export https_proxy=$PROXY
    RUID=$(php -f randuid.php)
    curl --data "mydata${RUID}" --user-agent "myuseragent" https://myurl.com/url -o "ticket.txt" && break
done

注意&& break命令末尾的curl。 也就是说,如果curl成功,就会突破无限循环。

如果您有多个curl命令,并且需要所有命令才能成功, 然后将它们与&&链接在一起,并在最后一个之后添加break

curl url1 && \
curl url2 && \
break

最后,正如@Inian指出的那样, 您可以使用--proxy标记将代理网址传递给curl,而无需设置https_proxy的额外步骤,例如:

curl --proxy "$(shuf -n 1 proxy.txt)" --data "mydata${RUID}" --user-agent "myuseragent" 

最后,请注意,由于随机性,随机选择的代理可能会多次出现,直到找到有效的代理。 避免这种情况,您可以通过混洗代理读取迭代而不是无限循环:

export LANG="en_US.UTF8"
shuf proxy.txt | while read -r proxy; do
    ruid=$(php -f randuid.php)
    curl --proxy "$proxy" --data "mydata${ruid}" --user-agent "myuseragent" https://myurl.com/url -o "ticket.txt" && break
done

我还小写了用户定义的变量, 因为不建议那些资本化。

答案 1 :(得分:0)

我知道我接受了@janos的答案,但由于我无法编辑他,我将添加此

response=$(curl --proxy "$proxy" --silent --write-out "\n%{http_code}\n" https://myurl.com/url)
status_code=$(echo "$response" | sed -n '$p')
html=$(echo "$response" | sed '$d')
case "$status_code" in
    200) echo 'Working!'
         ;;
      *)
echo 'Not working, trying again!';
exec "$0" "$@"
esac

如果它提供我想要的503状态代码,这将再次运行我的脚本:) 使用@janos代码,如果代理不工作,它将再次运行。 谢谢大家,我实现了我想要的。