View file webcopier/scan.php

File size: 7.15Kb
<?php
/*****************************************************************************/
/*   Скрипт PHP WebCopier версия 1.0 (04.05.2003)                            */
/*   Требования:                                                             */
/*   Платформа Unix, PHP 4.2.1 (Возможны версии ниже, но не ниже 4.0.2),     */
/*   mySQL и установленная библиотека CURL желательно версии 7.9.4 и выше.   */
/*   Лицензионное соглашение:                                                */
/*   Набор php скриптов в архиве phpwebcopier.1.0.tar.gz далее "скрипт".     */
/*   Скрипт является бесплатным, вы можете использовать его где угодно,      */
/*   бесплатно распостранять на любых носителях информации.                  */
/*   Вы не можете продавать или отдавать скрипт за какую нибудь оплату.      */
/*   Вы не можете давать скачивать скрипт со своих сайтов в сети интернет    */
/*   без разрешения автора. Вы не можете менять содержимое данного архива.   */
/*   За вред приченненный скриптом автор ответственности не несет.           */
/*   Автор: jeka! email: [email protected] url: http://phpscript.ru                */
/*   Информация:                                                             */
/*   Пишу скрипты практически любой сложности на заказ, цены от 5$ USA.      */
/*****************************************************************************/

@set_time_limit(3600);
require("url.php");
require("conf.php");

if (!function_exists('curl_init')) { die(); }

@mysql_connect($dbhost, $dbuser, $dbpassword) or die("Нет коннекта к базе данных\n");
@mysql_select_db($dbname) or die("Нет такой \"".$dbname."\" таблицы в базе данных\n");

	function Curl($url,$user_agent,$proxy=false,$cookie=false)
	{
		$ch = curl_init();
		if ($proxy != false) { curl_setopt($ch, CURLOPT_PROXY, $proxy); }
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
		curl_setopt($ch, CURLOPT_REFERER, 'http://www.rambler.ru/');
		curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
		curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
		if ($cookie != false) { curl_setopt($ch, CURLOPT_COOKIE, $cookie); }
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_NOBODY, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_TIMEOUT, 600);
		$result = curl_exec($ch);
		$info = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		curl_close($ch);
		if ($info != 200) return false;
		return $result;
	}

	function Write_File($content,$path)
	{
		$f = fopen($path,'wb');
		$fw = fwrite($f, $content, strlen($content));
		fclose($f);
		if ($fw == -1) return false;
		return $fw;
	}

	function kill_process($tablename)
	{
		$mod = time()-filemtime("./flag");
		if ($mod < 1800) { die(date('H-i')." Процесс занят ".$mod."секунд\n"); }
		@mysql_query("DELETE FROM ".$tablename." WHERE status='N' LIMIT 1;");
		unlink($path);
		die(date('H-i')." Убит зависший процесс\n");
	}

	function ren($url)
	{
		$tmp = @parse_url($url);
		$path = $tmp['path'].($tmp['query']?$tmp['query']:'');
		$path = str_replace("\\","_",$path);
		$path = str_replace("/","_",$path);
		if (empty($path)) $path = 'index.html';
		/* Если это раскомментировать, то имена файлов будут кодироваться в сумму md5
		if (preg_match("!((\.[a-z0-9]{2,5})+)$!i",$path,$out)) {
			$ext = $out[1];
			$path = md5($path).$ext;
		} else {
			$path = md5($path);
		}
		*/
		return $path;
	}

	function format_size($size)
	{
		if ($size / 1048576 > 1) { return round($size/1048576, 1).'Mb.'; }
		elseif ($size / 1024 > 1) { return round($size/1024, 1).'Kb.'; }
		else { return round($size, 1).'b.'; }
	}

if (!file_exists("./flag")) {
	touch("./flag");
	chmod("./flag", 0666);
}

$flag = fopen("./flag","r+");
flock($flag,6) or kill_process($tablename);

$info = mysql_fetch_assoc(mysql_query("SELECT starturl, cookie, proxy, type FROM ".$tablename."_info;"));

$count = array();
// Проверка домена
$host = $info['starturl'];
// Установка кукисов для авторизации
$cookie = $info['cookie']?$info['cookie']:false;
// Установка http прокси
$proxy = $info['proxy']?$info['proxy']:false;
// Узнаем режим работы
$type = $info['type']?$info['type']:1;

