Определение поискового робота по User-Agent на PHP. Определение поискового робота по User-Agent на PHP Дополнительные заголовки

Для начала, определим, откуда можно узнать что-то о посетителе вашего сайта? Дело в том, что при соединении с сервером, браузер посылает много информации о себе в заголовках. Промежуточные компьютеры между вашим, и конечным сервером, могут дописывать свои заголовки. В результате, до вашего скрипта доходит солидное количество информации о вас и о том, как вы получили доступ к сайту.

Как же изъять эти данные, чтобы знать о своих посетителях больше? Я хочу рассмотреть решение этой проблемы на языках Perl и php. Для начала, рассмотрим их на Perl. Нетерпеливые php-шники, вам тоже будет полезно почитать эту часть статьи. Хотя, если вам нужно решение, и побыстрее, то переходите к вашей части.

Получение данных о посетителе на Perl

Итак, начнем. Сервер получил заголовки, которые пришли к нему, вместе с клиентским запросом. Куда же он их девает? Как получить к ним доступ? Все просто. Эти данные сервер хранит в своих переменных, которые называются "переменные окружения". В Perl, доступ к ним осуществляется через хэш %ENV, ключами которого являются имена заголовков, а значениями — переданные данные.

Чтобы посмотреть все переменные окружения, достаточно выполнить простой идеоматический код:

print "$_ = $ENV{$_}
" foreach(keys %ENV);

Какие из этих переменных будут нам полезны? В принципе, вы можете собирать хоть все. Но разумнее было бы собирать лишь то, что нужно. Предлагаю собирать это:

$ip = $ENV{REMOTE_ADDR}; #IP-адрес вашего посетителя
#адрес страницы, на которой посетитель щелкнул по ссылке, ведущей на ваш сайт
#если он перешел на ваш сайт из закладок, или набрав адрес в адресной строке
#значение этой переменной, будет пустым
#если был переход с поисковой системы, эта переменная будет содержать поисковый запрос

$referer = $ENV{HTTP_REFERER};
$client = $ENV{HTTP_USER_AGENT}; #название браузера вашего посетителя.
#адрес страницы, на которую пришел ваш посетитель
#вы можете узнать на какие страницы вашего сайта приходят чаще
$page = $ENV{REQUEST_URI};

Вот так. Пользуйтесь)

Получение данных о посетителе на PHP

В php, дело обстоит похожим образом. Здесь тоже присутствует структура, хранящая данные о переменных окружения. Это ассоциативный массив $_SERVER.

Получим те же данные, но средствами php.

$ip = $_SERVER["REMOTE_ADDR"];
$referer = $_SERVER["HTTP_REFERER"];
$client = $_SERVER["HTTP_USER_AGENT"];
$page = $_SERVER;

Выведем все данные:

