Portál AbcLinuxu, 14. června 2024 07:43

down-megaupload

16.12.2008 20:40 | Přečteno: 2348× | Stahovaci skripty

Mám sice doma rozepsaný blog post pro down-rapid, ale nejsem teď momentálně doma, ale mám teď zrovna čas, tak sem dám stahovací skript na www.megaupload.com. Zrovna jsem s ním tahal a jelo to docela rychle, takže by měl být 100% funkční.

Pár slov ke skriptíku. Je podobný jako down-rapid, využívá stejný kód pro zobrazení captcha obrázku a čtení kódu z klávesnice, takže to popíšu spíš letmo, nějaké další detaily budou u skriptu down-rapid.

Skript čte seznam proxy serverů z externího souboru, který sdílí s dalšími skripty. Zkusí stáhnout zadaný odkaz. Pokud stránka obsahuje nějaký text ve smyslu, že má uživatel čekat, protože již vyplýtval časový nebo bytový limit, zkusí to přes jinou proxy. Skript umožnuje ignorovat některé proxy, použít jen zvolené proxy ze seznamu, nebo zadat přímo jednu proxy mimo seznam, umožňuje zadat rychlost stahování.

Pro psaní captcha kódu z obrázku se používá buď Xdialog (dependence!) v X módu, nebo pomocí "read" v console módu nebo když je vynucené zadávání kódu z konzole. Konzolový mód je vhodný při spouštění skriptu na vzdáleném serveru bez X a Xforwardingu. Captcha kód je case insensitive, takže je možné zadávat kód velkými nebo malými písmeny.

Captcha obrázek se stáhne do /tmp/ do náhodného adresáře (mktemp -d) a zobrazuje se v X módu pomocí gqview (můžete si opravit na cokoliv jiného) - gqview je spuštěn na pozadí, je zaznamenán PID a po načtení kódu je zabit. Pokud neběží Xka, je obrázek stažen, ale není zobrazen. Jsou tři možnosti, jak zobrazit obrázek:

Stahování s down-megaupload umí navazovat, takže dejte akorát pozor, když budete stahovat dva různé, ale stejně pojmenované soubory.

Skript obsahuje jednoduchý javascript parser a interpret. Nejsem si jistý, jestli je ještě potřeba, ale funguje to s ním, tak ho tam nechávám. Byl/je tam potřeba kvůli výpočtu doby čekání před stahováním.

Snad je to vše. Upozornění na nefungující skript (chyba, změna na www.megaupload.com) zapisujte buď do diskuze nebo pošlete emailem, ale vždy nezapomeňte přidat URL, ať to můžu otestovat. Odkazy, které byly zrušeny na megaupload.com sem nepište - to řešit nebudu (ani nemůžu). Námitky ke skriptu psát můžete, ale měnit to budu jenom z opravdu dobrého důvodu. Skript si můžete stáhnout a měnit jak chcete. Už někdo psal, že takovýhle skripty dává pod BSD nebo public domain. Já mám rád GPL, takže to dávám pod GPL. Pokud se vám to nelíbí, nápad můžete načerpat ze skriptu a pak si napsat vlastní program a vydat pod licencí, jakou budete chtít. Dotazy k funkci kódu psát můžete, pokud to nebudou dotazy odpovězené v nějakém manuálu (alá RTFM), tak rád odpovím a vysvětlím.

Tak, titulky na Heroes s03e13 jsou hotový, tak jdu čumět. Hezký Vánoce.

#!/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' ' ' )"

agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7"

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"
        wget $rate -U "$agent" -nv -O "$tmpdir"/p1.o --save-cookies="$tmpdir"/p1.c --keep-session-cookies "$1"
        eval "$( perl -e '
