Всезнающий юзербар

Возможно Вам не раз приходилось выдеть в подписях некоторых пользователей форумов картинки вида:
undefined
undefined
undefined
Они Вам и Ваш IP покажут, и страну вместе с городом (на основе того же IP), и ОС вместе с браузером (иногда даже могут версии показать). Самые «всевидящие» могут указать Вашего провайдера. Любители точности могут Ваши географические координаты показать.

Мне долгое время было просто интересно, как оно такое возможно?:) Когда я узнал общие принципы (которыми поделюсь с Вами), то решил сделать что нибуть свое из этой серии.

Итак, что нам надо:

  1. Хост с поддержкой PHP (про бесплатный и не думаем).
  2. Знания того же PHP.
  3. Немного уметь пользоваться графическими редакторами.
  4. Терпение, время, прямые руки, светлая голова и т.д.

1. Хост. Где его брать. Та где угодно. Гугл по запросу «хостинг» выдает вот что — [тыц].
2. Знания PHP нужны для того, что бы сделать что нибуть свое, а не просто запустить тот пример, который я приведу.
3. Нарисовать какую нибуть креативную подложку для юзербара.
4. Без этого вообще никак.

Перейдем к практической части:
Хост у нас уже есть. Знания какие то тоже есть. В photoshop’е работать умеем. Как подложку в ЮБ я возьму:
undefined
Как пользоваться Photoshop’ом написано тут и тут.

Как бы задача не выглядела страшно, достаточно помнить, что для любой задачи в гугле можно найти минимум половину решения с исходным кодом (в нашем случае — 2/3).
Во вложении (которое в конце сообщения) находятся файлы скрипта и шрифты. После скачивания разархивируем все в папку netGeo (имя можно и свое задать). ТО есть наш путь до ЮБ будет «хост/netGeo/». Теперь в папке netGeo создаем папку libs.
Теперь очень неприятный момент. Надо загрузить базу городов и стран. Что неприятного? Размер ~30Мб. Качать тут и тут. Заливаем все в папку libs. Данные файлы на оф. сервере обновляются раз в месяц (первого числа). Иногда надо свои базы обновлять и Вам.