foreach($_SERVER as $k=>$v) {print("$k = $v
")}

Дополнительные заголовки. Прокси-серверы.

Некоторые пользователи сидят в интернете через прокси-серверы. В этом случае, неплохо было бы получить еще адрес прокси-сервера. Хорошие прокси посылают данные об IP своего клиента. Есть анонимные прокси, которые вырезают эту информацию из заголовков. В этом случае, получится узнать только адрес самого прокси-сервера.

HTTP_X_FORWARDED_FOR — ip-адрес пользователя, предоставляемый прокси-сервером
HTTP_VIA — имя прокси-сервера
REMOTE_ADDR — ip-адрес самого прокси-сервера

Получить информацию о пользователе, по его IP. Служба WHOIS.

Мы получили ip пользователя. И что с того? Эта информация нам ни о чем не говорит. Как же получить информацию о пользователе, если у нас есть его ip?

Можно воспользоваться службой whois . Вводим ip-адрес и получаем кучку информации. Мы можем узнать город, в котором живет обладатель этого ip, адреса. Иногда, даже точный адрес и e-mail! Мы, почти наверняка, узнаем провайдера обладателя этого IP.

Служба whois хранит и предоставляет информацию, в нестандартизированном формате. Это значит, что разные службы могут предоставлять несколько разную информацию.

Большой брат следит за тобой!

Прежде, чем начинать следить за всеми перемещениями пользователей по вашему сайту, вгоняя их в паранойю, подумайте, а что бы вы хотели знать о своих пользователях? Нужна ли вам информация о том, какие страницы сайта они посещали? Готовы ли вы пожертвовать серверной мощностью и пространством для хранения этих данных, ради того, чтобы собрать полную статистику?

Лично я, на этом сайте, использую систему сбора статистики. Она нужна только для того, чтобы узнавать откуда ко мне приходили посетители, какие поисковые запросы они вбивали. Поэтому, я записываю только тех посетителей, чей referer не пуст и не содержит адрес этого сайта.

Я могу оценивать, какие темы интересны людям, а какие — не очень. Скажем, регулярно заходят с гугла и яндекса. Значит, эта информация нужна людям. Проанализировав запросы, по которым заходят на эту статью, я понял, что не совсем удовлетворяю ожиданиям пользователей. Это заставило меня дописать несколько строк к статье, что придало ей законченности. Теперь пользователи уходят довольными.

Используйте слежку за пользователем с умом! Пусть полученные данные ведут к улучшению ресурса. Доброй охоты!

Если вам понравилась статья, можете подписаться на RSS этого блога и всегда быть в курсе обновлений. А еще, вы можете подписаться на рассылку новостей блога по почте.

человек со стажем 10 ноября 2013 в 13:29

Статистика посещений сайта без сторонних сервисов

  • Разработка веб-сайтов

Доброго времени суток! Я думаю, все ещё помнят, как недавно после небольших сбоев на серверах Google, многие сайты тоже давали сбои.
На самом деле, такая ситуация может случится с любым сервисом в интернете, поэтому лучше лишний раз перестраховаться.
Для многих организаций, статистика посещаемости сайта влияет на работу маркетологов, которые определяют, в каких городах больше спрос на продукцию и т.д. Но а что, если сервис статистики, который используется на сайте, временно даст сбой?

Есть решение: использовать вместе со сторонними сервисами свой скрипт учёта посещений сайта.

Наш скрипт будет состоять из трёх файлов:

  • stat.php - инклудится в каждую страницу, за которой необходимо следить
  • stat.log - файл, в который будет записываться история посещений
  • seestats.php - файл, для просмотра статистики
На самом деле, можно использовать любые имена файлов.

Файл stat.php
$col_zap) array_shift($lines); $lines = $date."|".$bot."|".$ip."|".$home."|\r\n"; file_put_contents($file, $lines); ?>

Что бы каждый раз вручную не копать файл stat.log, создадим файл для вывода статистики посещений сайта:
Файл seestats.php

sizeof($file)) { $col=sizeof($file); } echo "Последние ".$col." посещений сайта:"; ?> sizeof($file)-$col; $si--) { $string=explode("|",$file[$si]); $q1[$si]=$string; // дата и время $q2[$si]=$string; // имя бота $q3[$si]=$string; // ip бота $q4[$si]=$string; // адрес посещения echo ""; echo ""; echo ""; echo ""; } echo "
Время и дата Данные о посетителе IP/прокси Посещенный URL
".$q1[$si]."".$q2[$si]."".$q3[$si]."".$q4[$si]."
"; echo "
Просмотреть последние 100 500"; echo "1000 посещений."; echo "
Просмотреть все посещения.
"; echo ""; ?>

Вот и всё! Теперь даже при падении liveinternet или Яндекс.Метрики, Вы всегда сможете узнать, кто заходил к Вам на сайт!

Теги: php, статистика, скрипт

В этой статье рассмотрим 2 скрипта Счётчик посетителей на php предназначенных для подсчета количества посетителей вашего сайта, один из которых взаимодействует с Базой Данных MySQL, а второй просто записывает данные об посетителях онлайн в текстовый файл и берёт информацию оттуда, то есть без базы данных.

Скрипты очень просты в установке и давайте разберём каждый из них по отдельности.

Счётчик посетителей на php с базой данных MySQL

Первый скрипт сам создаст таблицы для Базы MySQL (если вы этого не сделали сами) и состоит из одного основного класса (файла), который сохраняет все данные в базе и выводит на страницы следующее:

Параметры вывода

  • Сколько посетителей на данный момент в онлайн;
  • Какое число посетителей посмотрело данную страницу за сегодняшний день;
  • Сколько уникальных посетителей пришло на ваш сайт за сутки;
  • Количество посетителей за всё время;
  • IP адрес для каждого посетителя;
  • Реальное время и дата.

В скачанном архиве у вас будет, как я и писал выше, один всего файл smart_counter.class.php с основным классом, и его вам необходимо залить этот файл на хостинг в главную директорию.

$this->db_server = "localhost"; // Имя вашего Хоста $this->db_username = "root"; // Логин от Базы данных $this->db_password = "1234"; // Пароль от Базы данных $this->db_name = "name_bd"; // Имя базы данных

И последний шаг для установки счётчика посетителей:
в том месте на вашей странице, где вы планируете разместить показ счётчика посетителей, пропишите этот код.

inc_interval = 86400; $sc->db_server = "localhost"; // Имя вашего Хоста $sc->db_username = "root"; // Логин от Базы данных $sc->db_password = "1234"; // Пароль от Базы данных $sc->db_name = "name_bd"; // Имя базы данных $sc->db_main_table = "sc_main"; $sc->db_users_table = "sc_users"; $sc->update_counter(); echo sprintf("Total visits: %d
", $sc->get_total_visits()); echo sprintf("Visits on this page: %d
", $sc->get_page_visits()); echo sprintf("Today visits: %d
", $sc->get_today_visits()); echo sprintf("Online users: %d

", $sc->get_active_visits(300)); $lv = $sc->get_latest_visitors(); foreach ($lv as $ip=>$info) { echo $ip . " "; echo $info["host"] . " "; echo date("F j, Y ", $info["time"]) . " "; echo $info["location"] . "

"; } ?>

Не забудьте так же изменить на свои данные от Базы в этом коде.

Скрипт посетители онлайн без MySQL

PHP скрипт - посетители Онлайн отличается от предыдущего только тем, что он не использует Базу данных, а работает с текстовыми файлами, и при этом практически не создаёт нагрузку на ваш сервер. Он так же использует один PHP класс, который одновременно и записывает, и удаляет данные из этих файлов, и выводит нужную информацию о посетителях вашего сайта.

Данный скрипт выводит следующую информацию о посетителях на сайте:

Данные о посетителях

  • Сколько Хостов всего;
  • Сколько Хостов за сегодня;
  • Сколько Хитов всего;
  • Сколько Хитов за сегодня;
  • Сколько посетителей было всего;
  • Сколько посетителей Онлайн на данный момент.

geolocation country-codes (17)

Я хочу получить страну посетителя через свой IP ... Сейчас я использую это (http://api.hostip.info/country.php?ip= ......)

Вот мой код:

Ну, это работает нормально, но дело в том, что это возвращает код страны, например, США или CA., а не все название страны, например, Соединенные Штаты или Канада.

Итак, есть ли хорошая альтернатива hostip.info?

Я знаю, что могу просто написать код, который в конечном итоге превратит эти две буквы в название всей страны, но я просто слишком ленив, чтобы написать код, содержащий все страны...

PS: По какой-то причине я не хочу использовать готовый CSV-файл или любой код, который захватит эту информацию для меня, что-то вроде ip2country готового кода и CSV.

Answers

Я использую ipinfodb.com api и получаю именно то, что вы ищете.

Его совершенно бесплатно, вам просто нужно зарегистрироваться у них, чтобы получить свой ключ api. Вы можете включить их php-класс, загрузив их со своего веб-сайта, или вы можете использовать формат url для извлечения информации.

Вот что я делаю:

Я включил их php-класс в свой скрипт и используя приведенный ниже код:

$ipLite = new ip2location_lite; $ipLite->setKey("your_api_key"); if(!$_COOKIE["visitorCity"]){ //I am using cookie to store information $visitorCity = $ipLite->getCity($_SERVER["REMOTE_ADDR"]); if ($visitorCity["statusCode"] == "OK") { $data = base64_encode(serialize($visitorCity)); setcookie("visitorCity", $data, time()+3600*24*7); //set cookie for 1 week } } $visitorCity = unserialize(base64_decode($_COOKIE["visitorCity"])); echo $visitorCity["countryName"]." Region".$visitorCity["regionName"];

$json = file_get_contents("http://freegeoip.appspot.com/json/66.102.13.106"); $expression = json_decode($json); print_r($expression);

У меня есть короткий ответ на этот вопрос, который я использовал в проекте. В моем ответе я считаю, что у вас есть IP-адрес посетителя

$ip = "202.142.178.220"; $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip)); //get ISO2 country code if(property_exists($ipdat, "geoplugin_countryCode")) { echo $ipdat->geoplugin_countryCode; } //get country full name if(property_exists($ipdat, "geoplugin_countryName")) { echo $ipdat->geoplugin_countryName; }

Я попробовал ответить Chandra, но моя конфигурация сервера не позволяет file_get_contents ()

PHP Warning: file_get_contents() URL file-access is disabled in the server configuration

Я изменил код Chandra, чтобы он также работал на таких серверах, используя cURL:

Function ip_visitor_country() { $client = @$_SERVER["HTTP_CLIENT_IP"]; $forward = @$_SERVER["HTTP_X_FORWARDED_FOR"]; $remote = $_SERVER["REMOTE_ADDR"]; $country = "Unknown"; if(filter_var($client, FILTER_VALIDATE_IP)) { $ip = $client; } elseif(filter_var($forward, FILTER_VALIDATE_IP)) { $ip = $forward; } else { $ip = $remote; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.geoplugin.net/json.gp?ip=".$ip); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $ip_data_in = curl_exec($ch); // string curl_close($ch); $ip_data = json_decode($ip_data_in,true); $ip_data = str_replace(""", """, $ip_data); // for PHP 5.2 see .com/questions/3110487/ if($ip_data && $ip_data["geoplugin_countryName"] != null) { $country = $ip_data["geoplugin_countryName"]; } return "IP: ".$ip." # Country: ".$country; } echo ip_visitor_country(); // output Coutry name ?>

Надеюсь, это поможет;-)

Вы можете использовать простой API от http://www.geoplugin.net/

$xml = simplexml_load_file("http://www.geoplugin.net/xml.gp?ip=".getRealIpAddr()); echo $xml->geoplugin_countryName ; echo "

";
foreach ($xml as $key => $value)
{
 echo $key , "= " , $value , " \n" ;
}
echo "
";

Используемая функция

Function getRealIpAddr() { if (!empty($_SERVER["HTTP_CLIENT_IP"])) //check ip from share internet { $ip=$_SERVER["HTTP_CLIENT_IP"]; } elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) //to check ip is pass from proxy { $ip=$_SERVER["HTTP_X_FORWARDED_FOR"]; } else { $ip=$_SERVER["REMOTE_ADDR"]; } return $ip; }

United States geoplugin_city= San Antonio geoplugin_region= TX geoplugin_areaCode= 210 geoplugin_dmaCode= 641 geoplugin_countryCode= US geoplugin_countryName= United States geoplugin_continentCode= NA geoplugin_latitude= 29.488899230957 geoplugin_longitude= -98.398696899414 geoplugin_regionCode= TX geoplugin_regionName= Texas geoplugin_currencyCode= USD geoplugin_currencySymbol= $ geoplugin_currencyConverter= 1

У вас есть так много вариантов, с которыми вы можете

благодаря

Попробуйте этот простой код с одной строкой, вы получите страну и город посетителей со своего IP-адреса.

$tags = get_meta_tags("http://www.geobytes.com/IpLocator.htm?GetLocation&template=php3.txt&IpAddress=" . $_SERVER["REMOTE_ADDR"]); echo $tags["country"]; echo $tags["city"];

Много разных способов сделать это...

Решение №1:

Одна сторонняя служба, которую вы можете использовать, - http://ipinfodb.com . Они предоставляют имя хоста, геолокацию и дополнительную информацию.

Зарегистрируйтесь для ключа API здесь: http://ipinfodb.com/register.php . Это позволит вам получать результаты со своего сервера, без этого он не будет работать.

Скопируйте и пропустите следующий код PHP:

$ipaddress = $_SERVER["REMOTE_ADDR"]; $api_key = "YOUR_API_KEY_HERE"; $data = file_get_contents("http://api.ipinfodb.com/v3/ip-city/?key=$api_key&ip=$ipaddress&format=json"); $data = json_decode($data); $country = $data["Country"];

Даунсайд:

Цитата из их сайта:

Наш бесплатный API использует версию IP2Location Lite, которая обеспечивает более низкую точность.

Решение №2:

Эта функция вернет название страны, используя службу http://www.netip.de/ .

$ipaddress = $_SERVER["REMOTE_ADDR"]; function geoCheckIP($ip) { _get_contents("http://www.netip.de/search?query=".$ip); $patterns=array(); $patterns["country"] = "#Country: (.*?) #i"; $ipInfo=array(); foreach ($patterns as $key => $pattern) { $ipInfo[$key] = preg_match($pattern,$response,$value) && !empty($value) ? $value : "not found"; } return $ipInfo; } print_r(geoCheckIP($ipaddress));

Вывод:

Array ( => DE - Germany) // Full Country Name

Проверьте php-ip-2-country из code.google. База данных, которую они предоставляют, обновляется ежедневно, поэтому нет необходимости подключаться к внешнему серверу для проверки, если вы размещаете свой собственный SQL-сервер. Поэтому, используя код, вам нужно будет только ввести:

"localhost", //example host name "port" => 3306, //3306 -default mysql port number "dbName" => "ip_to_country", //example db name "dbUserName" => "ip_to_country", //example user name "dbUserPassword" => "QrDB9Y8CKMdLDH8Q", //example user password "tableName" => "ip_to_country", //example table name); $phpIp2Country = new phpIp2Country($ip,$dbConfigArray); $country = $phpIp2Country->getInfo(IP_COUNTRY_NAME); echo $country; ?>

Пример кода (из ресурса)

"localhost", //example host name "port" => 3306, //3306 -default mysql port number "dbName" => "ip_to_country", //example db name "dbUserName" => "ip_to_country", //example user name "dbUserPassword" => "QrDB9Y8CKMdLDH8Q", //example user password "tableName" => "ip_to_country", //example table name); $phpIp2Country = new phpIp2Country("213.180.138.148",$dbConfigArray); print_r($phpIp2Country->getInfo(IP_INFO)); ?>

Вывод

Array ( => 3585376256 => 3585384447 => RIPE => 948758400 => PL => POL => POLAND => 213.180.138.148 => 3585378964 => 127.255.255.255 => 127.255.255.255)

Вы можете использовать веб-сервис с сайта http://ip-api.com
в вашем php-коде, выполните следующие действия:

запрос имеет много другой информации:

Array ("status" => "success", "country" => "COUNTRY", "countryCode" => "COUNTRY CODE", "region" => "REGION CODE", "regionName" => "REGION NAME", "city" => "CITY", "zip" => ZIP CODE, "lat" => LATITUDE, "lon" => LONGITUDE, "timezone" => "TIME ZONE", "isp" => "ISP NAME", "org" => "ORGANIZATION NAME", "as" => "AS NUMBER / NAME", "query" => "IP ADDRESS USED FOR QUERY",)

вы можете использовать http://ipinfo.io/ чтобы получить информацию об ip-адресе. Его простота использования.

city; echo "
".$details->country; echo "
".$details->org; echo "
".$details->hostname; / ?>

Выполнение функций по умолчанию

I) $Array = array("test1","test2","test3","test3"); unset($Array); ii) $Array = array("test1","test2","test3","test3"); array_pop($Array); iii) $Array = array("test1","test2","test3","test3"); array_splice($Array,1,2); iv) $Array = array("test1","test2","test3","test3"); array_shift($Array);


Часто на сайтах можно видите фразу, сейчас данный сайт просматривает столько-то человек, или даже список зарегистрированных посетителей, находящихся в данным момент на сайте. Обычно такой сервис называют "Список посетителей OnLine". Учитывая, что у посетителя может динамически меняться IP-адрес, или наоборот несколько посетителей могут выходить в Интернет из под одного IP-адреса, для подсчёта уникальных посетителей на сайте прибегают к сессиям. Создадим таблицу session в которой будем хранить уникальные идентификаторы сессии (SID), назначенные посетителям.

Таблица session

CREATE TABLE session (id_session tinytext NOT NULL, putdate datetime NOT NULL default "0000-00-00 00:00:00", user tinytext NOT NULL) TYPE=MyISAM;

Таблица имеет три поля - id_session, поле, куда помещается SID сессии, поле putdate, для того, хранения времени обращения посетителя к страницам сайта и поле user, которое нами использоваться не будет, но в котором можно хранить имя пользователя, если у вас имеется система авторизации и вы хотите различать гостей и авторизованных пользователей. Предполагается, что имя пользователя помещается в элемент суперглобального массива $_SESSION["user"] - если вас интересует авторизация на PHP, с нейм можно ознакомиться по

В начало каждой страницы сайта, которая будет участвовать в регистрации посетителей следует при помощи конструкции поместить следующий код.

Скрипт регистрации посетителей в таблице session

// Начинаем сессию session_start (); // Получаем уникальный id сессии $id_session = session_id (); include "config.php" ; // Проверяем, присутствует ли такой id в базе данных $query = "SELECT * FROM session WHERE id_session = " $id_session "" ; $ses = mysql_query ($query ); if(! $ses ) exit("" ); // Если сессия с таким номером уже существует, // значит пользователь online - обновляем время его // последнего посещения if(mysql_num_rows ($ses )> 0 ) { $query = "UPDATE session SET putdate = NOW(), user = " $_SESSION [ user ] " WHERE id_session = " $id_session "" ; mysql_query ($query ); } // Иначе, если такого номера нет - посетитель только что // вошёл - помещаем в таблицу нового посетителя else { $query = "INSERT INTO session VALUES(" $id_session ", NOW(), " $_SESSION [ user ] ")" ; if(! mysql_query ($query )) { echo $query . "
" ; echo "

Ошибка при добавлении пользователя

"
; exit(); } } // Будем считать, что пользователи, которые отсутствовали // в течении 20 минут - покинули ресурс - удаляем их // id_session из базы данных $query = "DELETE FROM session WHERE putdate < NOW() - INTERVAL "20" MINUTE" ; mysql_query ($query ); ?>

Протокол HTTP не является сессионным протоколом, поэтому мы можем фиксировать только обращения посетителей к страницам сайта - сколько после этого посетитель будет читать страницу - одному богу известно - получить эту информацию мы не сможем. Поэтому мы будем считать, что если посетиель не обращается к страницам сайта более 20 минут - он ушёл и его можно удалять из таблицы session .

Теперь нам остаётся только вывести содержимое таблицы session или подсчитать число посетителей в ней.

Выводим содержимое таблицы session

// Устанавливаем соединение с базой данных include "config.php" ; // Выводим имена всех посетителей, записи о которых имеются // в таблице session $query = "SELECT * FROM session" ; $ath = mysql_query ($query ); if(! $ath ) exit("

Ошибка в запросе к таблице сессий

"
); // Если хоть кто-то есть - выводим таблицу if(mysql_num_rows ($ath )> 0 ) { echo "" ; while($author = mysql_fetch_array ($ath )) { // Если посетитель не зарегистрирован // выводим вместо его имени - "аноним" if(empty($author [ "user" ])) echo "" ; else echo "" ; } echo "
аноним
" . $author [ "user" ]. "
" ; } ?>

Для установки соединения с базой данных, нам потребуется конфигурационный файл config.php , следующего содержания.

Конфигурационный файл config.php

//////////////////////////////////////////////////////////// // 2003-2011 (C) IT-студия SoftTime (http://www.сайт) //////////////////////////////////////////////////////////// // сейчас выставлен сервер локальной машины $dblocation = "localhost" ; // Имя базы данных, на хостинге или локальной машине $dbname = "dbase" ; // Имя пользователя базы данных $dbuser = "root" ; // и его пароль $dbpasswd = "" ; // Устанавливаем соединение с базой данных $dbcnx = @ mysql_connect ($dblocation , $dbuser , $dbpasswd ); if (! $dbcnx ) { exit("

В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.

"
); } // Выбираем базу данных if (! @ mysql_select_db ($dbname , $dbcnx )) { exit("

В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.

"
); } // Устанавливаем кодировку соединения @ mysql_query ("SET NAMES "cp1251"" ); ?>