Как показать IP гостей в блоке "Who is online"

Главные вкладки

Аватар пользователя lbn.kiev.ua lbn.kiev.ua 21 января 2008 в 16:35

Сделал custom block со следующим кодом:

<div id="block-user-3" class="block block-user">
<?
        $time_period = variable_get('user_block_seconds_online', 600);
         $users = db_query('select {users}.name, {sessions}.uid, {sessions}.hostname from {users} left join {sessions} on {users}.uid={sessions}.uid where {sessions}.timestamp > unix_timestamp()-%d order by {sessions}.timestamp desc', $time_period);
?>
<div class="content">
        <div class="item-list">
                <ul>
                        <?
                                $num_guest = 0;
                                $num_users = 0;
                                while( $users2 = db_fetch_array($users) ) {
                                        if( $users2['uid']==0 ) {
                                                $num_guest++;
                        ?>
                                                <li><a style="font-size: 75%" title="<?=$users2['hostname']?>" href="http://whois.domaintools.com/<?=$users2['hostname']?>"><?=$users2['hostname']?></a></li>
                        <?
                                        } else {
                                                $num_users++;
                        ?>
                                                <li class="block-user-3"><a title="View user profile." href="/users/<?=$users2['name']?>"><?=$users2['name']?></a></li>
                        <?
                                        }
                                }
                        ?>
                </ul>
        </div>
        There are <em><?=$num_users?> user<?=($num_users>1)?'s':''?></em> and <em><?=$num_guest?> guest<?=($num_guest>1)?'s':''?></em> online.
</div>
</div>

Теперь зарегистрированные пользователи отображаются, как обычно, а для гостей вместо безликого "and 6 guests" отображаются их IP адреса

Если кого заинтересовало, как это выглядит - можно посмотреть на сайте http://lbn.kiev.ua внизу, в левой колонке.

PS: конечно, было бы очень приятно опознать и подписать ботов, но пока до этого не дошел Smile

Комментарии

Аватар пользователя gradP gradP 22 января 2008 в 18:51

А вы не думаете, что некоторым пользователям не хочется чтобы их таким образом определяли, "анонимность" так сказать?

Аватар пользователя Shedko Shedko 22 января 2008 в 23:23

к PS Smile
еще бы прикрутить что-то вроде ip2country, чтобы показать флаги страны посетителя Smile , хотя может и лишнее Smile

Да и ссылки на домаинтуллс по мне не стоит показывать гостям, им лучше отдавать без ссылок, а то получается бесплатная реклама для domaintools в глазах поисковиков

Аватар пользователя lbn.kiev.ua lbn.kiev.ua 23 января 2008 в 13:40

прикрутил Smile
ссылку на domaintools... возможно, и правда спрячу - надо просто проверку ролей прикрутить, покопаться в документации, как это делается

ниже код с флагами, использует ip2cc модуль (плюс некоторые мелкие правки):

<div class="block block-user">
<?
        $time_period = variable_get('user_block_seconds_online', 600);
        $users = db_query('select {users}.name, {sessions}.uid, {sessions}.hostname from {users} left join {sessions} on {users}.uid={sessions}.uid where {sessions}.timestamp > unix_timestamp()-%d order by {sessions}.timestamp desc', $time_period);
?>
<div class="content">
        <div class="item-list">
                        <?
                                $num_guest = 0;
                                $num_users = 0;
                                while( $users2 = db_fetch_array($users) ) {
                                        $output = theme_ip2cc_ip_flag($users2['hostname']);
                                       
                                        if( $users2['uid']==0 ) {
                                                $num_guest++;
                        ?>
                                                <?=$output?> <a style="font-size: 75%" title="<?=$users2['hostname']?>" href="http://whois.domaintools.com/<?=$users2['hostname']?>"><?=$users2['hostname']?></a><br />
                        <?
                                        } else {
                                                $num_users++;
                        ?>
                                                <?=$output?> <a title="View user profile." href="/users/<?=$users2['name']?>"><?=$users2['name']?></a><br />
                        <?
                                        }
                                }
                        ?>
        </div>
        There are <em><?=$num_users?> user<?=($num_users==1)?'':'s'?></em> and <em><?=$num_guest?> guest<?=($num_guest==1)?'':'s'?></em> online.
</div>
</div>
Аватар пользователя Ne01eX Ne01eX 16 ноября 2008 в 17:51

Че-то не работает не первый ни второй примеры...

Создаю блок, указываю формат ввода PHP, в результате вылезают куски кода... Sad

Аватар пользователя fishtravel fishtravel 19 ноября 2008 в 8:11

Спасибо наглядный и удобный получается блок.
Оба кода рабочие, вставлять надо в формате php и в режиме источник.