Теперь пройдемся по скриптам.
Лирическое отступление: файл getrealip.php. Спасибо S(r1pt’у за предоставленную функцию.
geoip.inc.php, geoipcity.inc.php, geoipregionvars.php — файлы, в которых Вам лучше ничего не менять (отвечают за получение данных про страну, город и т.д.)
getosandbrowser.php — функции для получения браузера и ОС пользователя (основываются на $_SERVER[‘HTTP_USER_AGENT’]). Код функций интуитивно понятен.
index.php — отвечает за генерацию изображения. Его и разберем до самых косточек.

require_once ("geoipcity.inc.php");
require_once ("geoipregionvars.php");
require_once ("getrealip.php");
require_once ("getosandbrowser.php");

Подключение файлов с нашими (и не нашими) функциями.

$gi = geoip_open("libs/GeoLiteCity.dat" , GEOIP_MEMORY_CACHE); 

Загрузка базы городов.

$IP = func_getIP();

Узнаем IP пользователя (еще раз спасибо S(r1pt).

$record = geoip_record_by_addr($gi,$IP);

Самая важная строчка:) Получение данных о географии пользователя.
$record — объект класса geoiprecord с полями

[country_code] — код страны (UA)
[country_code3] — тоже код страны, но трехбуквенный (UKR)
[country_name] — название страны (Ukraine)
[region] — идентификатор региона (13)
[city] — город
[postal_code] — почтовый код
[latitude] — широта
[longitude] — долгота
[area_code] — какой то код
[dma_code] — какой то код 2
[metro_code] — какой то код 3
[continent_code] — обозначение континента (EU)

geoip_close($gi);

«Подчищаем» за собой. Освобождение памяти, занимаемой базой.
«Официальная» часть на этот закончена. Данные получены. Теперь надо с ними что то сделать. А точнее как то подать пользователю. В папке images есть несколько подложек под ЮБ, которые отличаются только цветом.

if (isset($_GET['color'])) {
	switch ($_GET['color']) {
		case 1: {
			$img = imagecreatefromjpeg("images/background.jpg");
			break;
		}
		case 2: {
			$img = imagecreatefromjpeg("images/background_brown.jpg");
			break;
		}
		case 3: {
			$img = imagecreatefromjpeg("images/background_cyan.jpg");
			break;
		}
		case 4: {
			$img = imagecreatefromjpeg("images/background_green.jpg");
			break;
		}
		case 5: {
			$img = imagecreatefromjpeg("images/background_red.jpg");
			break;
		}
		default: {
			$img = imagecreatefromjpeg("images/background.jpg");
			break;
		}
	}
}
else {
	$img = imagecreatefromjpeg("images/background.jpg");
}

Этот фрагмент и отвечает за то, какую подложку взять. Если через в $_GET есть элемент с именем color, то тогда проверятеся его значение и на основе него и берется фон. Если элемента color нет, то берется фон по умолчанию (синий).

$font = dirname(__FILE__)."/fonts/lucon.ttf";
$fontSize = 7;

Определение шрифта для текста (и его размера). Важно учесть, что путь к шрифту должен быть АБСОЛЮТНЫМ!

$r = 255;
$g = 255;
$b = 255;
$color = imagecolorallocate ($img, $r, $g, $b);

Настройки цвета (мы определяем белый цвет для изображения с идентификатором $img[был определен ранее]).

Теперь надо определить, что мы будем выводить пользователю. Я выбрал IP, страну, город, OS и браузер. Рекомендую заранее в Photoshop’е прикинуть что и где будет на картинке и какие отступы лучше сделать.

$margin_top = 9;
$margin_left = 3;
imagefttext ($img, $fontSize, 0, $margin_left, $margin_top, $color, $font, "IP: ".$IP);
$margin_top = 18;
$margin_left = 3;
imagefttext ($img, $fontSize, 0, $margin_left, $margin_top, $color, $font, "Country: ".$record->country_name);
$margin_top = 27;
$margin_left = 3;
imagefttext ($img, $fontSize, 0, $margin_left, $margin_top, $color, $font, "City: ".$record->city);
$margin_top = 9;
$margin_left = 160;
imagefttext ($img, $fontSize, 0, $margin_left, $margin_top, $color, $font, "OS: ".getOS());
$margin_top = 18;
$margin_left = 160;
imagefttext ($img, $fontSize, 0, $margin_left, $margin_top, $color, $font, "Browser: ".getBrowser());

$margin_top — задает отступ сверху для каждой строки.
$margin_left — тоже самое но слева.
Чуть подробнее про параметры функции imagefttext().
1 — идентификатор изображения.
2 — размер шрифта (в пикселях).
3 — угол наклона надписи (0 — горизонтально, 90 — вертикально).
4 — отступ слева.
5 — отступ сверху.
6 — идентификатор цвета (ВАЖНО! Если поставить не «$color?», a «-$color» [без кавычек], то текст будет выводиться без сглаживания).
7 — идентификатор шрифта.
8 — текст, который мы хотим видеть на картинке.

header("Content-Type: image/jpeg");
imagejpeg($img,"",100);
imagedestroy($img);

Надо указать браузеру, что мы хотим вывести. Для этого и передаем соответствующий заголовок. Далее с помощью imagejpeg передаем создаем изображение (параметры: 1 — идентификатор изображения, 2 — путь, куда сохраним на сервере[если пусто, то никуда не сохраняем], 3 — качество изображения[0-100]).
Ну и в самом конце снова подчищаем за собой при помощи функции imagedestroy. Как параметр передаем ей идентификатор нашего изображения.

Вот и все.
Примеры работы скрипта:

Скачать файлы

, , , , ,

3 комментария
  1. Гость сказал(а):

    ссылка на файлы не рабочая

  2. KronuS сказал(а):

    Спасибр за замечание. Обновили файлы.

  3. Гость сказал(а):

    Благодарствую =)) Буду Экспериментировать…

Оставить комментарий

Top ↑ | Main page | Back