Rapidownloader - skrypt do pobierania plików

Potrzebujesz pomocy z C, C++, perl, python, itp.
tracerout
Posty: 32
Rejestracja: 06 sierpnia 2008, 16:21

Rapidownloader - skrypt do pobierania plików

Post autor: tracerout »

Dla własnych potrzeb ,,skrobnąłem'' skrypt do ściągania plików z rapida. Skrypt po ściągnięciu pliku wykonuje

Kod: Zaznacz cały

ifdown -a; ifup -a
czyli np. w przypadku neostrady zmienia IP i ściąga dalej.

Co i jak działa?
W folderze ze skryptem tworzymy plik base.txt, w nim zapisujemy linki do rapida (jeden pod drugim każdy odnośnik w osobnej linii) oraz folder Download, do którego zapisywane będą pobrane pliki. Może się komuś przyda:

Kod: Zaznacz cały

#!/usr/bin/perl
 use HTTP::Request::Common qw(POST);
 use LWP::UserAgent;
 $ua = new LWP::UserAgent;
$base_f = 'base.txt';
$base = `cat $base_f`;
@chars = split(/\n/, $base);
$ilosc = push(@chars);
for($i=0; $i < $ilosc; $i++)
{
print "Przygotowanie do pobierania: $chars[$i]\n";
#print $chars[$i]."\n";
 my $req = new HTTP::Request(GET => $chars[$i]);
 my $res = $ua->request($req);
 my $res = $ua->request($req);
$zwr = $res->content;
$zwr =~ m/<form id="ff" action="(.*?)"/g;
$zwr1 = `curl -sd "dl.start=Free" $1`;
$zwr1 =~ m/<input checked type="radio" name="mirror" onclick="document.dlf.action=\\'(.*?)\\';"/g;
print "Czekamy 50s...\n";
sleep(53);
print "Pobieramy...\n";
`wget -P Download $1`;
print "Pobrano: ";
shift @chars;
print "\n";
`echo -n > $base_f`;
for($l=0; $l < push(@chars); $l++)
{
`echo $chars[$l] >> $base_f`;
}
print "Resetowanie polaczenia!\n";
`ifdown -a; ifup -a`;
}
print "############################\n
#Pobieranie zakonczone!
############################\n"
Awatar użytkownika
qbsiu
Beginner
Posty: 491
Rejestracja: 19 marca 2007, 19:47
Lokalizacja: £DZ

Rapidshare + Pentagram Cerberus

Post autor: qbsiu »

Ja przerobiłem skrypt ze strony: http://jachacy.mm5.pl/pub/rsget.sh. Pobiera z rapida + resetuje mój ruter - Pentagram Cerberus.

Kod: Zaznacz cały

#!/bin/bash
#
# Autor: Piotr Jachacy <jachacy@gmail.com>
# Modyfikował: £ukasz Kubsz < [url]http://lukaszkubsz.org[/url] >
#
# ostatnia modyfikacja: 28.12.2008
#
# /* This program is free software. It comes without any warranty, to
# * the extent permitted by applicable law. You can redistribute it
# * and/or modify it under the terms of the Do What The Fuck You Want
# * To Public License, Version 2, as published by Sam Hocevar. See
# * [url]http://sam.zoy.org/wtfpl/COPYING[/url] for more details. */ 
#
# kolorki
clear
red="\e[1;31m"
zaden="\033[0m"
green="\e[1;92m"
white="\e[1;37m"

liczba=0


