include ("geoipcity.inc");
#!/bin/sh cd /tmp fetch ********** gunzip GeoLiteCity.dat.gz mv -f GeoLiteCity.dat /usr/local/share/GeoIP chmod 644 /usr/local/share/GeoIP/GeoLiteCity.dat
<?php error_reporting(1); //сообщаем, что на выходе будет нет текст, а графика header ("Content-type: image/png"); //подключаем внешнии скрипты include("icecast.class.php"); include ("geoipcity.inc"); //создаем клас к которому будем обращатся $icecast = new icecast(); //имя шрифта, надеюсь вы не забыли про него? $font="ft.ttf"; //список маунтов, которые чекаються $mount[]="radio"; $mount[]="music"; $mount[]="autorj"; //размер карты по ширине, т.к. мы работаем с координатами, то пропорции карты должны быть 360х180 //остальные параметры, зависащии от размеров, расчитываються $glob_x=900; $glob_y=$glob_x/2; $koeficent=$glob_x/360; //начинаем опрашивать маунта, ничто не мешает крутить по циклу и список серверов //думаю параметры (хост, логин и пароль админки вы уже увидели куда вбивать) for ($nom_mount=0;$nom_mount<count($mount);$nom_mount++) { $icecast->host = "127.0.0.1"; $icecast->port = 8000; $icecast->mount = $mount[$nom_mount]; $icecast->user = "admin"; $icecast->passwd = "hackme"; //запрашиваем нужные нам параметры if ($icecast->openstats()) { if ($icecast->GetStreamStatus()) { $listeners = $icecast->GetListeners(); //если массив списка слушателей получен, то сортируем его (сортировать не обязательно) if (is_array($listeners)) { sort($listeners); //обходим и записываем в массив IP адреса for ($i=0;$i<sizeof($listeners);$i++) { //массив $ip =) $ip[] = $listeners[$i]["ip"]; } } } } } //подключаемся к БД GeoIP $gil = geoip_open("/usr/local/share/GeoIP/GeoLiteCity.dat", GEOIP_STANDARD); $gif = geoip_open("/usr/local/share/GeoIP/GeoIPCity.dat", GEOIP_STANDARD); //создаем первый "нулевой" элемент массивов координат $array_coo[]="0,0"; $array_col[]=0; //счетчик всего слушателей $all=0; //максимальное количество слушателей на координату $maxal=0; //опять сортруем и начинаем переберать результат sort($ip); for ($z=0;$z<count($ip);$z++) { //сначало запрос к лайту, получаем координаты $geoip = GeoIP_record_by_addr($gil,$ip[$z]); //операция с коэфицентом карты (по отношению к 360) делаем чтоб в масиве у нас хранились округленные значения $ipx=round(($geoip->latitude)*$koeficent)/$koeficent; $ipy=round(($geoip->longitude)*$koeficent)/$koeficent; //на всякий пожарный ^_^ $ipx=$ipx*1; $ipy=$ipy*1; //если лайт база нам вернула не очень интересные данные, нулевые координаты, или же неизвестный кород, то координаты "фейковый" (с точности до страны) if ((($ipx==0) and ($ipy==0)) or (strlen($geoip->city)==0)) { //тогда делаем запрос к полной базе (не забыли ее найти?) $geoip = GeoIP_record_by_addr($gif,$ip[$z]); //к ней работаем так же как и с лайт $ipx=round(($geoip->latitude)*$koeficent)/$koeficent; $ipy=round(($geoip->longitude)*$koeficent)/$koeficent; $ipx=$ipx*1; $ipy=$ipy*1; } //причем в массиве храним строку с долготой и широтой сразу, через запятую $coord=$ipx.",".$ipy; //ищем полученную координату в массиве координат, зачем нам создавать новый элемент, если с такими координатами уже есть $pnom=array_search($coord,$array_coo); if ($pnom==FALSE) { //не нашли, тогда создаем $array_coo[]=$coord; $array_col[]=1; if ($maxal<1) {$maxal=1;} } else { //нашли, тоже отлично, увеличиваем кол-во слушателей в этой точке $array_col[$pnom]++; //заодно проверяем это максимум тут или как if ($maxal<$array_col[$pnom]) {$maxal=$array_col[$pnom];} } $all++; } //закрываем базы GeoIP дабы они нам более не требуються geoip_close($gil); geoip_close($gif); //создаем png для работы из нашей карты $img=imagecreatefrompng("map.png"); //выбираем цвет чернил, которыми будем рисовать $ink = imagecolorallocate($img, 0, 0, 0); //и перебираем массив координат for ($i=0;$i<count($array_coo);$i++) { //если в координате 0 слушателей, то не обрабатываем if ($array_col[$i]!=0) { //узнаем размер кружка //у меня тут по хитрому, все кружки пропорциональны относительно самого большого //кому не нравиться данная идея, используйте свой принцып //$kolb это диаметр кружка //для более гармоничного круга диаметр делайте кратным двум $kolb=round($array_col[$i]*10/$maxal)*2+1; //теперь нам больше не нужна запятая в координатах, разбираем на два элемента (широта и долгота) $arc=split(",",$array_coo[$i]); //соотвественно полученные координаты умножаем на коофицент, для более гармоничного рамположения на карте $arc[0]=$arc[0]*$koeficent; $arc[1]=$arc[1]*$koeficent; //т.к. 0 на графике в левов верхнем, то творим еще и такие подсчеты $smesh_x=$glob_x/2; $smesh_y=$glob_y/2; //рисуем таки кружок IMG_ARC_PIE - значит, что будет заливка imagefilledarc($img,$smesh_x+$arc[1],$smesh_y-$arc[0],$kolb,$kolb,0,360,$ink,IMG_ARC_PIE); } } //рисуем всякие надписи imagettftext($img,8,0,20,20,$ink,$font,"Special 4 radiotalk"); imagettftext($img,8,0,20,36,$ink,$font,"GeoIP"); imagettftext($img,8,0,20,52,$ink,$font,"listeners: ".$all); //у меня сервер по гринвичу. А у вас? $dat=date("n/j/24y g:ia",time()+14400); $mr=imagettfbbox (8,0, $font, $dat); imagettftext($img,8,0,$glob_x-20-$mr[2],22,$ink,$font,$dat); //черестрочный формат, не помешает imageInterlace($img, 1); //отдаем пользователю imagepng($img); //уничтожаем следы жизнидеятельности imagedestroy($img); ?>