<?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("&","&",$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("&","&",$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";
?>