Единственно , что не работает- это просмотр профиля пользователя, так как вызов и идентификация происходит по имени а не по коду, подправьте если не трудно.

Аватар пользователя NurOff NurOff 10 августа 2009 в 17:19

Просто и удобно. Спасибо.

Для тех кто еще решил вопользоватся: Ссылку на профиль поправьте так:
...
$users = db_query('select {users}.uid, {users}.name, {sessions}.uid, {sessions}.hostname from {users} left join {sessions} on {users}.uid={sessions}.uid where {sessions}.timestamp > unix_timestamp()-%d order by {sessions}.timestamp desc', $time_period);
?>
...
в запрос добавляем {users}.uid
...

<?=$output?> <а title="View user profile." href="/users/<?=$users2['uid']?>"><?=$users2['name']?>
...
и имя меняем на id пользователя

Что меняем выделено жирным

Аватар пользователя Scay13 Scay13 11 октября 2009 в 2:12

Немного переделал блок теперь показывает гостей и некоторые поисковые боты

<?php
<div id="block-user-3" class="block block-user">
<?
    
$time_period variable_get('user_block_seconds_online'600);
     
$users db_query('select {users}.name, {sessions}.uid, {sessions}.hostname from {users} left join {sessions} on {users}.uid={sessions}.uid where {sessions}.timestamp > unix_timestamp()-%d order by {sessions}.timestamp desc'$time_period);
?>
<div class="content">
    <div class="item-list">
        <ul>
            <? 
                $num_guest = 0;
                $num_users = 0;
                while( $users2 = db_fetch_array($users) ) {
                    if( $users2['uid']==0 ) {
                        $num_guest++;
            ?>
                        <li><a style="font-size: 75%" title="<?=$users2['hostname']?>" href="http://whois.domaintools.com/<?=$users2['hostname']?>">
<?    
if (strpos(gethostbyaddr($users2['hostname']),"googlebot")!== false) {
    echo "Google бот";
} elseif (strpos(gethostbyaddr($users2['hostname']),"yandex")!== false) {
    echo "Yandex бот";
} elseif (strpos(gethostbyaddr($users2['hostname']),"StackRambler")!== false) {
    echo "Rambler бот";
} elseif (strpos(gethostbyaddr($users2['hostname']),"msnbot")!== false) {
    echo "MSN бот";
} elseif (strpos(gethostbyaddr($users2['hostname']),"lycos")!== false) {
    echo "Lycos.com бот";
} elseif (strpos(gethostbyaddr($users2['hostname']),"ia_archiver")!== false) {
    echo "Archive.org бот";
} elseif (strpos(gethostbyaddr($users2['hostname']),"aport")!== false) {
    echo "Aport бот";
} elseif (strpos(gethostbyaddr($users2['hostname']),"crawl")!== false) {
    echo "Поисковый бот";
} elseif (strpos(gethostbyaddr($users2['hostname']),"bot")!== false) {
    echo "Поисковый бот";
} elseif (strpos(gethostbyaddr($users2['hostname']),"bot")== false) {
    echo "Гость";
};
                                                                                                    
    ?></a></li>
            <?
                    } else {
                        $num_users++;
            ?>
                        <li class="block-user-3"><a title="View user profile." href="?q=users/<?=$users2['uid']?>"><?=$users2['name']?></a></li>
            <?
                    }
                }
            ?>
        </ul>
    </div>
    There are <em><?=$num_users?> user<?=($num_users>1)?'s':''?></em> and <em><?=$num_guest?> guest<?=($num_guest>1)?'s':''?></em> online.
</div>
</div>?>
Аватар пользователя Tampico Tampico 28 декабря 2009 в 23:48

Странно.
Вместо списка выдает:

unix_timestamp()-%d order by {sessions}.timestamp desc', $time_period); ?>
There are user1)?'s':''?> and guest1)?'s':''?> online.
?>

Видимо у меня что-то с головой...

Аватар пользователя NurOff NurOff 5 января 2010 в 6:18

"Tampico" wrote:
Видимо у меня что-то с головой...

Не с головой.
Все правильно у вас выводит.
Вы сохранили текст, он текст и выводит.
Пересохраните блок.
Формат ввода - PHP code.

Аватар пользователя Tampico Tampico 8 января 2010 в 3:11

И что характерно - именно как код и сохранял.
Да и еще при инсталляции модуля иконок - сообщение об ошибке БД...

Аватар пользователя o_anton o_anton 23 октября 2011 в 11:07

Несколько переделал код, теперь показывает список авторизованных пользователей, список поисковых ботов. Данный код находится на сайте .