function restart
{

GATEIP="192.168.0.1"
LINK="http://$GATEIP/doc/index.htm?WINDWEB_URL=/doc/adsltop.htm&ADSL_Action=0"
USER="admin"
PASS="haselko_nasze"
wget --quiet --http-user=$USER --http-password=$PASS ${LINK} -O /tmp/wget_router
rm -f /tmp/wget_router
rm -rf .ip
mkdir .ip
cd .ip
while [ 1 ]; do
ip=`wget --quiet [url]http://checkip.dyndns.org/index.html[/url] && cat index.html | cut -d ' ' -f 6 | cut -d '<' -f 1`
sleep 1
if [ -n "$ip" ]; then
        break
fi
done
cd ..
rm -rf .ip
}
function odliczanie
{
	x=$1
	while [ $x -ge 1 ]; do
		printf "\r%-5s" $x"s"
		x=$[x -1]
		sleep "1"
	done
	printf "\r%-5s" ""
}
function pobierz
{
	link=$1
	sciezka=$2

	link=$(wget "$link" -q -O - | grep 'form id="ff"' | sed -e 's/.*action="\(.*\)"\s.*/\1/')

	if [ -n "$link" ]; then
		link=$(wget --post-data "dl.start=Free" $link -q -O -)


		if [  -n "$(echo "$link" | grep "Please wait until the download is completed")" ]; then
			echo -e ''$red'Sciągasz inne pliki!'$zaden''
			exit
		elif [  -n "$(echo "$link" | grep "You have reached the download limit for free-users. Would you like more?")" ]; then
			echo -e ''$green'Trwa resetowanie Twojego rutera'$zaden''
			restart
			pobierz $1 $sciezka
		else
			czas=$(echo "$link" | grep "var c" | sed -e "s/var c=\([0-9]*\);.*/\1/")
			echo -e ''$green'Trwa odliczanie'$zaden''
			odliczanie $czas
			echo -e ''
			echo -e ''$red'----------------------------------------------------------'$zaden''
			echo -e ''$red''$liczba'/'$ilosc''$green' Trwa pobieranie: '$1''$zaden''
			link=$(echo "$link" | grep 'form name="dlf"'| sed -e 's/.*action="\(.*\)"\s.*/\1/')
			wget --post-data "mirror=on" "$link" -P "$sciezka"
			if [ "$?" == "0" ]; then
				kdialog --passivepopup "Pobrano $link"
			else
				kdialog --passivepopup "Nie udało się pobrać pliku: $link"
				
			fi
			echo -e ''$red'----------------------------------------------------------'$zaden''
		fi	
					
	else
		echo -e ''$red'Nie udało się pobrać pliku: '$green''$1''$zaden''
	fi
}

sciezka_zapisu=`kdialog --getexistingdirectory /`
typ=`kdialog --radiolist "Wybierz typ:" 1 "Wprowadź listę" on 2 "Wprowadź linki ręcznie" off`

if [ $typ == "1" ]; then
sciezka=`kdialog --getopenfilename ~`
	ilosc=`cat $sciezka |grep -E -v "^#|^$" | wc -l`
	for x in $(cat $sciezka)
	do
		if [ -n "$x" ]; then
			liczba=$(($liczba+1))
			pobierz "$x" "$sciezka_zapisu"
		fi
	done
elif [ $typ == "2" ]; then
	touch ~/tmp.rapid
	kdialog --textinputbox 'Podaj linki, [b]każdy link w osobnej linijce[/b]' > ~/tmp.rapid
	ilosc=`cat ~/tmp.rapid | grep -E -v "^#|^$" | wc -l`
	for x in $(cat ~/tmp.rapid)
	do
		if [ -n "$x" ]; then
			liczba=$(($liczba+1))
			pobierz "$x" "$sciezka_zapisu"
		fi
	done
rm ~/tmp.rapid
fi
ma jeszcze trochę błędów, ale działa... Na noc wrzuciłem dużo linków, pobrał wszystkie. Zmodyfikowany by można było wybierać ścieżkę zapisu i wklejać linki, ew dawać gotowy plik z linkami.
Modyfikacje mojego skryptu będą sobie leżały: http://qbsiu.palarnia.org/Skrypty
Pozdrawiam!
P.s. Może potem się zabawię i będzie się tylko wybierało lokalizację zapisu...
Pies
Beginner
Posty: 127
Rejestracja: 22 sierpnia 2008, 21:17

