Webmaster общности: Predpriemach.com | SearchEngines.bg

    WebAgent – следене на страница + бан система

    JavaScript обучение

    Автор: index

    В този „урок“ ще разгледаме желанието на един от потребителите( в частност : 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