Portál AbcLinuxu, 1. května 2025 20:43
Tento skript umí stahovat soubory ze serverů rapidshare (.de, .com). Využívá pouze základní nástroje a měl by tak fungovat všude (no dobře, na mikrovlnce mi to nefungovalo, na Asus WL500g taky ne, ale stačí oprava na jeden řádek). Umí ověřit základní chybové stavy (soubor už na serveru není, soubor na serveru sice je, ale server ho ještě nedovolí stáhnout). Od takto jednoduchého skriptu se nedá čekat, že by uměl lámat captcha, takže se zeptá uživatele, zbytek dělá sám.
Skript využijete, pokud potřebujete stahovat něco na počítač, ke kterému nemáte momentálně fyzický přístup. Na tomto počítači vůbec nemusí být v provozu grafika, protože si captcha obrázek můžete prohlédnout z jiného počítače. Typické využití asi bude: sedím ve škole/práci a počítač doma sosá.
Stahování probíhá tak, že člověk někde získá odkaz, zadá do prohlížeče a dostane se tak na úvodní (první) stránku (kde se vybírá Premium nebo Free). Když klikne na Free, dostane se na druhou stránku, kde je captcha. Po napsání správného kódu se soubor začne stahovat.
Servery jsou proti botům chráněny pomocí captcha. Obrázek se stahuje protokolem https. (může někdo vysvětlit, proč nestačí http?)
Obě varianty rapidshare se trošku liší v uživatelském rozhraní. Na modifikaci .com se server (zrcadlo, mirror), odkud se má stahovat, nastavuje už ve formuláři na úvodní stránce , kdežto na .de se to řeší až na druhé stránce (tam, kde je captcha). V obou modifikacích se dá server (zrcadlo) změnit na druhé stránce.
Modifikace .de nutí uživatele čekat nějakou dobu, než se zobrazí captcha. Je to spojené s ošklivě vypadajícím javascriptem (unescape a změť znaků, z nichž třetina je %). Existují návody, jak toto obejít, ale zdá se, že už nefungují, aspoň na mě vždy vybafla hláška psaná nejspíš německy. Modifikace .com čekací dobu nepoužívá a zobrazí captcha hned.
Smysl pro humor: když si zkopírujete adresu obrázku captcha a později si ho necháte zobrazit v prohlížeči, přečtete na něm "LOL".
Fair Play: když si necháte zobrazit captcha obrázek několikrát po sobě bez načtení celé stránky, bude na obrázku nápis, že jste bot a server se s vámi nebude bavit. Když načtete celou stránku znova, je všechno v pořádku, žádný IP ban se nekoná.
Zdá se, že captcha na rapidshare je case insensitive. Navíc možná umožňuje záměnu nuly a písmene 'O', protože se mi ještě nikdy nestalo, že bych napsal kód špatně, i když v něm bylo něco kulatého.
- #!/bin/sh
- #usage: $0 <url>
- #tested on rapidshare.de and rapidshare.com
- #user settings
- url=$1
- directory=~/tmp/rs
- captchaimage=$directory/captcha.png
- tmpfile=$directory/wgettmp
- #other settings
- wget=/usr/bin/wget
- #auxiliary functions
- countdown(){
- echo Countdown
- x=$1
- until [ $x -le 0 ]; do
- echo -e -n "\\r$x "
- x=$(($x - 1))
- sleep 1
- done
- }
- #============================================================
- #The first page
- $wget -O $tmpfile $url
- present=`grep "You want to" $tmpfile | wc -l `
- if [ $present -ge 0 ]
- then
- echo "The file is present"
- else
- echo "The file is not present, exitting"
- exit 1 #the file is not available
- fi
- #============================================================
- #The second page (with captcha)
- action=`grep "action=" $tmpfile | sed -e 's/.*action="\([^"]*\)".*/\1/'`
- uri=`grep 'name="uri"' $tmpfile | sed -e 's/.*name="uri" value="\([^"]*\)".*/\1/'`
- if [ x$uri != x ]
- then
- postData="uri=$uri&dl.start=Free" # rapidshare.de
- server="de"
- else
- postData="dl.start=Free" # rapidshare.com
- server="com"
- fi
- echo Debug information: ----------------
- echo Action is $action
- echo Post Data are $postData
- echo Server is $server
- echo -----------------------------------
- #The second page is downloaded here
- $wget --post-data="$postData" -O $tmpfile $action
- echo Second page downloaded ------------
- if [ $server = "de" ]
- then
- #the "hidden" form with needed information)
- encoded=`grep unescape $tmpfile| sed "s/.*unescape('\(.*\)'.*/\1/"`
- if [ x$encoded = x ]
- then
- minutes=`grep "Or wait" $tmpfile | sed -e "s/.*Or wait\(.*\)minutes.*/\1/"`
- echo Cannot download file yet, wait $minutes minutes
- exit 2
- fi
- wait=`grep "var c =" $tmpfile | sed -e "s/.*var c =\([^;]*\);.*/\1/"`
- #some not fully understood hack, it does not work everywhere
- #http://www.j-pfennig.de/LinuxImHaus/kde_cgi_tutorial.html
- # uencoded=`printf "${encoded//\%/\x}"`
- substitued=`echo $encoded | sed 's/%/\\\\x/g'`
- uencoded=`printf $substitued`
- imagename=`echo $uencoded | sed -e 's/.*<;img src="\([^"]*\)">.*/\1/'`
- action=`echo $uencoded | sed -e 's/.*action="\([^"]*\)".*/\1/'`
- echo Debug information: ----------------
- echo Imagename is $imagename
- echo Action is $action
- echo Wait $wait
- echo -----------------------------------
- #rapidshare.de forces you to wait some time and it seem that
- #it really checks the time interval
- countdown $wait
- else #rapidshare.com
- action=`grep '<;form name="dl" action="' $tmpfile | sed -e 's/.*<;form name="dl" action="\([^"]*\)".*/\1/'`
- if [ x$action = x ]
- then
- minutes=`grep "Or wait" $tmpfile | sed -e "s/.*Or wait\(.*\)minutes.*/\1/"`
- echo Cannot download file yet, wait $minutes minutes
- exit 3
- fi
- imagename=`grep "Please enter" $tmpfile | sed -e 's/.*<;img src="\([^"]*\)".*/\1/'`
- fi
- echo Debug information: ----------------
- echo Imagename is $imagename
- echo Action is $action
- echo -----------------------------------
- #When the download form is displayed
- $wget -O $captchaimage "$imagename"
- #you will probably want to change the following line
- display $captchaimage &
- echo -----------------------------------
- echo ------ Enter Captcha ------------
- echo -----------------------------------
- echo -n "Enter captcha from the image: "
- read captcha
- if [ $server = "de" ]
- then
- postData="actionstring=Download&captcha=$captcha"
- else
- postData="actionstring=Download&accesscode=$captcha"
- fi
- echo Debug information: ----------------
- echo Post Data are $postData
- echo Action is $action
- echo Calling $wget:
- echo $wget --directory-prefix $directory --post-data="$postData" $action
- echo -----------------------------------
- #get the file
- $wget --directory-prefix $directory --post-data="$postData" $action
- echo Finished
chybí příkaz 'wc', takže řádek 26 se musí upravit. Jako varování uvedu, že následující oprava nefunguje:
Program wget (vlastně busybox), který je v Olegově firmware, neumí '--post-data'. Je tedy potřeba použít plnou verzi wget [2]. Stačí rozbalit binárku kamkoliv na disk (binárka má přes 2MB, takže se asi musí dát na externí disk připojený přes USB) a na řádku 10 si nastavte správnou cestu. Nezapomeňte nastavit práva na spuštění.
Tiskni
Sdílej:
#!/bin/bash countDown() { i=26 while ((--i >= 0)); do echo -n "$i" sleep 1 tput el1 tput cub 3 done } if [ $# != 1 ]; then echo -e "\nUsage:\n\t$0 URL\n" exit 1 fi UA="Opera/9.12 (X11; Linux i686; U; en)" OUTPUT=~/Desktop/"$(basename $1 | sed -r 's/_[^_]+$//' | sed -r 's/-([^-]+)$/\1/')" DOWNLOAD="$(echo $1 | sed s/stahni/stahnout/)" echo -n Getting SID... SID="$( curl -I --user-agent "$UA" "$1" 2>/dev/null | grep -Po '(?<=SID=)[^;]+' )" if [ -z "$SID" ]; then echo " :(" exit 1 fi echo " done: $SID" countDown curl --user-agent "$UA" \ --output "$OUTPUT" \ --cookie SID="$SID" \ --referer "$1" \ "$DOWNLOAD"
wget -c -i links.txt --http-user=USERNAME --http-password=PASSWORD
[maros@wl-500gp root]$ wc -h wc: illegal option -- h BusyBox v1.1.3 (2007.01.01-14:37+0000) multi-call binary Usage: wc [OPTION]... [FILE]...A nainstalovat plnohodnotný wget taky není žádný problém:
#ipkg install wget-sslAktuální verze je 1.10.2-3. To je myslím dost nové
Mam BusyBox v1.1.3 (2006.06.29-17:07+0000), to je trosku starsi. Myslim, ze verze firmwaru ma na konci 7f, v dobe, kdy jsem to instaloval, byla posledni stable.
Tu anabazi s wget tam mam proto, ze to bude fungovat i bez ipkg (staci jedna binarka). Je pravda, ze potom nemas ani screen a nemohl by ses jenom pripojit, pustit stahovani a zase se odpojit. Samozrejme, ze ipkg je mocny nastroj a uz se chystam zprovoznit nahravani z internetovych radii pomoci streamripper (skript mam, jenom vyzkousim, jestli funguje).
[maros@wl-500gp root]$ type wget wget is a tracked alias for /opt/bin/wget [maros@wl-500gp root]$ ipkg files wget-ssl Package wget-ssl (1.11.4-1) is installed on /opt/ and has the following files: /opt/bin/wget /opt/man/man1/wget.1 /opt/etc/wgetrc Successfully terminated. [maros@wl-500gp root]$ wget --version GNU Wget 1.11.4 Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://www.gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Originally written by Hrvoje Niksic . Currently maintained by Micah Cowan . [maros@wl-500gp root]$
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.