WebAgent - следене на страница + бан система
05-02-2012
В този "урок" ще разгледаме желанието на един от потребителите( в частност : Vasil_90 ), който искаше статистика за импресии , уникални , както и коя страница колко импресии има. Също така добавих от мен и бан система.
Не съм наблегнал на красотата на системата, защото нещата който се виждат е информация само за администратора на системата.

Имаме два файла :
index.php // страницата която вижда потребителя.
webagent.php // клас който прави всичко :)


index.php:
<?php

include('webagent.php'); // вкарваме файла

$webagent = new Webagent(); // създаваме инстанция , която създава доста неща

echo " work work "; // някакво съобщение което вижда потребителя.може да е всякаква информация

echo "<hr>";// разделна линия

// ОТ тук на долу започна Администраторската част
$webagent->userBanana(); // извиква формата за слагане и махане на бан на даден потребител по IP
$time = time() - (15*60); // Времето преди 15 минути
$now = time() ; // Времето сега
$webagent->showCountImpressions($time,$now);// Това е метод от гласа webagent, който показва колко са общо импресиите , уникалните и средно на една уникална колко импресии се падат.

$webagent->showImpressionsPage();// показва коя страница колко импресии има.
?>


webagent.php

<?php

class Webagent {

public $ip;
public $agent;
public $refer;
public $curentPage;
private $mysqlCon;

// inicializaciq na clasa i zadavane na stoinostite
function __construct() {
// zarejdane na informaciq za potrebitelq
$this->ip = ip2long($this->get_real_ip());
$this->agent = $_SERVER['HTTP_USER_AGENT']; // vzemane na browsera
$this->refer = $_SERVER['HTTP_REFERER']; // vzemene na stranicata ot koqto idva
$this->curentPage = $_SERVER['REQUEST_URI']; // vzemane na adresa sled http://domain.com/{tazi informaciq}
//
// nastroiki za baza danni
$this->mysqlCon['host'] = 'localhost';
$this->mysqlCon['user'] = 'root';
$this->mysqlCon['password'] = '123456';
$this->mysqlCon['db'] = 'webagent';
$this->connectMySql(); // vryzka s baza danni
$this->insertIntoMySql(); // vkarvane na impresiite
$this->checkBan(); // proverka i prekratqvane na vsi4ko ako potrebitelq e bannat
}

// method za vzemane na realnoto/istinskoto ip na potrebitelq
private function get_real_ip() {

if (isset($_SERVER["HTTP_CLIENT_IP"])) {
return $_SERVER["HTTP_CLIENT_IP"];
} elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
return $_SERVER["HTTP_X_FORWARDED_FOR"];
} elseif (isset($_SERVER["HTTP_X_FORWARDED"])) {
return $_SERVER["HTTP_X_FORWARDED"];
} elseif (isset($_SERVER["HTTP_FORWARDED_FOR"])) {
return $_SERVER["HTTP_FORWARDED_FOR"];
} elseif (isset($_SERVER["HTTP_FORWARDED"])) {
return $_SERVER["HTTP_FORWARDED"];
} else {
return $_SERVER["REMOTE_ADDR"];
}
}

// vryzka s baza danni
private function connectMySql() {
if (!mysql_connect($this->mysqlCon['host'], $this->mysqlCon['user'], $this->mysqlCon['password'])) {
die();
}
if (!mysql_select_db($this->mysqlCon['db'])) {
die();
}
}

// metod za vyvejdane v baza danni

private function insertIntoMySql() {
$info = serialize(array('userinfo' => $this->agent, 'refer' => $this->refer));
$time = time();
$sql = "INSERT INTO `webagent`.`visitors` (`id` ,`ip` ,`userinfo` ,`impresions` ,`time`)VALUES (NULL , '{$this->ip}', '{$info}', '1', '{$time}');";

if (!mysql_query($sql)) {
$sql = "SELECT `id` from `webagent`.`visitors` WHERE `ip` = {$this->ip} LIMIT 1 ";
$query = mysql_query($sql);
$id = mysql_fetch_array($query);
mysql_query("UPDATE `visitors` SET `impresions` = `impresions` + '1' WHERE `visitors`.`id` ={$id['id']} LIMIT 1 ;");
}

$this->tracePage();
}

