Portál AbcLinuxu, 7. června 2024 22:59

down-bagruj

9.1.2009 01:36 | Přečteno: 3671× | Stahovaci skripty | poslední úprava: 11.2.2009 02:21

Tak jsem dneska našel nějaké odkazy na stahování přes úložiště http://bagruj.cz. Je tam sice captcha, ale jinak to jede rychle, čekací dobu jsem měl vždy 15 sekund, takže jsem si udělal další stahovací skriptík.

Asi k tomu není co dodat, část kódu jsem zkopíroval z down-rapid, část z down-megaupload.

UPDATE 2009/01/10: Tak jsem udělal dvě úpravy. První úprava je ukončení skriptu, pokud skript z nějakého důvodu nedokáže získat URL ke stahování. Druhá úprava mění chování při zadávání captcha kódu a měření čekací doby. Po získání URL captcha se zjistí aktuální čas, dále se stáhne a zobrazí captcha. Na promptu pro čtení captcha kódu se zobrazí i cesta captcha obrázku-pokud by se zobrazily dva captcha obrázky a prompty, tak je těžké identifikovat, který prompt patří ke kterému obrázku, takže zobrazením cesty v promptu bude identifikace jednodušší (gqview, nebo jiný prohlížeč by měl cestu ke captcha obrázku také zobrazovat). Když se přečte captcha kód, tak se zjistí aktuální čas. Pokud již vypršela čekací doba, pokračuje se stažením souboru. Pokud by náhodou uživatel dokázal zadat captcha kód ještě před koncem čekací doby, skript počká zbytek doby a pak se spustí stahování. A měl jsem tam chybku s odpočítáváním-teď už by to mělo odpočítávat dobře.

UPDATE 2009/02/11: Jenom oprava textu v titulku Xdialogu.

#!/bin/bash

proxiesfile="$HOME/.download-proxies"

if ! [ -e "$proxiesfile" ];then
  echo "Please, create file $proxiesfile"
  exit
fi

allproxylist="$( awk -F '|' '{print $2;}' "$proxiesfile" | tr '\n' ' ' )"
sshtunnels="$( awk -F '|' '$1~/^.+$/{print "  " $1,$2;}' "$proxiesfile" )"
sshtunservers="$( awk -F '|' '$1~/^.+$/{print $1;}' "$proxiesfile" | tr '\n' ' ' )"

console=0