Post autor: Pies »

Bardzo miłe, sam ostatnio nad czymś takim pracowałem. :)
Niestety (albo i stety) posiadam stałe ip i w związku z tym trick z ifdown -a && ifup -a u mnie nie zadziała, więc robię to trochę inaczej - muszę odczytać ile muszę czekać i przeczekać ten czas, a by nadrobić to jakoś to stosuję proxy.
Orientujesz się może, jakie zwykle są limity czasowe?
Awatar użytkownika
ruun
Member
Posty: 1366
Rejestracja: 29 marca 2007, 21:07
Lokalizacja: Kruszwica

Post autor: ruun »

Ja używam takiego...

Kod: Zaznacz cały

#! /bin/bash

#  rsgetd.sh - Download Service

#  Version 0.2

#  Copyright (C) 2007 George Notaras ([url]http://www.g-loaded.eu/[/url])
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License version 2 as
#  published by the Free Software Foundation.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.

# Special thanks to 'Zart' from the #fedora channel on FreeNode

# CONFIG START
HOMEDIR="/var/www/rapidshare.xxxxxxxxxx.pl"
DLBASKET="$HOMEDIR/pending"
DLDIR="/home/download/rapid/"
LOGFILE="$HOMEDIR/rsget.log"
WGETLOG="$HOMEDIR/wget.log"
CACHEFILE="$HOMEDIR/done"
CURRENTFILE="$HOMEDIR/current"
LIMIT="90k"
WGETBIN="/usr/bin/wget"
RSCOOKIE="$HOMEDIR/rapidshare"
# CONFIG END

cat <> $DLBASKET | (
        while read url ; do
                        echo "`date` Starting with rate $LIMIT/s: $url" >> $LOGFILE
                        echo $url > $CURRENTFILE
                        if [ $(expr match "$url" '[rapidshare.com]') = 1 ] ; then
                                $WGETBIN -o $WGETLOG -c --limit-rate=$LIMIT --directory-prefix=$DLDIR --load-cookies $RSCOOKIE $url
                        else
                                $WGETBIN -o $WGETLOG -c --limit-rate=$LIMIT --directory-prefix=$DLDIR $url
                        fi
                        echo "`date` Finished: $url" >> $LOGFILE
                        echo $url >> $CACHEFILE
        done )

exit 0
Do jego obsługi napisałem interfejs www w php. ¦ciągam głównie z rapidshare premium więc w skrypcie jest zrobiona autoryzacja za pomocą ciastka. Planuje to przepisać tak by możliwa była zmiana kolejności i usówanie plików z kolejki.
Awatar użytkownika
qbsiu
Beginner
Posty: 491
Rejestracja: 19 marca 2007, 19:47
Lokalizacja: £DZ

Post autor: qbsiu »

Pies pisze:Orientujesz się może, jakie zwykle są limity czasowe?
15 minut, i ten skrypt (autora) na którym bazowałem, czekał limit czasu :-) Poszukaj na jego stronie! Ja musiałem przebudować, bo po co mam czekać 15 minut, skoro mogę 1:20 czekać ;-) (bo tak średnio resetuje się neo)
tracerout
Posty: 32
Rejestracja: 06 sierpnia 2008, 16:21

Post autor: tracerout »

Przerobiłem swój skrypt tak aby czekał te 15 minut pomiedzy plikami, teoretycznie powinien działać.

Kod: Zaznacz cały

#!/usr/bin/perl
 use HTTP::Request::Common qw(POST);
 use LWP::UserAgent;
 $ua = new LWP::UserAgent;