// metod za vyvejdane na impresii za 1 stranica
private function tracePage() {
$sql = "INSERT INTO `trace` (`id` ,`page` ,`impressions`)VALUES (NULL , '{$this->curentPage}', '1');";
if (!mysql_query($sql)) {
$sql = "SELECT * FROM `trace` WHERE `page` = '{$this->curentPage}' LIMIT 1 ";
$query = mysql_query($sql);
$id = mysql_fetch_array($query);
mysql_query("UPDATE `webagent`.`trace` SET `impressions` = `impressions`+'1' WHERE `trace`.`id` ={$id['id']} LIMIT 1 ;");
} else {
echo" trace okey ...";
}
}

//metod za bannvane

private function checkBan() {
$sql = "SELECT * FROM `banned` WHERE `ip` = {$this->ip} ";
$query = mysql_query($sql);
$nums = mysql_num_rows($query);
if ($nums != 0) {
echo "<center> <h1> Nqmate dostyp do tazi stranica </h1></center>";
die(0);
}
}

public function userBanana() {
$myIP = long2ip($this->ip);
echo " lets ban same users ( dont ban yourself :{$myIP}) <br />";
?>
<form method="POST">
user IP : <input type="text" name="ip" value="127.0.0.1" />
reason: <input type="text" name="reason" value="" />
<input type="submit" name="send" value="BAN!" >
<br>
</form>
<?php
if (isset($_POST['ip'])) {
$ip = ip2long($_POST['ip']);
$reason = htmlspecialchars($_POST['reason']);
$time = time();
$sql = "INSERT INTO `banned` (`id` ,`ip` ,`reason` ,`time`)VALUES (NULL , '{$ip}', '{$reason}', '{$time}')";
if (!mysql_query($sql)) {
$sql = " SELECT * FROM `banned` where `ip`= {$ip} limit 1 ";
$query = mysql_query($sql);
$nums = mysql_num_rows($query);
if ($nums != 0) {
echo "<font color='red'>Tozi potrebitel ve4e e blokiran</font>";
}
}
}// edn if ot blokiraneto

if (isset($_GET['unblock'])) {
$ip = (int) $_GET['unblock'];
if (mysql_query("DELETE FROM `banned` WHERE `ip` = {$ip}")) {
echo "<font color='green'>Tozi potrebitel ve4e e De-blokiran</font>";
}
}// end of if ot deblokirane
// blok za ivejdane na vsi4ki "banosani" potrebiteli
$sql = " SELECT * FROM `banned` ";
$query = mysql_query($sql);
echo "<table border='1'>
<thead>
<tr>
<th>ID</th>
<th>IP</th>
<th>Prichina</th>
<th>Time</th>
<th><b><font color='red'><h1>X</h1></font></b></th>
</tr>
</thead><tbody>";
while ($row = mysql_fetch_array($query)) {

$newIP = long2ip($row['ip']);
$newTime = date('Y-m-d H:m:s', $row['time']);
echo" <tr><td>{$row['id']}</td>
<td>{$newIP}</td>
<td>{$row['reason']}</td>
<td>{$newTime}</td>
<td><a href='?unblock={$row['ip']}'>dell</a></td> </tr>";
}
echo "</tbody></table >";
}

public function showCountImpressions($a, $b) {
// razmestvane na mestata na A i B , taka 4e A da e vinagi po-malko ot B

if ($a > $b) {
$na = $b;
$nb = $a;
} else {
$na = $a;
$nb = $b;
}
$sql = "SELECT SUM( `impresions` ) AS `impresi` , SUM( `id` ) AS `unikalni` FROM `visitors` WHERE `time` between {$na} and {$nb} ";
$query = mysql_query($sql);
$result = mysql_fetch_array($query);
echo "<br>Obshto impresii : {$result['impresi']}<br>";
echo "<br>Obshto Unikalni : {$result['unikalni']}<br>";
$calc = ceil($result['impresi'] / $result['unikalni']);
echo "<br>Sredno impresii na 1 unikalna :{$calc}";
}

