-
Уважаемый пользователь! Вы не представились системе! Для получения полного доступа к форуму войдите <ИЛИ> зарегистрируйтесь!
Спасибо.
-
База знаний:
Инклуды-
Стандартные функции PAWN
-
Версия: 0.3.7
-
Версия: 0.3e
-
Версия: 0.3d
-
Версия: 0.3c
-
Версия: 0.3b
-
Версия: 0.3a
-
Автовызываемые функции
-
-
Плагины и инклуды
-
Уроки
Войдите для возможности подписатьсяПодписчики 0Определение местоположения игрока по его IP (новая версия, 2018)
От DEST
Обсудить / получить поддержку
Итак, с версии 0.3b в SA-MP / CR-MP добавилась функция отправки HTTP-запросов на внешний сервер. Также, мы можем получать данные, которые вернул нам опрашиваемый сервер в ответ. Почитать информацию об использовании функции вы можете на странице: WIKI -> Стандартные функции PAWN -> 0.3b -> HTTP RU (русифицированный выпуск) (кликабельно)
Ну а здесь мы конкретно разберем функционал на примере.
Для осуществления наших замыслов потребуется:
1) Инклуд и плагин sscanf для обработки результатов.
2) Инклуд a_http (по умолчанию идет в комплекте).
3) Внимание и усердность.
Работает это все дело так: из pawn мы посылаем запрос на сервер, к php-скрипту. PHP скрипт в свою очередь делает запрос к другому сайту, который дает ответ в XML-формате. После, php-скрипт обрабатывает xml-структуру встроенным функционалом и возвращает съедобный для PAWN-код в формате:
Страна|Город|Область|Округ
Я думаю, что обрабатывать XML-структуру в коде PHP будет удобней и лучше, чем в PAWN. Да и к тому же, сайт, с которого берем информацию отдает ее в кодировке UTF-8 (юникод), а PAWN ее не воспринимает, поэтому вместо русских букв были бы квакозябрики.
В PAWN код будет чрезвычайно простым. Поэтому, тянуть не будем сразу к сути. Создаем новую функцию, для удобства в моде.
В конец мода:
forward GetPlayerIpInfo(playerid, ip[]); public GetPlayerIpInfo(playerid, ip[]) { new str[20]; // выделяем память для форматирования строки format(str, sizeof(str), "ip=%s", ip); // форматируем строку с данными для POST-запроса HTTP(playerid, HTTP_POST, "other.pawno-rus.ru/geobase.php", str, "OnGeoBase"); // в кавычках можете указать путь к своему PHP-скрипту для обработки в дальнейшем, ну а если своего веб-сервера нет, пользуйтесь нашим. return true; }
Далее, чуть ниже, вставляем обработчик результата:
forward OnGeoBase(index, response_code, data[]); public OnGeoBase(index, response_code, data[]) { new country[5], city[20], obl[40], district[80], str[sizeof(country)+sizeof(city)+sizeof(obl)+sizeof(district)+23+1]; // создаем переменные под страну, город, область, округ if(response_code != 200) return SendClientMessage(index, -1, "Возникла ошибка, попробуйте позднее!"); // если ответ от веб-сервера не 200 (OK) if(!strcmp(data, "fail", true)) return SendClientMessage(index, -1, "IP-адрес не европейский и не российский!"); sscanf(data, "p<|>s[5]s[20]s[40]s[80]", country, city, obl, district); // с помощью sscanf'a разделяем данные и записываем в раннее созданные переменные format(str, sizeof(str), "Страна: %s\nГород: %s\nОбласть: %s\nОкруг: %s", country, city, obl, district); // форматируем строку ShowPlayerDialog(index, 0, DIALOG_STYLE_MSGBOX, "{FFCC00}Информация об IP", str, "Ок", ""); // выводим диалог тому, кто запросил инфу return 1; }
Использовать по такому принципу:
new ip[16]; GetPlayerIp(playerid2, ip, 16); // получаем IP игрока, О КОТОРОМ будем запрашивать инфу GetPlayerIpInfo(playerid, ip); // здесь в качестве playerid указываем ИД игрока, КОТОРОМУ будем показывать инфу и IP адрес игрока, О КОТОРОМ запрашиваем инфу
PHP-скрипт
Так как форум посвящен по большей части PAWN, разъяснять работу PHP не буду. Можете его загрузить на свой веб ресурс и указывать в кавычках адрес к нему на своем хосте, или же пользоваться форумовским.
Спойлер<? header("Content-type: text/html; charset=windows-1251"); if(isset($_POST['ip'])) { $result = file_get_contents("http://ipgeobase.ru:7020/geo?ip=".$_POST['ip']); $xml = new SimpleXMLElement($result); if(strlen($xml->ip->message) <> 0) { echo 'fail'; exit; } echo $xml->ip->country."|"; echo iconv("UTF-8", "windows-1251", $xml->ip->city."|"); echo iconv("UTF-8", "windows-1251", $xml->ip->region."|"); echo iconv("UTF-8", "windows-1251", $xml->ip->district); } else { echo 'fail'; } ?>
Информация берется с сайта ipgeobase.ru, поэтому распознаются только европейские и российские IP.
Войдите для возможности подписатьсяПодписчики 0
-