if [ $# -gt 0 ];then
  i=$#
  while [ $i -gt 0 ];do
    case "$1" in
      -a)
        if [ $# -gt 1 ];then
          id="$[$2+1]"
          proxylist="$proxylist $( echo "$allproxylist" | tr -s '[[:space:]]' '\n' | sed -n "${id}p" )"
          i=$[$i-1]
          shift 2
        else
          echo "value please"
          exit
        fi
      ;;
      -d)
        if [ $# -gt 1 ];then
          id="$[$2+1]"
          if [ -z "$proxylist" ] ;then proxylist="$allproxylist";fi
          proxylist="$( echo "$proxylist" | tr -s '[[:space:]]' '\n' | sed "${id}d" )"
          i=$[$i-1]
          shift 2
        else
          echo "value please"
          exit
        fi
      ;;
      -r)
        if [ $# -gt 1 ];then
          rate="--limit-rate=$2"
          i=$[$i-1]
          shift 2
        else
          echo "value please"
          exit
        fi
      ;;
      -p) 
        if [ $# -gt 1 ];then
          proxylist="$2"
          shift 2
          i=$[$i-1]
        else
          echo "value please"
          exit
        fi
      ;;
      -c)
        console=1
        shift
      ;;
      -x)
        console=0
        shift
      ;;
      *)
        v="$1"
        shift 1
        set "$@" "$v"
      ;;
    esac
    i=$[$i-1]
  done

  if [ -z "$proxylist" ] ;then proxylist="$allproxylist";fi

  tmpdir="$( mktemp -d )"
  echo "TMPDIR: $tmpdir"

  while [ $# -gt 0 ];do
    echo "Downloading URL $1"
    for proxy in $proxylist ;do
      if [ "$proxy" = "NONE" ];then
        unset http_proxy
      else
        export http_proxy="$proxy"
      fi

      echo "HTTP PROXY: $http_proxy"
      url="$1"
      o1="$( wget -O - -q "$url" )"
      o2="$(
        echo "$o1" \
        | perl -e '
            undef $/;
            $a=<STDIN>;
            if (($b)=($a=~m,<form[^>]+name="f1"[^>]+>(.+?)</form>,is)) {
              @inputs=();
              while ((($input)=($b=~m,(<input[^>]+type="hidden"[^>]+>),is)) and (($name)=($input=~/name="([^"]+)"/is)) and (($value)=($input=~/value="([^"]*)"/is))) {
                $value=unpack("H*",$value);
                $value=~s/(..)/%$1/g;
                push @inputs,sprintf("%s=%s",$name,$value);
                $b=~s,(<input[^>]+type="hidden"[^>]+>),,is;
              }
              print sprintf("post-data:%s\n",join("&",@inputs));
              if (($img)=($b=~m,<img[^>]+src="(http://bagruj.cz/captchas/[^.]+.jpg)"[^>]*>,is)) {
                print "captcha:$img\n";
              }
              if (($wait)=($b=~m,<span[^>]+id="countdown"[^>]*>(\d+)</span[^>]*>,is)) {
                print "wait:$wait\n";
              }
            };
          '
      )"
      captcha="$( echo "$o2" | grep -E '^captcha:' | cut -f2- -d: )"
      postdata="$( echo "$o2" | grep -E '^post-data:' | cut -f2- -d: )"
      wait="$( echo "$o2" | grep -E '^wait:' | cut -f2- -d: )"
      echo "wait: $wait seconds"
      waitstart="$( date +"%s" )"
      echo "captcha: $captcha"
      if [ -n "$captcha" ] && [ -n "$url" ];then
        wget $rate -q -O "$tmpdir"/cap "$captcha"
        if [ -n "$DISPLAY" ];then gqview "$tmpdir"/cap >/dev/null 2>&1 & pid="$!" ; fi
        code=""
        if [ -n "$DISPLAY" ] && [ $console -eq 0 ];then
          while [ -z "$code" ];do code="$( Xdialog --no-cancel --title 'Bagruj downloader' --screen-center --stdout --inputbox "Enter the CAPTCHA code\nfor $tmpdir/cap" 10 40 )" ; if [ $? -eq 1 ];then code="-";fi;done
        else
          while [ -z "$code" ];do read -p 'Code for $tmpdir/cap ["-" for stop]: ' code;done
        fi
        if [ -n "$DISPLAY" ];then kill "$pid" ; fi
        if [ "$code" != "-" ];then
          if [ -n "$wait" ]; then
            realwait="$(( $( date +"%s" ) - ( $waitstart + $wait ) ))"
            if [ $( date +"%s" ) -le $(( $waitstart + $wait )) ] ; then while [ $( date +"%s" ) -le $(( $waitstart + $wait )) ];do echo -en "waiting $wait seconds [ $(( $waitstart + $wait - $( date +"%s" ) )) ]     \r";sleep 1; done ; echo ; fi
            file="$( wget $rate -O - -q --post-data="$postdata&code=$code" "$url" | perl -e 'undef $/;$a=<STDIN>;if (($b)=($a=~m,<a\s+href="([^"]+)">\1</a>,is)) { print "$b\n"; };' )"
            if [ -z "$file" ]; then break 2 ; fi
            echo "url: $file"
            echo "wget $rate -c '$file'"
            if wget $rate -c "$file" ; then break ; fi
          fi
        fi
      fi
    done
    shift
  done
  rm -rf "$tmpdir"
else
  cat <<EndOfInfo