<?
        echo '<div id="block-user-3" class="block block-user">';
    $array_users;
        $array_robot;  
        $bool_robot[0] = false;//"Google бот";
        $bool_robot[1] = false;//"Yandex бот";
        $bool_robot[2] = false;//"Rambler бот";
        $bool_robot[3] = false;//"MSN бот";
        $bool_robot[4] = false;//"Lycos.com бот";
        $bool_robot[5] = false;//"Archive.org бот";
        $bool_robot[6] = false;//"Aport бот";
        $bool_robot[7] = false;//"other";
       
        $num_guest = 0;
        $num_robot = 0;
        $num_users = 0;
        $time_period = variable_get('user_block_seconds_online', 600);
    $users = db_query('select {users}.name, {sessions}.uid, {sessions}.hostname from {users} left join {sessions} on {users}.uid={sessions}.uid where {sessions}.timestamp > unix_timestamp()-%d order by {sessions}.timestamp desc', $time_period);

    echo '<div class="content">';
    $num_guest = 0;
    $num_users = 0;
    while( $users2 = db_fetch_array($users) )
                if( $users2['uid']==0 ) {
                        if ((strpos(gethostbyaddr($users2['hostname']),"googlebot")!== false)&&(!$bool_robot[0])) {
                                $array_robot[$num_robot++] = "Google бот";
                                $bool_robot[0] = true;
                        } elseif ((strpos(gethostbyaddr($users2['hostname']),"yandex")!== false)&&(!$bool_robot[1])) {
                                $array_robot[$num_robot++] = "Yandex бот";
                                $bool_robot[1] = true;
                        } elseif ((strpos(gethostbyaddr($users2['hostname']),"StackRambler")!== false)&&(!$bool_robot[2])) {
                                $array_robot[$num_robot++] = "Rambler бот";
                                $bool_robot[2] = true;
                        } elseif ((strpos(gethostbyaddr($users2['hostname']),"msnbot")!== false)&&(!$bool_robot[3])) {
                                $array_robot[$num_robot++] = "MSN бот";
                                $bool_robot[3] = true;
                        } elseif ((strpos(gethostbyaddr($users2['hostname']),"lycos")!== false)&&(!$bool_robot[4])) {
                                $array_robot[$num_robot++] = "Lycos.com бот";
                                $bool_robot[4] = true;
                        } elseif ((strpos(gethostbyaddr($users2['hostname']),"ia_archiver")!== false)&&(!$bool_robot[5])) {
                                $array_robot[$num_robot++] = "Archive.org бот";
                                $bool_robot[5] = true;
                        } elseif ((strpos(gethostbyaddr($users2['hostname']),"aport")!== false)&&(!$bool_robot[6])) {
                                $array_robot[$num_robot++] = "Aport бот";
                                $bool_robot[6] = true;
                        } elseif (((strpos(gethostbyaddr($users2['hostname']),"crawl")!== false)||(strpos(gethostbyaddr($users2['hostname']),"bot")!== false))&&(!$bool_robot[7])) {
                                $bool_robot[7] = true;
                                $array_robot[$num_robot++] = "other";
                        } elseif (strpos(gethostbyaddr($users2['hostname']),"bot")== false) $num_guest++;
                } else $array_users[$num_users++] = $users2['name'];
       
        echo '<div class="item-list">';
        if($num_users>0){
                echo '<h3>Пользователи:</h3><ul>'
                for($i=0;$i<$num_users;$i++)
                        echo '<li class="block-user-3">'.$array_users[$i].'</li>';
                echo '</ul>';
        }
        if($num_robot>0) {
                echo '<h3>Поисковые роботы:</h3><ul>';
                for($i=0;$i<$num_robot;$i++)
                        echo '<li class="block-user-3">'.$array_robot[$i].'</li>';
                echo '</ul>';
        }
               
        echo '</div><br />';
       
    echo 'Сейчас на сайте';
        if($num_users>0){
                echo ' <em>'.$num_users.' пользовател';
                if($num_users>1) echo 'я';
                else echo 'ь';
                echo '</em>';
        }      
        if($num_guest>0){
                if($num_users>0){
                        if($num_robot>0) echo ',';
                        else echo 'и';
                }              
                echo '<em>'.$num_guest.' гост';
                if($num_guest>1) echo 'ей';
                else echo 'ь';
                echo '</em>';
        }
        if($num_robot>0){
                if(($num_guest>0)||($num_users>0)) echo ' и';
                echo ' <em>'.$num_robot;
                if($num_robot==1) echo ' робот';
                elseif(($num_robot>1)&&($num_robot<5)) echo ' роботa';
                else echo ' роботов';
                echo '</em>';
        }
        echo '.</div></div>';
?>