ANTICHAT

ANTICHAT (https://forum.antichat.io/index.php)
-   PHP (https://forum.antichat.io/forumdisplay.php?f=37)
-   -   Получаем полную карту с maps сайта (https://forum.antichat.io/showthread.php?t=206339)

SleepShadowWeb 24.05.2010 05:29

Получаем полную карту с maps сайта
 
Задача:
получить изображение всей карты нужного масштаба с сайта 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, $i, 1);
        
        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_file) file_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($handle, 4096);
    }
    
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($im, 0, 0, "#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) * $h, 0, 0, $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
всё получилось, а дальше можно и в типографию отправлять...

phpdreamer 24.05.2010 10:46

зачем так извращаться?
есть же google API и Яндекс API

Komyak 24.05.2010 11:29

Цитата:

зачем так извращаться?
Тут самый финт- что можно сделать =)) А уж "законно" это больно легко. =))
Особенно вот это - memory_limit = 999999M; Понравилось =))

phpdreamer 24.05.2010 11:40

Цитата:

Сообщение от Komyak
Тут самый финт- что можно сделать =)) А уж "законно" это больно легко. =)

опасный нарушитель....


Время: 09:38