ssh tunnels:
$sshtunnels

proxy list:
$( echo "$allproxylist" | tr -s '[[:space:]]' '\n' | nl -v0 -w4 -s' -- ' )

$sshtunservers

Usage: $0 [ -a proxynum ] [ -d proxynum ] [ -r rate-limit ] [ -p proxyurl ] [ { -c | -x } ] URL ...
-a proxynum
    add proxy at line proxynum
-d proxynum
    delete proxy at line proxynum in ACTUAL proxy list
-r rate-limit
    limit wget download rate
-p proxyurl
    insert proxy specified by proxyurl
-c
    use console to enter captcha code
-x
    use X dialog to enter captcha code (this is default)
URL
    URL to download
EndOfInfo
fi
       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

9.1.2009 08:09 YYY | skóre: 29 | blog: martinek
Rozbalit Rozbalit vše Re: down-bagruj
Odpovědět | Sbalit | Link | Blokovat | Admin
Konecne je nekde taky pouzito awk. Nadhera ;-)
9.1.2009 10:21 RoboShim | skóre: 13 | blog: RoboShim
Rozbalit Rozbalit vše Re: down-bagruj

Jojo, awk taky obcas pouziju, ale obvykle jenom na tisk urcitych poli, pokud potrebuju delat jeste nejaky regulary. Na vetsi veci pak spis pouziju perl.

9.1.2009 19:00 Scarabeus IV | skóre: 20 | blog: blogisek_o_gentoo | Praha
Rozbalit Rozbalit vše Re: down-bagruj
Odpovědět | Sbalit | Link | Blokovat | Admin

A ja si myslel ze pisu nesrozumitelnej bash :D

9.1.2009 19:59 RoboShim | skóre: 13 | blog: RoboShim
Rozbalit Rozbalit vše Re: down-bagruj

 

A ja si myslel ze pisu nesrozumitelnej bash :D

Pokud tim chces rict, ze se ti ten skriptik zda nesrozumitelnej, tak rekni, co presne nechapes. Jak jsem psal, pokud to nebudou veci RTFM, tak to rad vysvetlim. A to jsi jeste nevidel down-rapid:)

 

11.1.2009 13:09 Scarabeus IV | skóre: 20 | blog: blogisek_o_gentoo | Praha
Rozbalit Rozbalit vše Re: down-bagruj
Nah,
ja tomu rozumim, jen si rikam ze se to da napsat o hodne citelnejs.
Takhle to vypada jako by bash byla nejaka tezka magie. :D
Sice tam nachazim par veci ktery se me nelibi a ktery bych prepsal ale jinak je to podarena sranda :P
Ukazka jak to delame v gentoo (no spis ja :P):
eclass
bnr
No uznavam ze to taky nejni nejsrozumitelnejsi :P ale furt je to citelnejsi :D
11.1.2009 14:35 RoboShim | skóre: 13 | blog: RoboShim
Rozbalit Rozbalit vše Re: down-bagruj

 

Takhle to vypada jako by bash byla nejaka tezka magie. :D
Sice tam nachazim par veci ktery se me nelibi a ktery bych prepsal ale jinak je to podarena sranda :P
No uznavam ze to taky nejni nejsrozumitelnejsi :P ale furt je to citelnejsi :D

Pockej, pockej. Tady je prevazne na jednom radku jeden prikaz a nemyslim, ze by byly nejak hodne slozity. Nejsem bash-guru a proto pouzivam jenom jednoduchy zakladni veci, takze bych nerekl, ze je to nejak magie (btw, bash magie byla soutezi po drate se suse). Nejvetsi magie je tam ten perl skript, ale proste v perlu je jednodussi parsovat nejakej vetsi text.

 

Co bys tam treba prepsal? Ja se nebranim tomu ucit se novy veci. Co presne se ti zda, ze neni citelne (krome toho perlu, ale kdyz perl umis, tak i ten perl je jednoduchej)?

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.