undef $/;
$a=<STDIN>;
print sprintf("export captcha=\"http://www.megaupload.com%s\"\n",$captcha) if (($captcha)=($a=~m#<img[^>]*src=["\x27](/capgen\.php[^"\x27]+)["\x27]#i));
print sprintf("export url=\"%s\"\n",$url)
    if (($t1)=($a=~m/(<form[^>]*id=["\x27]captchafrm["\x27][^>]*>)/i)) and ($t1=~/method=["\x27]post["\x27]/i) and (($url)=($t1=~m/action=["\x27]([^"\x27]+)["\x27]/i));
while (($t1)=($a=~m/(<input[^>]*type=["\x27]hidden["\x27][^>]*>)/i)) {
  if ((($field)=($a=~m/name=["\x27](d|imagecode|megavar)["\x27]/i)) and (($val)=($a=~m/value=["\x27]([^"\x27]*)["\x27]/i))) { $val=~s/(.)/"%".unpack("H2",$1)/ge; print sprintf("export post_%s=\"%s\"\n",$field,$val) }
  $a=~s/<input[^>]*type=["\x27]hidden["\x27][^>]*>//i
}' < "$tmpdir"/p1.o )"

echo "captcha: $captcha"
echo "url: $url"
echo "post_d: $post_d"
echo "post_imagecode: $post_imagecode"
echo "post_megavar: $post_megavar"

        if [ -n "$captcha" ] && [ -n "$url" ];then

          wget $rate -U "$agent" -nv -O "$tmpdir"/cap.gif --load-cookies="$tmpdir"/p1.c --save-cookies="$tmpdir"/p2.c --keep-session-cookies "$captcha"
          if [ -n "$DISPLAY" ];then gqview "$tmpdir"/cap.gif >/dev/null 2>&1 & pid="$!" ; fi
          code=""
          if [ -n "$DISPLAY" ] && [ $console -eq 0 ];then
            while [ -z "$code" ];do code="$( Xdialog --no-cancel --title 'Megaupload downloader' --screen-center --stdout --inputbox 'Enter the CAPTCHA code' 10 40 )" ; if [ $? -eq 1 ];then code="-";fi;done
          else
            while [ -z "$code" ];do read -p 'Code ["-" for stop]: ' code;done
          fi
          if [ -n "$DISPLAY" ];then kill "$pid" ; fi
          if [ "$code" != "-" ];then
            code="$( echo "$code" | tr 'a-z' 'A-Z' )"
            wget $rate -O "$tmpdir"/p3.o -U "$agent" -nv --load-cookies="$tmpdir"/p2.c --save-cookies="$tmpdir"/p3.c --keep-session-cookies --post-data="d=${post_d}&imagecode=${post_imagecode}&megavar=${post_megavar}&imagestring=$code" "$url"
            eval "$( 
            perl -e '
use Data::Dumper;
$Data::Dumper::Indent=1;
undef $/;
$a=<STDIN>;
(($v1)=($a=~/\b([0-9a-z_]+)--\s*;/i)) and (($v2)=($a=~/Please\s+wait[^+]+\+([a-z0-9_]+)\+[^+]+seconds/i)) and ($v1 eq $v2) and (($cek)=($a=~/\b$v1\s*=\s*(\d+)\s*;/i));
if (($url)=($a=~m,document\.getElementById\("dlbutton"\)\.innerHTML\s*=\s*((?:"[^"]*"|\x27[^\x27]*\x27|[^"\x27;]*)*);,i)) { 
  @str=(["e",$url]);
  do {
    @nstr=();
    $eval=0;
    for ($i=0;$i<scalar(@str);$i++) {
      if ($str[$i][0] eq "e") {
        $eval=1;
        $exp=$str[$i][1];
        while ($exp=~m,(String|Math)\.(fromCharCode|sqrt|abs)\([^()]+\),i) {
          $exp=~s/(String|Math)\.(fromCharCode|sqrt|abs)\(([^()]+)\)/eval_js($1,$2,$3)/ei;
        }
        while (length($exp)>0) {
          if ((($q,$v)=($exp=~m,^\s*(\x27)([^\x27]*)\x27\s*,)) or (($q,$v)=($exp=~m,^\s*(")([^"]*)"\s*,))) {
            push @nstr,["s",$v];
            if ($q eq "\x27") { $exp=~s,^\s*\x27[^\x27]*\x27\s*,,; } elsif ($q eq "\"") {  $exp=~s,^\s*"[^"]*"\s*,,; }
          } elsif ($exp=~m,^\s*\+\s*,) {
            $exp=~s/^\s*\+\s*//;
          } elsif (($v)=($exp=~m/^\s*([a-z0-9_]+)\s*/i)) {
            push @nstr,["v",$v];
            $exp=~s/^\s*(\w+)\s*//i;
          } else {
            print sprintf("Unknown expression: <<%s>>\n",$exp);
            die;
          }
        }
      } elsif ($str[$i][0] eq "s") {
        push @nstr,[$str[$i][0],$str[$i][1]];
      } elsif ($str[$i][0] eq "v") {
        $eval=1;
        if (($val)=($a=~m/var\s+\b$str[$i][1]\b\s*=\s*((?:"[^"]*"|\x27[^\x27]*\x27|[^"\x27;]*)*);/i)) {
          push @nstr,["e",$val];
        }
      }
    }
    @str=@nstr;
  } while ($eval);
  $str="";
  for ($i=0;$i<scalar(@str);$i++) {
    $str.=$str[$i][1] if ($str[$i][0] eq "s");
  }
  if (($url)=($str=~m,<a.*?href=["\x27]([^"\x27]+)["\x27],i) and (($file)=($url=~m,^.*/([^/]+)\s*$,))) {
    print sprintf("export link=\"%s\"\n",$url);
    $file=~s/&#(\d+);/chr($1)/eg;
    print sprintf("export file=\"%s\"\n",$file);
  }
  print sprintf("export delay=\"%s\"\n",$cek) if (length($cek)>0);
}
sub eval_js {
  my ($o,$m,$v)=@_;
  my ($r);
  $r=sprintf("\"<nothing done with (%s,%s,%s)>\"",$o,$m,$v);
  if (lc($o) eq "string") {
    if (lc($m) eq "fromcharcode") {
      $r=sprintf("\"%s\"",chr(eval($v)));
    } else {
      $r="\"<unknown method $m for object $o>\"";
    }
  } elsif (lc($o) eq "math") {
    if (lc($m) eq "abs") {
      $r=sprintf("\"%s\"",abs($v));
    } elsif (lc($m) eq "sqrt") {
      $r=sprintf("\"%s\"",sqrt($v));
    } else {
      $r="\"<unknown method $m for object $o>\"";
    }
  } else {
    $r="\"<unknown object $o>\"";
  }
  return($r);
}
            ' < "$tmpdir"/p3.o )"
            echo "Link: $link"
            echo "File: $file"
            echo "Delay: $delay"
            if [ -n "$delay" ];then for i in `seq $delay -1 1`;do echo -en "waiting $delay seconds [ $i ]     \r";sleep 1;done;echo;fi
            if [ -z "$link" ];then
              echo "Link '$link' is empty"
              echo "TMPDIR: $tmpdir"
              exit 1
            elif  [ -z "$file" ];then
              echo "Output file '$file' is empty"
              echo "TMPDIR: $tmpdir"
              exit 1
            else
              echo "wget $rate -U '$agent' --load-cookies="$tmpdir"/p3.c -c -O '$file' '$link'"
              if wget $rate -U "$agent" --load-cookies="$tmpdir"/p3.c -c -O "$file" "$link"; then break;fi
            fi
          else
            echo "TMPDIR: $tmpdir"
            exit 1
          fi
        elif grep -Ei 'All[[:space:]]+download[[:space:]]+slots[[:space:]]+assigned[[:space:]]+to[[:space:]]+your[[:space:]]+country[[:space:]]+\([^)]+\)[[:space:]]+are[[:space:]]+currently[[:space:]]+in[[:space:]]+use[[:space:]]*\.[[:space:]]*Please[[:space:]]+try[[:space:]]+again[[:space:]]+in[[:space:]]+a[[:space:]]+few[[:space:]]+hours' "$tmpdir"/p1.o;then
          echo "Trying next proxy"
        else
          echo "Unknown error"
          echo "TMPDIR: $tmpdir"
          exit 1
        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ář

16.12.2008 21:34 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: down-megaupload
Odpovědět | Sbalit | Link | Blokovat | Admin
Moj skript pre rapidshare pouzival (ked este bolo CAPTCHA) cacaview. Pri mensom fonte na terminali alebo po zvacsani obrazku (cacaview vie zoomovat) sa to dalo slusne precitat a potom cez read zadat.
If you hold a Unix shell up to your ear, you can you hear the C.
16.12.2008 21:44 RoboShim | skóre: 13 | blog: RoboShim
Rozbalit Rozbalit vše Re: down-megaupload

Hehe, když mi Pev psal o přidání captcha na uloz.to, tak jsem mu aalib navrhoval jako šílenou myšlenku na zobrazování captcha:-) A vida, nebyl jsem jedinej a dokonce je vidět, že to tak šílenej nápad není:-) Akorát jsem mu psal o aalib a bblib, ale samozřejmě místo bblib jsem měl na mysli libcaca. No, takže zobrazování captcha v ASCII-art by šlo:-)

17.12.2008 18:53 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: down-megaupload
Ak je nainštalované NetPBM dá sa použiť aj giftopnm captcha.gif | ppmtoterm

Inak celkom zaujímavý (a funkčný) je aj tento javascript: Megaupload auto-fill captcha

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