$base_f = 'base.txt';
$base = `cat $base_f`;
@chars = split(/\n/, $base);
$ilosc = push(@chars);
for($i=0; $i < $ilosc; $i++)
{
print "Przygotowanie do pobierania: $chars[$i]\n";
#print $chars[$i]."\n";
 my $req = new HTTP::Request(GET => $chars[$i]);
 my $res = $ua->request($req);
 my $res = $ua->request($req);
$zwr = $res->content;
$zwr =~ m/<form id="ff" action="(.*?)"/g;
$zwr1 = `curl -sd "dl.start=Free" $1`;
$zwr1 =~ m/<input checked type="radio" name="mirror" onclick="document.dlf.action=\\'(.*?)\\';"/g;
print "Czekamy 50s...\n";
sleep(53);
print "Pobieramy...\n";
`wget -P Download $1`;
print "Pobrano: ";
shift @chars;
print "\n";
`echo -n > $base_f`;
for($l=0; $l < push(@chars); $l++)
{
`echo $chars[$l] >> $base_f`;
}
print "Czekamy 15 minut!\n";
speep(960);
}
print "############################\n
#Pobieranie zakonczone!
############################\n"
Awatar użytkownika
Duncan Idaho
Posty: 54
Rejestracja: 08 września 2007, 13:58
Lokalizacja: Tychy

Post autor: Duncan Idaho »

qbsiu pisze:Zmodyfikowany by można było wybierać ścieżkę zapisu
Dziwne... tylko pierwszy plik zostaje zapisany w miejscu wskazanym przez okienko dialogowe. Kolejne lądują w katalogu z którego odpalam skrypt.
Wybrałem opcję z linkami w pliku.
Poza tym skrypcik działa bez zarzutu.
Awatar użytkownika
qbsiu
Beginner
Posty: 491
Rejestracja: 19 marca 2007, 19:47
Lokalizacja: £DZ

Post autor: qbsiu »

Wiesz co, sprawdzałem przed chwilą - działa, może miejsce zapisu nie podajesz

Kod: Zaznacz cały

/mnt/sasasa
tylko

Kod: Zaznacz cały

media:/sasasa
U mnie się wysypywało, jak dawałem lokalizacje montowanych partycji w kde, przez media:/. Wget nie potrafi zapisać do media:/, trzeba pisać /normalny/pkt/montowania :/
Awatar użytkownika
Duncan Idaho
Posty: 54
Rejestracja: 08 września 2007, 13:58
Lokalizacja: Tychy

Post autor: Duncan Idaho »

qbsiu pisze:U mnie się wysypywało, jak dawałem lokalizacje montowanych partycji w kde, przez media:/. Wget nie potrafi zapisać do media:/, trzeba pisać /normalny/pkt/montowania :/
Podawałem standardowo (wybierając przez kdialog) katalog w moim domowym i taką też ścieżkę wyświetlał skrypt (/home/i/tak/dalej)za pierwszym przebiegiem.
Z tego co sprawdzałem dodając w kilku miejscach skryptu wyświetlanie aktualnej wartości zmiennej ze ścieżką to w drugim przebiegu (i następnych) do funkcji pobierz nie zostaje przekazana wartość ścieżki (lub "ginie gdzieś" w funkcji). Jest pusta.
Raptem kilka linii prostego kodu a dzieją się dziwne rzeczy... Pierwszy raz coś takiego widzę.
Awatar użytkownika
ModY_WzM
Beginner
Posty: 131
Rejestracja: 26 stycznia 2007, 21:26

Post autor: ModY_WzM »

qbsiu pisze:
Pies pisze:Orientujesz się może, jakie zwykle są limity czasowe?
15 minut, i ten skrypt (autora) na którym bazowałem, czekał limit czasu :-) Poszukaj na jego stronie! Ja musiałem przebudować, bo po co mam czekać 15 minut, skoro mogę 1:20 czekać ]
Tylko po co czekać 1:20 przecież to wieczność ;-). Ja zamiast restartować cały router resetuje tylko połączenie przez telnet co jest o wiele szybsze. Sprawdź czy twój cerberus obsługuje komendę

Kod: Zaznacz cały

wan adsl reset
Pozdrawiam
ODPOWIEDZ