
Geschrieben von
take
(Moderator) am 11.02.2009 um 21:15 Uhr.
Beiträge: 613 /
#1785
Kontakt:
Mailen
|
WWW
Command Line Rapidshare Loader selfmade
Vorwort
Dieses How To wurde von mir für pädagogische Zwecke geschrieben. Es dient lediglich dazu, das Verständnis aufzubauen wie man u.a. an das Problem „Downloadmanager mit PHP“ heran gehen kann. Genauso wenig wird „meine“ Lösung die beste, schnellste, what ever Lösung sein. Sie funktioniert – mehr oder weniger ;).
Ich schreibe noch einmal klar und deutlich: Dieses Howto dient nicht dazu, das kleine Nichtsnutze nun über Ihre OVH Rootserver von Rapidshare leechen können. Es ist an interessierte PHP Programmierer gerichtet – da u.a. auch das Thema „PHP – CLI“ kurz angeschnitten wird.
Zielstellung
Nach diesem Howto sollten Sie in der Lage sein, mit PHP einen Downloader zu schreiben. Dieser Downloader hier ermöglicht es eine Downloadqueue von Rapidshare.com Links abzuarbeiten.
Also wissen wir nun schon was wir alles wollen.
1. Benötigen wir eine Linksdatei
2. Einen Ordner in denen die Downloads gespeichert werden sollen
3. Den Loader Source Code, natürlich – was sonst?
Schritt 1 – Die Ordnerstrukturen:
Legen Sie bitte eine Struktur wie folgt an:
[root]- class
-> loader.class.php
- downloads
- config.php
- loader.php
- prx.links.sys
- prx.log.sys
Wobei zu beachten ist, das downloads und class Ordner, der Rest Dateien sind.
Schritt 2 – die Datei loader.php
Diese Datei wird unsrer Zentraler Punkt, an dem wir alle weiteren Dateien includen.
<?php
- // parsing configuration file
- include ("config.php");
- // include the loader.class
- require_once ("class/loader.class.php");
- $rsl = new RSL();
- $rsl->_getCFG($cfg);
- $rsl->_log ("Programmstart");
- echo $rsl->output ("******************************************");
- echo $rsl->output ("* Takes PHP Rapidshare linuX Loader *");
- echo $rsl->output ("* - next gen leeching. - *");
- echo $rsl->output ("* *");
- echo $rsl->output ("* (c) 2008 by Take <at> CodersHELL.org *");
- echo $rsl->output ("******************************************");
- while (true)
- {
- $rsl->downLoad();
- }
- ?>
Die includes sollten selbst erklärend sein, RSL wird die Klasse die wir im Anschluss schreiben. Output, _getCFG sowie downLoad sind public Funktionen dieser Klasse.
Schritt 3 – loader.class.php
<?php
- class RSL
- {
- private $cfg;
- private $nextLink;
- private $downloadData;
- private $fileSize;
- private $doAfterDL = "recon";
- private $DownloadDir = "downloads/";
- ?>
- ?>
Die private Variablen stehen für:
$cfg: Configuration, ist eher als Platzhalter gedacht.
$nextLink: Der nächste Link, welcher gedownloaded werden soll.
$fileSize: Die Größe der herrunterzuladenden Datei
$doAfterDL: Soll der Loader einen Reconnect machen, oder 15Minuten warten bis zum nächsten Download
$DownloadDir: Ordner in welchen die heruntergeladenen Dateien gespeichert werden.
Ich werde nun die einzelnen Funktionen Schritt für Schritt erklären.
<?php
- /*
- * @param array cfg
- */
- public function _getCFG ($cfg)
- {
- $this->cfg = $cfg;
-
- return true;
- }
- ?>
- ?>
Diese Funktion liest die Configuration ein -> siehe loader.php
<?php
- /*
- * @param string msg
- * Writes the Logfile
- */
- public function _log ($msg)
- {
- $fp = fopen ($this->cfg["LOG.FILE"], "a+");
-
- $msg = date("(d-m-Y H:i:s)")." -> [ ".$msg." ] \n";
- fwrite ($fp, $msg);
- fclose ($fp);
-
- return true;
- }
- ?>
- ?>
Diese Funktion loggt alles, was der Loader später macht. Downloadstart, Ende, Geschwindigkeiten etc.
<?php
- /*
- * @param string txt
- */
- function output ($txt)
- {
- return date("(d-m-Y H:i)")." ".$txt."\n";
- }
- ?>
- ?>
Einfache Consolen Output Klasse. – selbst erklärend
<?php
- /*
- * @param int bytes
- */
- public function byteConvert( $bytes ) {
-
- if ($bytes<=0)
- return '0 Byte';
-
- $convention=1024; //[1000->10^x|1024->2^x]
- $s=array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB');
- $e=floor(log($bytes,$convention));
- return round($bytes/pow($convention,$e),2).' '.$s[$e];
- }
- ?>
Diese Funktion gibt die richtige Einheit von Größen wieder.
<?php
- /*
- * Get the next Link
- */
- private function _checkLinksFile ()
- {
- $fp = fopen ($this->cfg["LINK.FILE"], "r");
- if ($fp) {
-
- $links=array();
-
- while (!feof ($fp))
- {
- $links[] = trim (fgets ($fp, 4096));
- }
-
- fclose ($fp);
-
- $i = count ($links);
- $i--;
-
- if (empty ($links[$i]))
- {
- unset ($links[$i]);
- }
-
- /*
- * Die Linkfile bearbeiten
- */
- $fp = fopen ($this->cfg["LINK.FILE"], "w+");
- if ($i > 1)
- {
- for ($x=1;$x<$i;$x++)
- {
- fwrite ($fp, $links[$x]."\n");
- }
- }
- fclose ($fp);
- $this->nextLink = $links[0];
- }
- }
- ?>
- ?>
Dies ist nun die erste Klasse, die primär etwas mit dem Downloader zutun hat. Als erstes wird über „fopen“ die Filedatei im readonly Modus geöffnet, ausgelesen und in ein Array gespeichert. Darauf hin wird die Linksdatei neu geschrieben, ohne den ersten Link. Alles Links, bis auf den ersten, werden aus dem Array gelöscht und an die private Variable „$nextLink“ übergeben.
<?php
- public function downLoad($reLoadAfterDisc=false)
- {
- if ($reLoadAfterDisc != true)
- {
- $this->_checkLinksFile();
- $this->freeOne();
- }
- else {
- $this->freeOne();
- }
- }
- ?>
- ?>
Diese Funktion startet den „FreeUser“ Download. Wenn die Variable „$reloadAfterDisc“ auf true gesetzt ist, wird der Download wiederholt (Wenn z.B. Fehler beim Download entstanden.)
So nun kommen wir zum Hauptteil, der freeOne() Funktion. Diese nehme ich wieder auseinander – der Übersicht zu Liebe. PS: Ich hab den Sourcecode etwas kommentiert, sollte also gut verständlich sein ;p.
<?php
- /*
- * Step One for Free User: Say RS Hello.
- */
- Private function freeOne ()
- {
- $fp = fsockopen ("rapidshare.com", 80, $errno, $errstr, 30);
- if (!$fp) { $this->_log ("Error while downlading -> {$this->nextLink}"); $this->downLoad (true); }
- else {
- ?>
- ?>
Ja, es ist eine private Funktion welche als erstes eine Verbindung mit rapidshare.com aufbaut. Sollte es da Fehler geben, wird der Vorgang wiederholt. Andernfalls geht es weiter mit:
<?php
- /*
- * Split out the Hostname and Path of $this->nextLink
- */
- $temp = substr($this->nextLink, 7);
- $explode = explode ("/", $temp);
- $hostname = $explode[0];
-
- $path="";
- for ($x=1;$x<count($explode);$x++)
- $path .= "/".$explode[$x];
- ?>
Wir schneiden den „nextLink“ etwas auseinander, um Hostname und Pfad zu erhalten, damit wir im Anschluss auf die nächste Seite kommen (Schaut euch Rapidshare.com an, dann wirst Ihr, warum wir so viele Verbindungen brauchen bevor es los geht..)
<?php
- <?php
- /*
- * Create the fput
- */
- $out = "GET {$path} HTTP/1.0\r\n"; ###
- $out .= "Host: {$hostname}\r\n"; #####
- $out .= "Connection: close\r\n\r\n";
-
- fputs ($fp, $out);
- ?>
- ?>
Wir senden Rapidshare nun, was wir eigentlich wollen, wir wollen den Freeuser download, genau.
<?php
- /*
- * Get all contents of site
- */
- while (!feof($fp)) {
- $fgets = fgets($fp,128);
- $content1 .= $fgets."\n";
- }
- ?>
- ?>
Wir erhalten von Rapidshare promt eine Antwort. Welche wir – genau – wieder einmal auseinander schneiden müssen um zu verstehen, was RS uns eigentlich schickt. (RS wie wäre es mal mit einer Schnittstelle für Downloadmanager? *gg*)
<?php
- /*
- * Get the Link for our download ticket
- */
- $c = explode ('<form id="ff" action="', $content1);
- $c = explode ('" method="post">', $c[1]);
-
- /*
- * Get the Filesize;
- */
- $s = explode ('<font style="color:#8E908F;">| ', $content1);
- $s = explode ('</font>', $s[1]);
-
- $size = (int) $s[0];
- $this->fileSize = $size;
- ?>
Wir schneiden und schneiden, als erstes schneiden wir uns die URL aus den Formtags, welche unser nächstes Ziel sein sollen, der 2. Abschnitt gibt uns die Größe der Datei an, welche wir beabsichtigen zu laden.
<?php
- $link = substr ($c[0], 7);
- $l = explode (".", $link);
- $l2 = explode ("/", $l[2]);
- $n="";
- for($i=3;$i<count($l);$i++)
- {
- $n .= ".".$l[$i];
- }
- $i = count($n);
- $i--;
-
- $rs = array(
- "server" => $l[0],
- "host" => $l[0].".".$l[1].".".$l2[0],
- "get" => "/".$l2[1]."/".$l2[2]."/".$l2[3].$n
- );
- ?>
- ?>
Hier wird $c[0] zerteilt, in den Link (ohne diese http:// (substr*)), aus welchen wir unten das gerüst unseren nächsten GET’s basteln.
<?php
- /*
- * Sometimes there are stubid \n's in GET, we remove tem here
- * I lost so much time till i found this shit :D
- */
- $rs["get"]= str_replace ("\n", "", $rs["get"]);
- ?>
- ?>
Da mir aufgefallen ist, das bei bestimmten Längen „\n“s geadded werden, schmeißen wir diese noch schnell raus – die stören nämlich etwas.
<?php
- // Secound Part - Get your FreeTicket;
- $fp = fsockopen ($rs["host"], 80, $errno, $errstr, 30);
- if (!$fp) { $this->_log ("Error while downlading -> {$this->nextLink}"); $this->downLoad (true); }
- else {
- ?>
Ähnlich wie oben schon einmal beschrieben, fals was schief geht, starten wir noch einmal.
<?php
- $post = "dl.start=Free"; // _POST send to RS Server
- $n = strlen ($post); // Count the length of postsend
-
- $out = "POST {$rs['get']} HTTP/1.0\r\n";
- $out .= "Host: rapidshare.com\r\n";
- $out .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n";
- $out .= "Connection: close\r\n";
- $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
- $out .= "Content-Length: {$n}\r\n\r\n";
- $out .= "{$post}\n";
- fputs ($fp, $out, strlen ($out)); // Send it now.
- ?>
- ?>
Jetzt betätigen wir den „Free User“ Button und schicken das ganze an Rapidshare.
<?php
- // Now, the RS Server wants to send us some informations we need later.
- $content ="";
- while (!feof ($fp))
- {
- $content .= fgets ($fp, 128);
- }
- ?>
- ?>
Rapidshare hat uns mal wieder etwas zu erzählen, wir nehmen es dankend an und verarbeiten es im nächsten Schritt.
<?php
- // Now we have to remove the HTML shit.
- $__temp = explode ("var c=", $content);
- $__temp = explode (";", $__temp[1]); // Will us give the waiting time.
-
- $__secounds = $__temp[0]+1; // Here we have it :D.
-
- // Download URL PLEASE.
- $__temp = explode ("var tt = '<form name=\"dlf\" action=\"", $content);
- $__temp = explode ("\" method=\"post\">", $__temp[1]);
-
- $__downloadURL = $__temp[0];
-
- unset ($__temp);
- $this->_log ("Waiting for our Ticket [{$__secounds}s]");
- echo $this->output ("Waiting for our Ticket [{$__secounds}s]");
- sleep ($__secounds);
- ?>
- ?>
Also, wir suchen uns als erstes die Anzahl der Sekunden die wir noch warten müssen heraus, diese sind im Javascript Code von Rapidshare zu finden. Dannach besorgen wir uns den Server inkl. Pfad der Datei die wir schon immer haben wollten.
<?php
- // Now, the third part - give me the stuff I (n)ever want
- $_temp = substr ($__downloadURL, 7);
- $explode = explode ("/", $_temp);
- $hostname = $explode[0];
- $path = "";
-
- for ($x=1;$x<count ($explode);$x++)
- $path .= "/{$explode[$x]}";
-
- $x = count ($explode);
- $filename = $explode[($x-1)];
- ?>
- ?>
Wir schneiden den Downloadlink auseinander, um Server, Pfad und Dateiname zu erhalten.
<?php
- $fp = fsockopen ($hostname, 80, $errno, $errstr, 30);
- if (!$fp) { $this->_log ("Error while downlading -> {$this->nextLink}"); $this->downLoad (true); }
- {
- ?>
- ?>
Die 3. Verbindung nach Rapidshare nun.
<?php
- $out = "GET {$path} HTTP/1.1\r\n";
- $out .= "Host: {$hostname}\r\n";
- $out .= "Connection: Close\r\n\r\n";
- fwrite($fp, $out);
- $fp_save = fopen ($this->DownloadDir.$filename, "w+");
- // Time we need to count our downloadspeed
- $i=time();
- $i++;
- ?>
- ?>
Jetzt kommt der interessante Teil. Wir senden nun unseren Download Wunsch an den Server, erstellen die leere Datei lokal bei uns und stellen den Speedzähler ein.
<?php
- echo $this->output ("[:] starting download: {$path}"); // Temp to see something
- $sizeLastRound=0;
- $starttime = time();
- $this->_log ("starting download => {$path}");
- ?>
- ?>
- Selbsterklärend –
<?php
- while (!feof($fp)) {
- $buffer = fgets($fp, 1024);
- fwrite($fp_save, $buffer);
- /*
- * output some status shit
- */
- if (time() > $i)
- {
- $size=0;
- $size = exec("ls -l ".$this->DownloadDir."{$filename} | awk '{print $5}'");
- $temp = ($size-$sizeLastRound)/2;
- $sizeLastRound = $size;
- echo $this->output ("[:] Downloaded ====> ".$this->byteConvert($size)." {".$this->byteConvert($temp)."/s}");
- $this->_log ("{$filename} - Downloaded ====> ".$this->byteConvert($size)." {".$this->byteConvert($temp)."/s}");
- unset ($size, $temp);
- $i=time();
- $i++;
- }
- }
- ?>
- ?>
Wir erhalten nun unsere gewünschte Datei vom Rapidshare Server, diese Speichern wir in unsere Lokale Datei. Jede Sekunden wird der Loader die aktuelle Geschwindigkeit errechnen, in dem er den Filesize von vor einer Sekunde und den aktuellen miteinander vergleicht.
<?php
- $time = time()-$starttime;
- $this->_log ("Finished download => {$path} in {$time}s");
- $this->_log ("doing something");
-
- if ($this->doAfterDL=="recon")
- {
- exec ("./fb_recon.sh");
- sleep(10);
- $this->downLoad ();
- }
- else {
- sleep (930);
- $this->downLoad ();
- }
- ?>
- ?>
Ist dies geschafft, geht es von vorn los, entweder mit einem Internetreconnect, oder nach 15 Minuten Wartezeit
Diese Klammern müssen noch geschlossen werden.
Schritt 5 – config.php
<?php
- $cfg=array(
- "PREMIUM" => 0, // 0=Keinen; 1=Premium
-
- "PREMIUMDATAS" => array(
- "USER" => "",
- "PASS" => ""
- ),
-
- "WAITTIME" => 1, // In Sekunden, warten, bis nächster Download gestartet wird.
- "LINK.FILE" => "prx.links.sys", // Datei, in der Rapidshare Links gespeichert werden.
- "LOG.FILE" => "prx.log.sys", // Log Datei
- );
- ?>
- ?>
In diesem Tutorial werden nur die Werte der Log und Link Datei benutzt, den Rest könnt Ihr selbst einbauen ;).
Als Anhang hänge ich nun das ganze komplett noch einmal ran, die recon.sh für Fritz!Box’n und wenn ichs schaffe das Howto noch einmal als PDF Version.
Rechtschreib, Grammatik, Logikfehler bitte hier im Topic klären – Danke.
Gestartet kann das ganze auf der CLI nun wiefolgt:
fb_recon.zip (Size: 575 Byte)
rs_loader.zip (Size: 4.78 KByte)
Command Line Rapidshare Loader selfmadex.zip (Size: 171.66 KByte)
Viele Grüße
"Jeder, der andere kritisiert, muss eine Alternative haben, die er ihnen anbieten kann." - Mo Ti