public function showImpressionsPage() {
$sql = "SELECT * FROM `trace` ";
$query = mysql_query($sql);
echo "<table border='1'>
<thead>
<tr>
<th>ID</th>
<th>Stranica</th>
<th>Impresii</th>
</tr>
</thead><tbody> ";
while ($row = mysql_fetch_array($query)) {
echo"<tr><td>{$row['id']}</td>
<td>{$row['page']}</td>
<td>{$row['impressions']}</td> </tr>";
}
echo " </tbody></table >";
}

}
?>

Информация за класа :
public $ip;
public $agent;
public $refer;
public $curentPage;
private $mysqlCon;
Държи информацията за потребителя.
В __construct се "зарежда" цялата информация и се прави проверка дали потребителя е блокиран.
get_real_ip - връща истинското IP на потребителя.
connectMySql - прави връзка с базата данни. хост, име и парола, както и база данни, можете да ги редактирате от __construct.
insertIntoMySql - създава импресия и уникална. Също така прави релация с следващият метод който е :

tracePage - този метод следи коя страница е извикана и колко импресии има на нея.
checkBan - проверява дали потребителя е блокиран. Ако е блокиран спира страницата и показва системно съобщение.
userBanana - администраторски панел , чрез който може да се слагат и махат банове.
showCountImpressions - показва импресиите и уникалните в сайта. както и тяхното съотношение ,
showImpressionsPage - показва колко импресий има на дадените сайтове.

Ето я и базата данни :)
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- БД: `webagent`
--

-- --------------------------------------------------------

--
-- Структура на таблица `banned`
--

CREATE TABLE `banned` (
`id` int(11) NOT NULL auto_increment,
`ip` varchar(10) collate utf8_bin NOT NULL,
`reason` text collate utf8_bin NOT NULL,
`time` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ip` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=12 ;

--
-- Дъмп (схема) на данните в таблицата `banned`
--

INSERT INTO `banned` VALUES (7, 0x2d383430333437333533, 0x646164736173646173, 1328467645);
INSERT INTO `banned` VALUES (9, 0x3132333132, 0x736461736420, 1328467659);
INSERT INTO `banned` VALUES (10, '', '', 1328467733);

-- --------------------------------------------------------

--
-- Структура на таблица `trace`
--

CREATE TABLE `trace` (
`id` int(11) NOT NULL auto_increment,
`page` varchar(255) collate utf8_bin NOT NULL,
`impressions` int(11) NOT NULL default '1',
PRIMARY KEY (`id`),
UNIQUE KEY `page` (`page`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=5 ;

--
-- Дъмп (схема) на данните в таблицата `trace`
--

INSERT INTO `trace` VALUES (2, 0x2f77742f, 62);
INSERT INTO `trace` VALUES (3, 0x2f77742f3f756e626c6f636b3d, 6);
INSERT INTO `trace` VALUES (4, 0x2f77742f3f756e626c6f636b3d32313330373036343333, 3);

-- --------------------------------------------------------

--
-- Структура на таблица `visitors`
--

CREATE TABLE `visitors` (
`id` int(11) NOT NULL auto_increment,
`ip` varchar(10) collate utf8_bin NOT NULL,
`userinfo` text collate utf8_bin NOT NULL,
`impresions` int(11) NOT NULL default '0',
`time` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ip` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=3 ;

--
-- Дъмп (схема) на данните в таблицата `visitors`
--

INSERT INTO `visitors` VALUES (1, 0x33323231323334333432, 0x736164617364617364, 23, 1328472153);
INSERT INTO `visitors` VALUES (2, 0x32313330373036343333, 0x613a323a7b733a383a2275736572696e666f223b733a3130353a224d6f7a696c6c612f352e30202857696e646f7773204e5420362e313b20574f57363429204170706c655765624b69742f3533352e3720284b48544d4c2c206c696b65204765636b6f29204368726f6d652f31362e302e3931322e3737205361666172692f3533352e37223b733a353a227265666572223b4e3b7d, 92, 1328473053);



Надявам се , да влезне в употреба на някой :))) Ако има въпроси и питания , моля коментирайте тук или в форума.


Download

/ Трябва да сте регистриран за да напишете коментар /
От: Vasil_90
0:17 08-02-2012
Благодаря за урока ще видя дали ще мога да го ползвам.
1