$sql = mysql_query("SELECT id, url, ren FROM ".$tablename." WHERE status='N' LIMIT 0, ".$limit.";");
if (!mysql_num_rows($sql)) die(date('H-i')." Нет больше файлов\n");

while ($row = mysql_fetch_assoc($sql)) {
	if (!$body = Curl($row['url'],$user_agent,$proxy,$cookie)) {
		@mysql_query("UPDATE ".$tablename." SET status='Y' WHERE id=".$row['id'].";");
		continue; // Если ошибка соединения, то выходим.
	}
	if ($type == 1) { // Копирование сайтов
		// парсим
		if (!preg_match("!(\.zip|\.rar|\.exe|\.tar|\.gz|\.bz|\.pdf|\.dll|\.cab|\.gif|\.bmp|\.jpg|\.swf)!i",$row['url']) && strlen($body) < 1048576) {
			if (preg_match_all("!<a[^>]*\shref=[\"']?([^>\"'#\s]+)[\"']?[^>]*>!is",$body,$link,PREG_SET_ORDER)) {
				foreach ($link as $url) {
					$all_path = parseurl($row['url'], str_replace("&amp;","&",$url[1]), 0);
					if (!stristr($all_path,$host)) continue; // Не загружаем документы с других доменов
					$rename = ren($all_path);
					$patern = str_replace($url[1],$rename,$url[0]);
					$body = str_replace($url[0],$patern,$body); // Заменяем старую ссылку на новую
					$newurl[$all_path] = $rename;
				}
			}
			// Парсим картинки, стили, бекгроунды, скрипты
			$images = array();
			$background = array();
			$style = array();
			$script = array();
			@preg_match_all("!<img[^>]*\ssrc=[\"']?([^>\"'#\s]+)[\"']?[^>]*>!is",$body,$images,PREG_SET_ORDER);
			@preg_match_all("!<[^>]*\sbackground=[\"']?([^>\"'#\s]+)[\"']?[^>]*>!is",$body,$background,PREG_SET_ORDER);
			@preg_match_all("!<link[^>]*\shref=[\"']?([^>\"'#\s]+)[\"']?[^>]*>!is",$body,$style,PREG_SET_ORDER);
			@preg_match_all("!<script[^>]*\ssrc=[\"']?([^>\"'#\s]+)[\"']?[^>]*>!is",$body,$script,PREG_SET_ORDER);
			$result = array_merge($images,$background,$style,$script);
			if (count($result)) {
				foreach ($result as $url) {
					$all_path = parseurl($row['url'], str_replace("&amp;","&",$url[1]), 0);
					if (!stristr($all_path,$host)) continue; // Не загружаем документы с других доменов
					$rename = ren($all_path);
					$patern = str_replace($url[1],$rename,$url[0]);
					$body = str_replace($url[0],$patern,$body); // Заменяем старую ссылку на новую
					$newurl[$all_path] = $rename;
				}
			}
			// Записываем результат в базу
			if (is_array($newurl)) {
				foreach ($newurl AS $key => $val) {
					@mysql_query("INSERT INTO ".$tablename." VALUES ('','".$key."','".$val."','','N');");
				}
			}
		}
		// парсим
		if (!file_exists($folder.$row['ren']) && strlen($body) < $maxsize) {
			if (!$bytes = Write_File($body,$folder.$row['ren'])) { echo date('H-i')." Файл ".$row['ren']." не записан!\n"; }
			$count[] = $bytes;
		}
	} else { // Загрузчик файлов
		if (!file_exists($folder.$row['ren'])) {
			if (!$bytes = Write_File($body,$folder.$row['ren'])) { echo date('H-i')." Файл ".$row['ren']." не записан!\n"; }
			$count[] = $bytes;
		}
	}
	@mysql_query("UPDATE ".$tablename." SET status='Y', size='".strlen($body)."' WHERE id=".$row['id'].";");
	unset($body);
	flush();
}

fputs($flag, time());
fclose($flag);
@mysql_close();
echo date('H-i')." Сохранено ".count($count)." файлов, объемом ".format_size(array_sum($count))."\n";
?>