ShareOnline Loader

PHP Downloadskript (CLI) für Share-Online.

Abhängigkeiten:

  • curl php extension
  • wget
so-loader.php
#!/usr/bin/php
<?
	/**
	 * Share-Online Loader
	 *
	 * @version	0.1
	 * @license	GPL 2 (http://www.gnu.org/licenses/gpl.html)
	 * @author	Heiko Barth <https://www.heiko-barth.de/contact>
	 */
 
	/* Settings */
 
	$user = "";
	$pass = "";
	$downloadDir = "/downloads";
	$downloadList = "/downloads/downloads.txt";
 
	$cookie = "$downloadDir/.auth.cookie";
	$maxFail = 5;
	$failDelay = 60;
	$ua = "Share-Online Loader 0.1";
 
	/* Settings */
 
	if (php_sapi_name() != 'cli') die("ERROR: Not running from CLI.");
 
	preg_match('!columns ([0-9]+?);!', shell_exec("stty -a 2> /dev/null"), $columns);
	if (is_numeric($columns[1]) && $columns[1] >= 88) {
		// display ascii art, if terminal have 88 columns or more
		$logo = <<<LOGO
 __ _                      ___       _ _                 __                 _           
/ _\ |__   __ _ _ __ ___  /___\_ __ | (_)_ __   ___     / /  ___   __ _  __| | ___ _ __ 
\ \| '_ \ / _` | '__/ _ \//  // '_ \| | | '_ \ / _ \   / /  / _ \ / _` |/ _` |/ _ \ '__|
_\ \ | | | (_| | | |  __/ \_//| | | | | | | | |  __/  / /__| (_) | (_| | (_| |  __/ |   
\__/_| |_|\__,_|_|  \___\___/ |_| |_|_|_|_| |_|\___|  \____/\___/ \__,_|\__,_|\___|_|   
LOGO;
	}
	else {
		$logo = "Share-Online Loader 0.1";
	}
 
	set_time_limit(0);
	ob_implicit_flush();
 
	echo $logo . "\n\n";
 
	$red = "\033[31m";
	$green = "\033[32m";
	$yellow = "\033[33m";
	function cecho($str, $color, $return = false) {
		if ($return) {
			return $color . $str . "\033[0m";
		}
		else {
			echo $color . $str . "\033[0m";
		}
	}
 
	function echoError($msg) {
		global $red;
		file_put_contents("php://stderr", cecho("ERROR: $msg\n", $red, true));
	}
 
	function dieHard($msg, $exit = 1) {
		global $red;
		file_put_contents("php://stderr", cecho("ERROR: $msg\n\n", $red, true));
		exit($exit);	
	}
 
	@unlink($cookie);
 
	if ($_SERVER["argv"][1] == "-h" || $_SERVER["argv"][1] == "--help") {
		echo "If no download link is supplied, the download list '$downloadList' will be processed.\n\n";
		die("Syntax: " . basename(__FILE__) . " [Download Link]\n\n");
	}
 
	if (!function_exists("curl_init"))
		dieHard("PHP cURL extension not found.");
 
	passthru('wget --version > /dev/null 2>&1', $errorCode);
	if ($errorCode > 0)
		dieHard("'wget' binary not found.");
 
	if (!$user || !$pass)
		dieHard("No username or password defined.");
 
	@chdir($downloadDir) or
		dieHard("Failed to change to download direcoty '$downloadDir'");
 
	if ($_SERVER["argc"] < 2) {
		// load download list
		$downloads = @file($downloadList) or
			dieHard("Could not open download list '$downloadList'");
	}
	else {
		// build download array
		for ($i = 1; $i < $_SERVER["argc"]; $i++) {
			$downloads[] = $_SERVER["argv"][$i];
		}
	}
 
	function setOptions($ch) {
		// Set (curl) options
		global $ua, $cookie;
		curl_setopt($ch, CURLOPT_USERAGENT, $ua);
		curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
		curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
		curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
		curl_setopt($ch, CURLOPT_AUTOREFERER, true);
		curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
		curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
		curl_setopt($ch, CURLOPT_FAILONERROR, true);
		curl_setopt($ch, CURLOPT_HEADER, false);
		curl_setopt($ch, CURLINFO_HEADER_OUT, true);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_ENCODING, "");
		curl_setopt($ch , CURLOPT_SSL_VERIFYPEER , true);
		curl_setopt($ch , CURLOPT_SSL_VERIFYHOST , 2);
		curl_setopt($ch , CURLOPT_TIMEOUT, 10);
	}
 
	function cURL($url) {
		global $ch;
		curl_setopt($ch, CURLOPT_URL, $url);
		return curl_exec($ch);
	}
 
	function login() {
		global $ch;
		global $user;
		global $pass;
		global $login;
		global $green;
		global $red;
 
		echo "Requesting authentication cookie.. ";
 
		$url = "https://www.share-online.biz/user/login";
		$credentials = "user=$user&pass=$pass";
		curl_setopt($ch, CURLOPT_POST, true);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $credentials);
		$html = cURL($url);
		if (!$html) {
			$curl_error_message = "\n\ncURL-Error: " . curl_error($ch) . "\n\n" . print_r(curl_getinfo($ch), true);
			dieHard($curl_error_message);
		}
		curl_setopt($ch, CURLOPT_POST, false);
 
		if (strpos($html, $user) === false) {
			echo "[ ";
			cecho("FAILED",$red);
			echo " ]\n\n";
			dieHard("Login failed. Check username and password.");
		}
		cecho("OK\n", $green);
		$login = true;
	}
 
	$ch = curl_init();
	setOptions($ch);
 
	foreach ($downloads as $download) {
		$download = trim($download);
		restart:
		if ((substr($download, 0 , 27) != "http://www.share-online.biz") && (substr($download, 0 , 23) != "http://share-online.biz")) {
			cecho("SKIP: No share-online link \"$download\"\n", $yellow);
			continue;
		}
		# URL VALID.
		# CHECK LINK
		$url = "http://api.share-online.biz/linkcheck.php?md5=1&links=" . urlencode($download);
		$html = cURL($url);
		if (!$html) {
			$curl_error_message = "\n\ncURL-Error: " . curl_error($ch) . "\n\n" . print_r(curl_getinfo($ch), true);
			dieHard($curl_error_message);
		}
 
		# http://www.share-online.biz/linkcheckapi
		list($id, $status, $name, $size, $md5) = explode(";", $html);
		$name = basename($name);
		$md5 = trim($md5);
		if ($status != "OK") {
			// file not available
			echoError("File $id not available");
			continue;
		}
 
		# CHECK IF FILE ALREADY DOWNLOADED
		if ($size == @filesize("./$name")) {
			cecho("INFO: File \"$name\" already downloaded.\n", $yellow);
			continue;
		}
 
		if(!$login)
			login();
 
		# GET DOWNLOAD URL
		$html = cURL($download);
		if (!$html) {
			$curl_error_message = "\n\ncURL-Error: " . curl_error($ch) . "\n\n" . print_r(curl_getinfo($ch), true);
			dieHard($curl_error_message);
		}
 
		$pat = ';var dl="(.+?)";s';
		if(!preg_match($pat, $html, $match))
			dieHard("preg_match failed. Could not find download link.");
 
		$dl = base64_decode($match[1]); # Download URL
		
		curl_close($ch); // save cookie for external usage
		$ch = curl_init();
		setOptions($ch);
 
		# Download file
		cecho("\nFile: $name\n", $yellow);
		passthru("wget -c -t 1 -O \"$name\" -U \"$ua\" --load-cookies \"$cookie\" '$dl'");
		echo "Validating file.. ";
		if (md5_file($name) != $md5) {
			cecho("FAILED\n\n", $red);
			$fail++;
			@unlink($name) or
				dieHard("Failed to remove invalid file. Exiting..");
			if ($fail > $maxFail) {
				curl_close($ch);
				@unlink($cookie);
				dieHard("Maximum fail count of $maxFail reached. Exiting..");
			}
			echoError("Invalid download detected. Restarting download in $failDelay seconds..");
			sleep($failDelay);
			goto restart;
		}
		cecho("OK\n\n", $green);
	}
	curl_close($ch);
	@unlink($cookie);
	echo ($fail) ? "\nWarnings: $fail" : "";
	echo "\nJob done.\n\n";