Получаем полную карту с maps сайта

Discussion in 'PHP' started by SleepShadowWeb, 24 May 2010.

  1. SleepShadowWeb

    Joined:
    2 Feb 2006
    Messages:
    26
    Likes Received:
    15
    Reputations:
    0
    Задача:
    получить изображение всей карты нужного масштаба с сайта www.map.bryandex.ru (берём масштаб = 4)

    Реализация:
    запускаем сайт в Mozilla Firefox и включаем Firebug, в панели "Сценарий" должно быть отмечено галочкой "Декомпилировать исходники eval"
    смотрим исходный код сайта, переходим на страницу, куда ведёт iframe.

    из анализа кода:
    36 - количество мини-картинок по ширине
    24 - количество мини-картинок по высоте
    256 - ширина и высота мини-картинки
    'map' + scale + '/' + getimg(i, j) + '.gif' - путь к нашим картинкам

    исходный, декомпилированный код функции getimg(i, j) находим в панели "Сценарий".

    поскольку используется прямой путь к файлу-изображению, а не через скрипт, то остаётся убедиться, что нет других препятствий.
    теперь проверим есть ли ограничения в файле .htaccess на использование картинок другими хостами - ограничений нет.
    (просто разместить html код у себя на сервере <img src='http://www.map.bryandex.ru/map4/AAGDCGAGCHI.gif'>)
    название картинки получаем с помощью Firebug.

    вся необходимая информация получена.

    Продолжаем:
    для начала скачаем все мини-картинки к себе. конвертируем функцию getimg из JavaScript в PHP.
    щедро раздаём каждой переменной по "баксу", и заменяем функции на аналоги.
    PHP:
    function getimg($y$x
    {
        
    $xx $x 648 130 $y;
        
    $yy $y 512 60 $x;
        
    $imgstr $yy "7" $xx;
        
    $imgstr1 "";
        
        for (
    $i 0$i strlen($imgstr); $i++) 
        {
            
    $char substr($imgstr$i1);
            
            switch (
    $char
            {
            case 
    "1":
                
    $imgstr1 .= "A";
            break;
            case 
    "2":
                
    $imgstr1 .= "B";
            break;
            case 
    "3":
                
    $imgstr1 .= "C";
            break;
            case 
    "4":
                
    $imgstr1 .= "D";
            break;
            case 
    "5":
                
    $imgstr1 .= "E";
            break;
            case 
    "6":
                
    $imgstr1 .= "F";
            break;
            case 
    "7":
                
    $imgstr1 .= "G";
            break;
            case 
    "8":
                
    $imgstr1 .= "H";
            break; 
            case 
    "9":
                
    $imgstr1 .= "I";
            break;
            case 
    "0":
                
    $imgstr1 .= "O";
            break;
            default:;
            }
        }
        return 
    $imgstr1;
    }
    кусочек по скачиванию картинок (вариант 1):
    производительно выгоднее чем "вариант 2", поскольку использует 'memory mapping'
    -------------------------------------------
    PHP:
    set_time_limit(0);

    for(
    $j 1$j <= 24$j++)
    for(
    $i 1$i <= 36$i++)
    {
        
    $name getimg($j$i).".gif";

        
    $data_file '';
        
    $data_file = @file_get_contents("http://www.map.bryandex.ru/map4/".$name); // файл с указанным именем может не существовать (добавил @)
        
    if($data_filefile_put_contents("pic/".$name$data_file);    // сохраняем с тем же именем к себе в папочку "pic"
    }

    кусочек по скачиванию картинок (вариант 2):
    -------------------------------------------
    PHP:
    set_time_limit(0);

    for(
    $j 1$j <= 24$j++)
    for(
    $i 1$i <= 36$i++)
    {
        
    $name getimg($j$i).".gif";

        
    $buffer "";

        
    $handle = @fopen("http://www.map.bryandex.ru/map4/".$name"rb");
        if(!
    $handle) continue;
        while (!
    feof($handle)) {
            
    $buffer .= fgets($handle4096);
        }
        
    fclose($handle);

        
    $handle fopen("pic/".$name"wb");
        
    fwrite($handle$buffer);
        
    fclose($handle);

    }

    картинки уже скачаны и находятся у нас в папочке "pic" (получилось 798 штук, занимают 4494 Кб).

    приступаем к склейке в одно большое изображение:
    PHP:
    set_time_limit(0); // не будем себя ограничивать по времени

    $w 256// ширина мини-картинки
    $h 256// высота мини-картинки

    $kol_w 36// количество мини-картинок по ширине
    $kol_h 24// количество мини-картинок по высоте

    $all_w $kol_w $w// подсчитываем ширину результирующего изображения
    $all_h $kol_h $h// подсчитываем высоту результирующего изображения

    $im imagecreatetruecolor($all_w$all_h); // создаём изображение нужных размеров

    imagefill($im00"#000000"); // заливаем созданное изображение чёрным цветом (это так - для кучи, т.к. при создании изображения строкой выше - оно и так чёрное)

    for($i 1$i <= $kol_h$i++)
    for(
    $j 1$j <= $kol_w$j++)
    {
        
    $name "pic/".getimg($i$j).".gif";
        
    // ещё на этапе скачивания файлов с сайта выяснилось, что не все они там есть (т.е. карта с "дырами"). вот и приходится это контролировать
        
    if(!is_file($name)) $name 'blank.gif'
        
    // если файл с нужным именем не существует, то заменяю его на собственную картинку (размером $W x $H px) с нарисованными диагоналями на однотонном фоне
        // как вариант можно и ничего в этом случае не делать, а просто пропустить выполнение следующих трёх строк, тогда пропущенный участок будет цветом фона
        
        
    @$im_1 imagecreatefromgif($name);
        
    imagecopyresampled($im$im_1, ($j 1) * $w, ($i 1) * $h00$w$h$w$h);
        
    imageDestroy($im_1);
    }

    imageJpeg($im'image_ready.jpg'); // записываем полученное изображение в файл
    imageDestroy($im);
    небольшой нюанс: всё это дело по созданию большой картинки занимает много памяти, вот поэтому нужно в файл php.ini внести некоторые коррективы.
    к примеру, вот так:
    memory_limit = 999999M;

    результатом всех этих действий получился файл-изображение "image_ready.jpg" весом 4524 Кб и габаритами 9216 х 6144 px
    всё получилось, а дальше можно и в типографию отправлять...
     
  2. phpdreamer

    phpdreamer Member

    Joined:
    26 Jul 2009
    Messages:
    522
    Likes Received:
    86
    Reputations:
    19
    зачем так извращаться?
    есть же google API и Яндекс API
     
  3. Komyak

    Komyak Banned

    Joined:
    14 Jan 2009
    Messages:
    197
    Likes Received:
    17
    Reputations:
    1
    Тут самый финт- что можно сделать =)) А уж "законно" это больно легко. =))
    Особенно вот это - memory_limit = 999999M; Понравилось =))
     
  4. phpdreamer

    phpdreamer Member

    Joined:
    26 Jul 2009
    Messages:
    522
    Likes Received:
    86
    Reputations:
    19
    опасный нарушитель....