Rapidshare-Downloadmanager für Free-User

Status
Für weitere Antworten geschlossen.

_TokTok_

Benutzer
Mitglied seit
18. Nov 2007
Beiträge
1.310
Punkte für Reaktionen
0
Punkte
0
Bei mir hat das nur geklappt wenn man gleichzeitig das Timeout höher ansetzt:

PHP:
curl_setopt($ch2, CURLOPT_TIMEOUT, 9000);

Hab einfach ne 0 drangehängt.
 

baeckerman83

Benutzer
Mitglied seit
22. Jan 2008
Beiträge
69
Punkte für Reaktionen
0
Punkte
6
Bei mir klappt das Script nicht mehr. :(
Er sgat immer Seite kann nicht gefunden werden. Hat jemand eine Idee wieso?
 

ralftopas

Benutzer
Mitglied seit
04. Feb 2009
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
Was genau geht denn nicht mehr?
Rufst du das Script via Cronjob oder Browser auf?
Solltest du es über ein Cronjob laufen lassen, ruf das Script mal manuell über den Browser auf und schau mal was er dir ausgibt.
Wird eine error.txt im Scriptverzeichnis angelegt?
 

baeckerman83

Benutzer
Mitglied seit
22. Jan 2008
Beiträge
69
Punkte für Reaktionen
0
Punkte
6
Ich gebe es auf der Konsole ein. Folgendes wird ausgegeben. Wenn ich warte wird die Datei leider nur 0 byte groß. Rufe ich die Datei vom Rechner aus direkt bei Rapidshare ab funktioniert es.

PHP:
baeckerman83> php rs.php
Rapidshare-URL : <a href="http://rapidshare.com/files/11111/datei.rar">http://rapidshare.com/files/11111/datei.rar</a><br>Countdown-URL : http://rs721.rapidshare.com/files/11111/datei.rar<br>Filename : datei.rar<br>Download-URL :  http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>The page is not found</title>
</head>
<style type="text/css">
<!--
h1 {
        font-family: Arial, Helvetica, sans-serif;
        color: #0066CC;
        font-size: 25px;
        line-height: 60px;
}
body {
        font-family: Arial, Helvetica, sans-serif;
        font-size: 12px;
        color: #666666;
}
a {
        text-decoration: none;
}
a:hover {
text-decoration: underline;
}
-->
</style>
<body>
<center>
<h1><img src="/webdefault/images/logo.jpg" width="200" height="51" vspace="40" /></h1>
<h1>Sorry, the page you are looking for is not found.</h1>
<input type="button" value="Back" onclick="history.go( -1 );return true;">
<hr size="1" width="600">
<p>© 2008 <a href="http://www.synology.com/">Synology Inc.</a></p>

</center<br>DL possible<br>Waiting for 60 seconds!<br>PHP Notice:  Undefined variable: page in /volume1/web/rs.php on line 128
1-2-
 

ralftopas

Benutzer
Mitglied seit
04. Feb 2009
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
PHP Notice: Undefined variable: page in /volume1/web/rs.php on line 128

Sieht für mich im esten Moment so aus, als ob die rs.php irgendwie kaputt gegangen ist.
Ich schick dir mal meine per PN.
Kopier die einfach mal ins gleiche Verzeichnis und ersetzt die existierende Datei.
 

Free

Benutzer
Mitglied seit
26. Aug 2009
Beiträge
39
Punkte für Reaktionen
0
Punkte
0
Sers,

hab mir dein Scriptchen mal geschnappt... und ausprobiert (auch mit der Aktualisierung bzgl. des Counters von nicknick.

Habe das eine oder andere selbst gebastelt:
- Var Deklarationen um zB Verzeichnisse einfacher ändern zu können oder Dateinamen der error / ready / todo.txt
- Abfrage, ob überhaupt was in der todo drin ist (ich finde man muss RS nicht häufiger als nötig penetrieren... nachher kommen die einem noch auf die Schliche ;))
- Das Countdownintervall per Random von 2sec - 2 min erhöht, damit man auch nicht merkt, ah alle EXAKT 16 min kommt ne Anfrage (btw. hab meine Zeit jetz auf 1,5 Std hochgesetzt im cronjob, da der aus irgendeinem Grund beim Neuaufruf des Scripts den alten Download abgebrochen hat).. ihr seht schon ich bin paranoid ^^
- und damit ich auch merke, wenn ein DL abgebrochen hat wird als ausgabe anfangs die Größe des Files mit ausgelesen und abgedruckt

mein Cronjob wird so gestartet (daher brauchte ich auch absolute Pfade)

php /xx/xx/rs.php >> /xx/xx/err.html

und die html hat dann nat. alles schön aufgelistet

ach ja, habe auch hier und da nen Zeitstempel eingefügt zum Debuggen/zur Kontrolle

so nu zu dem Script:

PHP:
<?
/**
Genereller Ablauf:
    1.) Normale Downloadseite öffnen
    2.) Link zur Countdownseite aus Quelltext holen
    3.) Countdown von 60 Sekunde verstreichen lassen
    4.) Aus Countdownseite während Countdown läuft definitiven Downoadlink holen
    5.) Nach Countdownablauf cURL auf definitiven Downloadlink ausführen    
**/

//Var Deklaration
$dir = "/vol/dir/scripte/";
$txt_err = $dir."error.txt";
$txt_rdy = $dir."ready.txt";
$txt_src = $dir."todo.txt";

// Countdownzeit für Datei holen
function get_countdown_time($quelltext,$prefix,$suffix){
    $countdown_time = substr($quelltext,strpos($quelltext,$prefix)+strlen($prefix),strpos

($quelltext,$suffix)-strpos($quelltext,$prefix)-strlen($prefix));
    return $countdown_time;
}  

// Größe holen
function get_size($quelltext){
    $size = substr($quelltext, strpos($quelltext, 'color:#8E908F')+17, (strpos($quelltext, ' KB</font></p>')- 

strpos($quelltext, 'color:#8E908F')-17));
    return $size;
}

// Link zur Countdownseite
function dl_link_1($quelltext){
    $dl_link = substr($quelltext, strpos($quelltext, 'id="ff" action="')+16, (strpos($quelltext, '" 

method="post') - strpos($quelltext, 'id="ff" action="')-16));
    return $dl_link;
}

// Downloadlink für Datei holen
function dl_link_2($quelltext){
    $dl_link = substr($quelltext, strpos($quelltext, 'name="dlf" action="')+19, (strpos($quelltext, '" 

method="post') - strpos($quelltext, 'name="dlf" action="')-19));
    return $dl_link;
}

function dl_file($quelltext){
    $dl_link = substr($quelltext, strpos($quelltext, 'id="ff" action="')+16, (strpos($quelltext, '" 

method="post') - strpos($quelltext, 'id="ff" action="')-16));
    $file_arr = explode('/', $dl_link);
    $file = array_pop($file_arr);
    return $file;
}

function dl_verification($quelltext){
    // DL-Limit erreicht. Wielange zu warten?
    if(eregi('download limit',$quelltext)){
        $dl_wait_time = substr($quelltext, strpos($quelltext, 'about ')+6, (strpos($quelltext, 'minutes') - 

strpos($quelltext, 'about ')-7));
        echo 'Standby...<br>'.$dl_wait_time.' min. to wait! '.date(' - d.m.Y H:i:s').'\n';
        return false;
    
    // Bereits ein DL am laufen.
    }elseif(eregi('IP address',$quelltext)){
        echo 'No parallel DLs';
        return false;
    
    // Datei nicht vorhanden    
    }elseif(eregi('check the download link',$quelltext)){
        echo 'Link corrupt';
        return false;        
    
    // Dl möglich. 
    }else{
        return true;
    }
}


// Link in jeweiliger Datei speichern : ready.txt oder error.txt
function save_link($txt_file, $txt_link){
    $handle = fopen($txt_file, 'a');
    $txt_link .= chr(9);
    $txt_link .= date(' - d.m.Y H:i:s');
    fwrite($handle, $txt_link);
    fwrite($handle, "\r\n");    
    fclose($handle);
}

// Obersten Eintrag aus der todo Datei einlsesen
function get_link($txt_src){
    $handle = fopen($txt_src, 'r');
    $temp_link = fgets($handle, 1024);    
    fclose($handle);
    return $temp_link; 
}

// Nach erfolgreichem Download ersten Eintrag löschen
function delet_first_entry($txt_src){
    $array = file($txt_src);
    array_shift($array); 
    $fp = fopen($txt_src,"w");
    for ($i = 0; $i<count($array); $i++){
        fputs($fp, $array[$i]);
    }
    fclose($fp); 
}


// Aktuellen Link einlesen - DL Link nur löschen, wenn DL möglich.
$rs_adresse = trim(get_link($txt_src));
if ($rs_adresse != "") {
echo 'Rapidshare-URL : <a href="'.$rs_adresse.'">'.$rs_adresse.'</a><br>';

// Link zur Countdownseite und Dateinamen holen
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $rs_adresse);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.7) 

Gecko/2009011913 Firefox/3.0.6');    
$page_link = curl_exec($ch);
curl_close($ch);
$link_countdown = dl_link_1($page_link);
$size = get_size($page_link);
$file = dl_file($page_link);
echo 'Größe ist: '.$size.'<br>';
echo 'Countdown-URL : '.$link_countdown.'<br>';
echo 'Filename : '.$file.'<br>';


// Wenn RS-Link ok ist:
if((dl_verification($page_link)) == true){
    
    // Countdownseite öffnen und Dateilink holen
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $link_countdown);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'dl.start=Free');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.6) 

Gecko/2009011913 Firefox/3.0.6');    
    $page_countdown = curl_exec($ch);
    curl_close($ch);
    
    
    // Abfragen ob Download möglich ist
    if(dl_verification($page_countdown) == true){
        $def_dl_link = dl_link_2($page_countdown);
        echo 'Download-URL : '.$def_dl_link.'<br>';
        echo 'DL possible<br>';
        echo 'Waiting for 60 seconds!<br>';    
    
	// Zwangspause
          $countdown_prefix = "var c=";
          $countdown_suffix = ";         ";  
          $countdown_time = get_countdown_time($page_countdown,$countdown_prefix,$countdown_suffix);

	// Random Offset zw. 2 und 120 Sekunden
          srand((double)microtime()*1000000);
	  $offset = rand(2,120);
          $i = $countdown_time+$offset;
          echo "Waiting for $i seconds!<br>";
          while($i >= 1){
              echo $i.'-';
              flush();
              sleep(1);
              $i--;
          }  
        echo '<br>Def. DL-Link : '.$def_dl_link;
        echo '<br>DL started.'.date(' - d.m.Y H:i:s');
        flush();    
    
    
        // nach Countdownablauf Dateidownload starten
        $handle = fopen($dir.$file,'w');    
        $ch2 = curl_init();
        curl_setopt($ch2, CURLOPT_URL, $def_dl_link);
        curl_setopt($ch2, CURLOPT_TIMEOUT, 900);
        curl_setopt($ch2, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.6) 

Gecko/2009011913 Firefox/3.0.6');        
        curl_setopt($ch2, CURLOPT_FILE, $handle);
        curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
        curl_exec($ch2);
        fclose($handle); 
        curl_close($ch2);
    
        echo "<br>DL finished.<br><br><br>".date(' - d.m.Y H:i:s');
        
        // erfolgreichen Downloadlink in ready.txt speichern
        save_link($txt_rdy, $rs_adresse);
        delet_first_entry($txt_src);
    }
}else{
    // Aktuellen Link in error.txt speichern
    save_link($dir.$txt_err, $rs_adresse);
    delet_first_entry();
}
} else {
echo date(' - d.m.Y H:i:s')." - kein Link zur Verfügung<br>";
}

?>
 

ralftopas

Benutzer
Mitglied seit
04. Feb 2009
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
Hi,

freut mich, dass mein Scritp weiterentwickelt wird.
Mir fehlt es neben dem Studium einfach an Zeit...

Ich habe unabhängig zu dir ncoh 1-2 Veränderungen bei mir vorgenommen.
Habe da noch ein Fehler entdeckt gehabt bei mir.

Manche Dateien werden von RS geblockt und manche sind wegen Überwachung für einige Tage gesperrt.
Wenn so eine File aufgerufen wird, hängt das Script...

in folgende Funktion:
PHP:
function dl_verification($quelltext){
müssen folgende neue Abfragen rein:

PHP:
	// Datei nicht vorhanden - durch RS gelöscht	
	}elseif(eregi('violation of our terms',$quelltext)){
		echo 'File deleted by RS';
		return false;	
	
	}elseif(eregi('suspected to contain',$quelltext)){
		echo 'File blocked by RS';
		return false;

Dann werden auch diese 2 Fälle abgefangen.

Wenn ich deine Version mit meinen kleinen Änderungen zusammenwerfe, kommt folgende aktuelle Version raus:
PHP:
<?
/**
Genereller Ablauf:
    1.) Normale Downloadseite öffnen
    2.) Link zur Countdownseite aus Quelltext holen
    3.) Countdown von 60 Sekunde verstreichen lassen
    4.) Aus Countdownseite während Countdown läuft definitiven Downoadlink holen
    5.) Nach Countdownablauf cURL auf definitiven Downloadlink ausführen    
**/

//Var Deklaration
$dir = "/vol/dir/scripte/";
$txt_err = $dir."error.txt";
$txt_rdy = $dir."ready.txt";
$txt_src = $dir."todo.txt";

// Countdownzeit für Datei holen
function get_countdown_time($quelltext,$prefix,$suffix){
    $countdown_time = substr($quelltext,strpos($quelltext,$prefix)+strlen($prefix),strpos

($quelltext,$suffix)-strpos($quelltext,$prefix)-strlen($prefix));
    return $countdown_time;
}  

// Größe holen
function get_size($quelltext){
    $size = substr($quelltext, strpos($quelltext, 'color:#8E908F')+17, (strpos($quelltext, ' KB</font></p>')- 

strpos($quelltext, 'color:#8E908F')-17));
    return $size;
}

// Link zur Countdownseite
function dl_link_1($quelltext){
    $dl_link = substr($quelltext, strpos($quelltext, 'id="ff" action="')+16, (strpos($quelltext, '" 

method="post') - strpos($quelltext, 'id="ff" action="')-16));
    return $dl_link;
}

// Downloadlink für Datei holen
function dl_link_2($quelltext){
    $dl_link = substr($quelltext, strpos($quelltext, 'name="dlf" action="')+19, (strpos($quelltext, '" 

method="post') - strpos($quelltext, 'name="dlf" action="')-19));
    return $dl_link;
}

function dl_file($quelltext){
    $dl_link = substr($quelltext, strpos($quelltext, 'id="ff" action="')+16, (strpos($quelltext, '" 

method="post') - strpos($quelltext, 'id="ff" action="')-16));
    $file_arr = explode('/', $dl_link);
    $file = array_pop($file_arr);
    return $file;
}

function dl_verification($quelltext){
    // DL-Limit erreicht. Wielange zu warten?
    if(eregi('download limit',$quelltext)){
        $dl_wait_time = substr($quelltext, strpos($quelltext, 'about ')+6, (strpos($quelltext, 'minutes') - 

strpos($quelltext, 'about ')-7));
        echo 'Standby...<br>'.$dl_wait_time.' min. to wait! '.date(' - d.m.Y H:i:s').'\n';
        return false;
    
    // Bereits ein DL am laufen.
    }elseif(eregi('IP address',$quelltext)){
        echo 'No parallel DLs';
        return false;
    
	// Datei nicht vorhanden	
	}elseif(eregi('check the download link',$quelltext)){
		echo 'Link corrupt';
		return false;	

	// Datei nicht vorhanden - durch RS gelöscht	
	}elseif(eregi('violation of our terms',$quelltext)){
		echo 'File deleted by RS';
		return false;	
	
	}elseif(eregi('suspected to contain',$quelltext)){
		echo 'File blocked by RS';
		return false;	       
    
    // Dl möglich. 
    }else{
        return true;
    }
}


// Link in jeweiliger Datei speichern : ready.txt oder error.txt
function save_link($txt_file, $txt_link){
    $handle = fopen($txt_file, 'a');
    $txt_link .= chr(9);
    $txt_link .= date(' - d.m.Y H:i:s');
    fwrite($handle, $txt_link);
    fwrite($handle, "\r\n");    
    fclose($handle);
}

// Obersten Eintrag aus der todo Datei einlsesen
function get_link($txt_src){
    $handle = fopen($txt_src, 'r');
    $temp_link = fgets($handle, 1024);    
    fclose($handle);
    return $temp_link; 
}

// Nach erfolgreichem Download ersten Eintrag löschen
function delet_first_entry($txt_src){
    $array = file($txt_src);
    array_shift($array); 
    $fp = fopen($txt_src,"w");
    for ($i = 0; $i<count($array); $i++){
        fputs($fp, $array[$i]);
    }
    fclose($fp); 
}


// Aktuellen Link einlesen - DL Link nur löschen, wenn DL möglich.
$rs_adresse = trim(get_link($txt_src));
if ($rs_adresse != "") {
echo 'Rapidshare-URL : <a href="'.$rs_adresse.'">'.$rs_adresse.'</a><br>';

// Link zur Countdownseite und Dateinamen holen
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $rs_adresse);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.7) 

Gecko/2009011913 Firefox/3.0.6');    
$page_link = curl_exec($ch);
curl_close($ch);
$link_countdown = dl_link_1($page_link);
$size = get_size($page_link);
$file = dl_file($page_link);
echo 'Größe ist: '.$size.'<br>';
echo 'Countdown-URL : '.$link_countdown.'<br>';
echo 'Filename : '.$file.'<br>';


// Wenn RS-Link ok ist:
if((dl_verification($page_link)) == true){
    
    // Countdownseite öffnen und Dateilink holen
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $link_countdown);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'dl.start=Free');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.6) 

Gecko/2009011913 Firefox/3.0.6');    
    $page_countdown = curl_exec($ch);
    curl_close($ch);
    
    
    // Abfragen ob Download möglich ist
    if(dl_verification($page_countdown) == true){
        $def_dl_link = dl_link_2($page_countdown);
        echo 'Download-URL : '.$def_dl_link.'<br>';
        echo 'DL possible<br>';
        echo 'Waiting for 60 seconds!<br>';    
    
    // Zwangspause
          $countdown_prefix = "var c=";
          $countdown_suffix = ";         ";  
          $countdown_time = get_countdown_time($page_countdown,$countdown_prefix,$countdown_suffix);

    // Random Offset zw. 2 und 120 Sekunden
          srand((double)microtime()*1000000);
      $offset = rand(2,120);
          $i = $countdown_time+$offset;
          echo "Waiting for $i seconds!<br>";
          while($i >= 1){
              echo $i.'-';
              flush();
              sleep(1);
              $i--;
          }  
        echo '<br>Def. DL-Link : '.$def_dl_link;
        echo '<br>DL started.'.date(' - d.m.Y H:i:s');
        flush();    
    
    
        // nach Countdownablauf Dateidownload starten
        $handle = fopen($dir.$file,'w');    
        $ch2 = curl_init();
        curl_setopt($ch2, CURLOPT_URL, $def_dl_link);
        curl_setopt($ch2, CURLOPT_TIMEOUT, 900);
        curl_setopt($ch2, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.6) 

Gecko/2009011913 Firefox/3.0.6');        
        curl_setopt($ch2, CURLOPT_FILE, $handle);
        curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
        curl_exec($ch2);
        fclose($handle); 
        curl_close($ch2);
    
        echo "<br>DL finished.<br><br><br>".date(' - d.m.Y H:i:s');
        
        // erfolgreichen Downloadlink in ready.txt speichern
        save_link($txt_rdy, $rs_adresse);
        delet_first_entry($txt_src);
    }
}else{
    // Aktuellen Link in error.txt speichern
    save_link($dir.$txt_err, $rs_adresse);
    delet_first_entry();
}
} else {
echo date(' - d.m.Y H:i:s')." - kein Link zur Verfügung<br>";
}

?>


TODO:
Folgendes Problem gibt es noch:
Wenn ein Link defekt ist und keine Datei runtergeladen wird, weil z.B. eine Datei gelöscht wurde, wird wieder 16 Min+X min gewartet, bsi die nächste Datei geladen wird.
Das ist ja "Zeitverschwendung".
Fehlt noch eine Abfrage ob eine Datei heruntergeladen wird udn wenn dies nicht funktioniert, sollte kurz darauf die nächst folgende geladen werden.
 

Free

Benutzer
Mitglied seit
26. Aug 2009
Beiträge
39
Punkte für Reaktionen
0
Punkte
0
Da fällt mir noch mehr ein ^^

Willst n SVN Aufmachen? :D

Ich arbeite und studiere nebenher, von daher :)
Zeit hat man nicht, Zeit muss man sich nehmen

Todo
Rich (BBCode):
- Link defekt: nächste Datei starten
- Error/Ready flag in die ready.txt
- Abfrage ob erwartete Dateigröße mit tatsächlicher übereinstimmt

Erste Idee für Link defekt:
Das "Hauptprogramm" in weiter Funktionseinheiten ohne Rückgabewert der Übersicht halber zusammenfassen und dann per While-Schleife solange durchlaufen lassen bis ein Link dabei ist, der gültig ist. Nicht vergessen, bei leerer Datei muss nach wie vor abgebrochen werden.


//edit:
Habe nen kleine Dateigrößen-Check eingebaut, aber noch nicht getestet, wird die Nacht passieren.
Ich überlege, das Script evtl. in ne Endlosschleife zu hauen, dass er quasi nur abbricht, wenn wirklich 0 mehr im Textfile ist und bei allen anderen Möglichkeiten
die Schleife wiederholt, so dass quasi ein Cronjob überflüssig ist oder nur ggf ein bash Script alle paar Stunden abfragt ob der Prozess läuft und wenn nicht ihn neustartet.
Was sagst du dazu? ^^
 
Zuletzt bearbeitet:

Free

Benutzer
Mitglied seit
26. Aug 2009
Beiträge
39
Punkte für Reaktionen
0
Punkte
0
Ok bei mir läufts jetzt im Loop, hab ne neue Funktion drin, die bei falscher Dateigröße den Link ans Ende des Files setzt und einfach erstmal n anderes File lädt.
Des weiteren läuft das Script jetzt im Loop bis die todo abgearbeitet ist, sprich leer.
Der Loop zählt bei Wartezeit von 15 Min dann automatisch runter, werden also nicht ständig Anfragen an RS gestellt.
 

ralftopas

Benutzer
Mitglied seit
04. Feb 2009
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
sche sche,

wegen bash script:
ich find die lösung vio cronjob etwas besser, da man auf diese weise das script nur nachts laufen lassen kann. so beeinflusst das downloaden nicht den downstream den man tagsüber zum arbeiten usw braucht.
außerdem läut das script so nicht ununterbrochen udn braucht evtl systemresourcen.

Der Loop zählt bei Wartezeit von 15 Min dann automatisch runter, werden also nicht ständig Anfragen an RS gestellt.
Heisst das, dass wenn die datei nicht downloadbar ist dennoch 15 min gewartet wird?
das sollte ja eigentlich gerade vermieden werden oder hab cih dich da grade missverstanden?
 

Free

Benutzer
Mitglied seit
26. Aug 2009
Beiträge
39
Punkte für Reaktionen
0
Punkte
0
Da ich aktuell VDSL25 und bald 50 habe, ist mir das bisschen Bandbreite, was Rapidshare verbraucht eigentlich egal ;D

Ich weiss zwar wie gesagt noch nicht warum, aber offenbar wird durch den Cronjob regelmäßig der Download abgebrochen, was mir ziemlich auf die Nerven geht, wenn alles 5x geladen werden muss.

Da bei mir sonst nix auf der Kiste läuft, sind mir die Systemressourcen auch schnuppe ;). Aber der Ressourcen Monitor zeigt da nix böses an.

Nein, wenn diese eine Datei nen defekten Link hat oder entfernt wurde, dann wird zu ner neuen Datei übergegangen. Sollte aber die Datei nicht ladbar sein, weil du gerade erst geladen hast, dann wartet das Script.
Hab dazu die boolsche Abfrage von dir etwas modifiziert. Die Funktion gibt jetzt nicht in jedem Fall ein true oder false als boolsch aus, sondern auchmal als String.
 

ralftopas

Benutzer
Mitglied seit
04. Feb 2009
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
cronjiob beendet dir den download?
evtl weil der download mehr als 16 min dauerT? ^^

ist mir noch nicht aufgefallen.
kannst du das replizieren?
 

Free

Benutzer
Mitglied seit
26. Aug 2009
Beiträge
39
Punkte für Reaktionen
0
Punkte
0
also Tagsüber (ich geh mal davon aus, dass dann die Datenraten richtig im Keller sind für FreeUser) hab ich fast jeden Download abgebrochen. Abgebrochen heisst bei mir, nicht die volle Größe erreicht. Nachts lädt eigentlich alles top.

Jetz mit dem Script im Loop läufts eigentlich prima.

Replizieren kann ich das nicht so richtig, hatte heute auch wieder abgebrochene Downloads... vllt. weil CURL nen Timeout hat?!
 

ralftopas

Benutzer
Mitglied seit
04. Feb 2009
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
ja, hat ein limit, aber das hatte ich eigentl. schon recht hochgeschraubt...

PHP:
		// nach Countdownablauf Dateidownload starten
		$handle = fopen($file,'w');	
		$ch2 = curl_init();
		curl_setopt($ch2, CURLOPT_URL, $def_dl_link);
		curl_setopt($ch2, CURLOPT_TIMEOUT, 90000);
		curl_setopt($ch2, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6');		
		curl_setopt($ch2, CURLOPT_FILE, $handle);
		curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
		curl_exec($ch2);
		fclose($handle); 
		curl_close($ch2);

90.000 sec = 1.500 Minuten = 25h > 1 Tag...
Sollte eigentl. nicht das Prob darstellen...

Was aber evtl sein kann, dass tagsüber der download mal kurzzeitig auf 0 kb/s sinkt.
evtl. denkt dann curl dass der download fertig ist und hört auf?
 

Free

Benutzer
Mitglied seit
26. Aug 2009
Beiträge
39
Punkte für Reaktionen
0
Punkte
0
ah... bei mir steht 900
ich hab daran allerdings nix geändert... gut... da haben wirs ^^
 

ralftopas

Benutzer
Mitglied seit
04. Feb 2009
Beiträge
84
Punkte für Reaktionen
0
Punkte
0
Ei wunderbar.

Darfst mir aber gern mal deine Version mit dem Loop zukommen lassen :D
 

Free

Benutzer
Mitglied seit
26. Aug 2009
Beiträge
39
Punkte für Reaktionen
0
Punkte
0
Gern, wenns fertig ist, hab irgendwie noch n Problem mit der Dateigrößen-Abfrage :(
die läuft noch nicht.
 

Free

Benutzer
Mitglied seit
26. Aug 2009
Beiträge
39
Punkte für Reaktionen
0
Punkte
0
So,

hier die nächste Version.
Ist ohne while-Schleife, das Script ruft sich einfach am Ende selbst auf.
Grund: Es gab nen Bug, bei dem 4 Bytes des eigentlich fertigen Downloads, erst fertiggestellt wurden, wenn das Script neu angefangen hat runterzuladen.


PHP:
<?
/**
Genereller Ablauf:
    1.) Normale Downloadseite öffnen
    2.) Link zur Countdownseite aus Quelltext holen
    3.) Countdown von 60 Sekunde verstreichen lassen
    4.) Aus Countdownseite während Countdown läuft definitiven Downoadlink holen
    5.) Nach Countdownablauf cURL auf definitiven Downloadlink ausführen    
**/

//Var Deklaration
$dir = "/vol/xxx/dl/";
$txt_err = $dir."error.txt";
$txt_rdy = $dir."ready.txt";
$txt_src = $dir."todo.txt";

// Countdownzeit für Datei holen
function get_countdown_time($quelltext,$prefix,$suffix){
    $countdown_time = substr($quelltext,strpos($quelltext,$prefix)+strlen($prefix),strpos($quelltext,$suffix)-strpos($quelltext,$prefix)-strlen($prefix));
    return $countdown_time;
}  

// Größe holen
function get_size($quelltext){
    $size = substr($quelltext, strpos($quelltext, 'color:#8E908F')+17, (strpos($quelltext, ' KB</font></p>')- strpos($quelltext, 'color:#8E908F')-17));
    return $size;
}

// Link zur Countdownseite
function dl_link_1($quelltext){
    $dl_link = substr($quelltext, strpos($quelltext, 'id="ff" action="')+16, (strpos($quelltext, '" method="post') - strpos($quelltext, 'id="ff" action="')-16));
    return $dl_link;
}

// Downloadlink für Datei holen
function dl_link_2($quelltext){
    $dl_link = substr($quelltext, strpos($quelltext, 'name="dlf" action="')+19, (strpos($quelltext, '" method="post') - strpos($quelltext, 'name="dlf" action="')-19));
    return $dl_link;
}

function dl_file($quelltext){
    $dl_link = substr($quelltext, strpos($quelltext, 'id="ff" action="')+16, (strpos($quelltext, '" method="post') - strpos($quelltext, 'id="ff" action="')-16));
    $file_arr = explode('/', $dl_link);
    $file = array_pop($file_arr);
    return $file;
}

function dl_verification($quelltext){
    // DL-Limit erreicht. Wielange zu warten?
    if(eregi('download limit',$quelltext)){
        $dl_wait_time = substr($quelltext, strpos($quelltext, 'about ')+6, (strpos($quelltext, 'minutes') - strpos($quelltext, 'about ')-7));
        echo 'Standby...<br>'.$dl_wait_time.' min. to wait! '.date(' - d.m.Y H:i:s');
	echo $dl_wait_time;
        return $dl_wait_time;
    
    // Bereits ein DL am laufen.
    }elseif(eregi('IP address',$quelltext)){
        echo 'No parallel DLs';
        return false;
    
    // Datei nicht vorhanden    
    }elseif(eregi('check the download link',$quelltext)){
        echo 'Link corrupt';
        return false;        

    // Datei nicht vorhanden - durch RS gelöscht    
    }elseif(eregi('violation of our terms',$quelltext)){
        echo 'File deleted by RS';
        return false;    
    
    }elseif(eregi('suspected to contain',$quelltext)){
        echo 'File blocked by RS';
        return false;     

    // Dl möglich. 
    }else{
        return "true";
    }
}


// Link in jeweiliger Datei speichern : ready.txt oder error.txt
function save_link($txt_file, $txt_link){
    $handle = fopen($txt_file, 'a');
    $txt_link .= chr(9);
    $txt_link .= date(' - d.m.Y H:i:s');
    fwrite($handle, $txt_link);
    fwrite($handle, "\r\n");    
    fclose($handle);
}

// Obersten Eintrag aus der todo Datei einlsesen
function get_link($txt_src){
    $handle = fopen($txt_src, 'r');
    $temp_link = fgets($handle, 1024);    
    fclose($handle);
    return $temp_link; 
}

// Nach erfolgreichem Download ersten Eintrag löschen
function delet_first_entry($txt_src){
    $array = file($txt_src);
    array_shift($array); 
    $fp = fopen($txt_src,"w");
    for ($i = 0; $i<count($array); $i++){
        fputs($fp, $array[$i]);
    }
    fclose($fp); 
}

function first_entry_last($txt_src){
    $array = file($txt_src);
    $shifted = array_shift($array); 
    array_push($array,$shifted);
    $fp = fopen($txt_src,"w");
    for ($i = 0; $i<count($array); $i++){
        fputs($fp, $array[$i]);
    }
    fclose($fp); 
}



// Aktuellen Link einlesen - DL Link nur löschen, wenn DL möglich.
$rs_adresse = trim(get_link($txt_src));

//Prüfung ob es einen Link gibt, wenn nicht Abbruch
if ($rs_adresse != "") {
        // Link zur Countdownseite und Dateinamen holen
	echo 'Rapidshare-URL : <a href="'.$rs_adresse.'">'.$rs_adresse.'</a><br>';
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $rs_adresse);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
	curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.7) 	Gecko/2009011913 Firefox/3.0.6');    
	$page_link = curl_exec($ch);
	curl_close($ch);
	$link_countdown = dl_link_1($page_link);
	$size = get_size($page_link);
	$file = dl_file($page_link);
	echo 'Größe ist: '.$size.'<br>';
	echo 'Countdown-URL : '.$link_countdown.'<br>';
	echo 'Filename : '.$file.'<br>';

// Wenn RS-Link ok ist:
  if((dl_verification($page_link)) == true){
    // Countdownseite öffnen und Dateilink holen
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $link_countdown);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'dl.start=Free');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6');    
    $page_countdown = curl_exec($ch);
    curl_close($ch);

    
    
    // Abfragen ob Download möglich ist
    if(($dl_verify = dl_verification($page_countdown)) == "true"){
        echo $dl_verify;
        $def_dl_link = dl_link_2($page_countdown);
        echo 'Download-URL : '.$def_dl_link.'<br>';
        echo 'DL possible<br>';
        echo 'Waiting for 60 seconds!<br>';    
    
	// Zwangspause
          $countdown_prefix = "var c=";
          $countdown_suffix = ";         ";  
          $countdown_time = get_countdown_time($page_countdown,$countdown_prefix,$countdown_suffix);

	// Random Offset zw. 2 und 120 Sekunden
          srand((double)microtime()*1000000);
	  $offset = rand(2,120);
          $i = $countdown_time+$offset;
          echo "Waiting for $i seconds!<br>";
          while($i >= 1){
              echo $i.'-';
              flush();
              sleep(1);
              $i--;
          } 
        echo '<br>Def. DL-Link : '.$def_dl_link;
        echo '<br>DL started.'.date(' - d.m.Y H:i:s')."<br><br>";
        flush();    
    
    
        // nach Countdownablauf Dateidownload starten
        $handle = fopen($dir.$file,'w');    
        $ch2 = curl_init();
        curl_setopt($ch2, CURLOPT_URL, $def_dl_link);
        curl_setopt($ch2, CURLOPT_TIMEOUT, 90000);
        curl_setopt($ch2, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6');        
        curl_setopt($ch2, CURLOPT_FILE, $handle);
        curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
        curl_exec($ch2);
        fclose($handle); 
        curl_close($ch2);

           echo "<br>DL finished - ".date('d.m.Y H:i:s')."<br><br><br><br><br>";
        
        // erfolgreichen Downloadlink in ready.txt speichern
        save_link($txt_rdy, $rs_adresse);
        delet_first_entry($txt_src);
    } else if ($dl_verify != false) {
	$wait_time = $dl_verify;
	$i = $wait_time * 2;
	     while($i >= 1){
	      $min = $i / 2;
              echo $min.'-';
              flush();
              sleep(30);
              $i--;
        } 
    }
  }else{
    // Aktuellen Link in error.txt speichern
    save_link($dir.$txt_err, $rs_adresse);
    delet_first_entry();
  }
  system("php /vol/xxx/dl/rs.php >> /vol/xxx/dl/err.html&");
} else {
	$load_it = "false";
	echo date('d.m.Y H:i:s')." - kein Link zur Verfügung<br><br><br><br>";
}
?>
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Ist ohne while-Schleife, das Script ruft sich einfach am Ende selbst auf.

Das kann im ungünstigen Fall einmal zu einem Stack-Overflow führen ... Stunden, Tage, Wochen ... irgendwann einmal ...

Itari
 

Free

Benutzer
Mitglied seit
26. Aug 2009
Beiträge
39
Punkte für Reaktionen
0
Punkte
0
Das kann im ungünstigen Fall einmal zu einem Stack-Overflow führen ... Stunden, Tage, Wochen ... irgendwann einmal ...

Itari

Ich denke nicht. Der Aufruf funktioniert per system()... Damit wird eigentlich nur ein Befehl auf Kommandozeile ausgeführt. In dem Falle der "php /vol/xxx/dl/rs.php [...]".

Das selbst Aufrufen ist kein rekursiver Funktionsaufruf, bei dem die aufrufende Funktion/das Script weiterhin im Speicher bleibt. Es wird also quasi ein ganz neuer Prozess gestartet, bevor der alte gekillt wird.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat