Сниппеты эмуляции мыши: FullEmulationMouse

orka13

Client
Регистрация
07.05.2015
Сообщения
2 179
Благодарностей
2 187
Баллы
113
Каким образом можно настроить исключение, чтобы не кликало на рекламу. Просто иногда когда по хпатч присходит клик скрипт отрабатывает и может кликнуть рекламу. а этого нам не надо
В своем нагульщике по обычным сайтам использую такое, чтобы на гугл-рекламу не кликать.
C#:
HtmlElementCollection Coll = tab1.FindElementsByXPath("//*[@href][not(contains(@href, 'google')) and not(contains(@href, 'ad'))]");
Но под другие популярные рекламные блоки (Яндекса и т.д.) надо больше условий добавить:
C#:
HtmlElementCollection Coll = tab1.FindElementsByXPath("//*[@href][not(contains(@href, 'google')) and not(contains(@href, 'ad')) and not(contains(@href, 'yandex'))]");
и т.д.
 
Последнее редактирование:
  • Спасибо
Реакции: Astraport

Fedor5588

Client
Регистрация
04.06.2017
Сообщения
318
Благодарностей
73
Баллы
28
В своем нагульщике по обычным сайтам использую такое, чтобы на гугл-рекламу не кликать.
C#:
HtmlElementCollection Coll = tab1.FindElementsByXPath("//*[@href][not(contains(@href, 'google')) and not(contains(@href, 'ad'))]");
Но под другие популярные рекламные блоки (Яндекса и т.д.) надо больше условий добавить:
C#:
HtmlElementCollection Coll = tab1.FindElementsByXPath("//*[@href][not(contains(@href, 'google')) and not(contains(@href, 'ad')) and not(contains(@href, 'yandex'))]");
и т.д.
Куда это можно тут прописать чтобы заработало не могу понять

C#:
//Если при чтении не переходили на другую страницу
    if (isLinkClicked == false)
    {
        //Находим все элементы, содержащие ссылки
        var colLinks = tab.FindElementsByXPath("//a");
        //Вычленяем только видимые на странице ссылки
        colResult = tab.FindElementsByXPath("//sngvuyrbuy");
        if (colLinks.Count>0)
        {
            foreach (var el in colLinks.Elements)
            {
                int topInBrowser = int.Parse(el.GetAttribute("topInBrowser"));
                int leftInBrowser = int.Parse(el.GetAttribute("leftInBrowser"));
                if (el.Height>0 && el.Width>0 && topInBrowser>=0 && leftInBrowser>=0)
                {
                    colResult.Add(el);
                }
            }
        }
        colLinks = colResult;
        //Проверка наличия ссылок
        if (colLinks.Count<1)
        {
            project.SendWarningToLog("Видимых ссылок на странице не найдено! "+tab.URL, true);
            project.SendInfoToLog("Завершили гуляние по страницам. Количество прочитанных страниц: "+(p+1), true);
            return "ok";
        }
        
        //Ведём мышку к случайному элементу со ссылкой
        var elLink = colLinks.Elements[rnd.Next(colLinks.Elements.Length)];
        tab.FullEmulationMouseMoveToHtmlElement(elLink);
        Thread.Sleep(rnd.Next(4,8)*1000);
        tab.FullEmulationMouseClick("left", "click");
        if (tab.IsBusy)    tab.WaitDownloading();
        Thread.Sleep(rnd.Next(time_min, time_max)*1000);
    }
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 179
Благодарностей
2 187
Баллы
113
вместо:
C#:
"//a"
Вставить:
C#:
"//a[@href][not(contains(@href, 'google')) and not(contains(@href, 'ad')) and not(contains(@href, 'yandex'))]"
 
  • Спасибо
Реакции: Fedor5588

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 091
Благодарностей
31
Баллы
48
Подскажите как исправить следующий глюк, перед тем как кликунть на нужный элемент, страница проматываеться до самого низа и это занимает пару минут
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
Подскажите как исправить следующий глюк, перед тем как кликунть на нужный элемент, страница проматываеться до самого низа и это занимает пару минут
зачем один и тот же вопрос в разных темах дублировать ?
вам же уже ответили, уменьшаете уровень эмуляции в проекте или в конкретном кубике. при высоком уровне эмуляции крыса всегда будет кликать только по видимому элементу, а если элемент внизу то будет автоматический скрол.
и еще вот я написал, если вдруг пропустили *HAHA*
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
а еще я расчехлил свой хрустальный шар для вангования и мне было видение (а куда деваться если информации ноль).
а не эту ли проблему вы нам щас описываете так подробно и красочно аж в двух темах ?
 

Konstantin517

Новичок
Регистрация
12.09.2019
Сообщения
3
Благодарностей
0
Баллы
1
Гуглим: получить координаты элемента site:zennolab.com
И потом подставляем координаты элемента к нашим точкам:
C#:
//ищем наш элдемент по XPath:
HtmlElement Elemetik = instance.ActiveTab.FindElementByXPath("//p", 0);
//его координаты подставляем в наши координаты первой точки в массиве
int x = Elemetik.DisplacementInTabWindow.X;
int y = Elemetik.DisplacementInTabWindow.Y;
Random rnd = new Random();
// указываем количество точек
int Kolichestvo_Tochek = 33;
// обьявляем массив точек, по которым будет двигаться курсор мыши
Point[] points = new Point[Kolichestvo_Tochek];
// в цикле заполняем наш масив
for (int i = 0; i<Kolichestvo_Tochek; i++)
{
    // если координаты выходят за пределы страницы (минусовые), то водим не доходя до края (меняем на "чуть плюсовые").
    if (x < 0) {
        x = rnd.Next(0,5);
    }
    if (y < 0) {
        y = rnd.Next(0,5);
    }
    points[i] = new Point(x, y);
    project.SendInfoToLog(x.ToString() + " , " + y.ToString(), false); // выводим в лог координаты
    // указываем рандомные пределы для сдвига курсора в пикселях для следующего круга цикла:
    x += rnd.Next(-64,64);
    y += rnd.Next(-64,64);
}
// в цикле двигаем курсором между точками, но обрабатываем массив координат уже с конца:
for (int i = Kolichestvo_Tochek-1; i>=0; i--)
{
    //задаем рандомно скорость движения для каждого рывка:
    instance.ActiveTab.FullEmulationMouseSetOptions(rnd.Next(4,7),rnd.Next(4,7),rnd.Next(2,5));
    //Двигаем мышкой плавно:
    instance.ActiveTab.FullEmulationMouseMove(points.ElementAt(i).X, points.ElementAt(i).Y);
}
//на всякий пожарный подводим к елементу курсор более рандомно, а то оно только к его крайней левой точке по координатам подводит:
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(Elemetik);
// и кликаем в этом месте:
instance.ActiveTab.FullEmulationMouseClick("left", "click");

Добрый день. Есть вот такой код (код ниже, код взят из вашего примера). Он введет мышку до определенного текста на странице. Мне нужно как то в этом коде сделать паузы рандомные (в пределах например от 1 от 2 секунд) между каждым движением мыши ( при переходе между точками ). Чтобы например получалось чтобы мышка доходила до нужного текста за 40-50 секунд например. Нашел у вас вот такую строчку в другом посте
//Делаем случайную паузу от 0,5 до 3 секунд
Thread.Sleep(rnd.Next(4,30) * 100);
Но не знаю как ее вставить в код.
И еще такой вопрос ,почему то когда мышка ведется к тексту часто бывает что она проходит намного ниже нужного текста , потом возвращается наверх , а потом только спускается к нужному тексту и там останавливается, а хотелось бы чтобы она только до текста спускалась.




//ищем наш элдемент по XPath:
HtmlElement Elemetik = instance.ActiveTab.FindElementByXPath("//span[contains(text(), 'Текст')]", 0);
//его координаты подставляем в наши координаты первой точки в массиве
int x = Elemetik.DisplacementInTabWindow.X;
int y = Elemetik.DisplacementInTabWindow.Y;
Random rnd = new Random();
// указываем количество точек
int Kolichestvo_Tochek = 20;
// обьявляем массив точек, по которым будет двигаться курсор мыши
Point[] points = new Point[Kolichestvo_Tochek];
// в цикле заполняем наш масив
for (int i = 0; i<Kolichestvo_Tochek; i++)
{
// если координаты выходят за пределы страницы (минусовые), то водим не доходя до края (меняем на "чуть плюсовые").
if (x < 0) {
x = rnd.Next(0,5);
}
if (y < 0) {
y = rnd.Next(0,5);
}
points = new Point(x, y);
project.SendInfoToLog(x.ToString() + " , " + y.ToString(), false); // выводим в лог координаты
// указываем рандомные пределы для сдвига курсора в пикселях для следующего круга цикла:
x += rnd.Next(-150,150);
y += rnd.Next(-500,500);
}
// в цикле двигаем курсором между точками, но обрабатываем массив координат уже с конца:
for (int i = Kolichestvo_Tochek-1; i>=0; i--)
{
//задаем рандомно скорость движения для каждого рывка:
instance.ActiveTab.FullEmulationMouseSetOptions(rnd.Next(4,7),rnd.Next(4,7),rnd.Next(2,5));
//Двигаем мышкой плавно:
instance.ActiveTab.FullEmulationMouseMove(points.ElementAt(i).X, points.ElementAt(i).Y);
}
//на всякий пожарный подводим к елементу курсор более рандомно, а то оно только к его крайней левой точке по координатам подводит:
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(Elemetik);
// и кликаем в этом месте:
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 179
Благодарностей
2 187
Баллы
113
Добрый день. Есть вот такой код (код ниже, код взят из вашего примера). Он введет мышку до определенного текста на странице. Мне нужно как то в этом коде сделать паузы рандомные (в пределах например от 1 от 2 секунд) между каждым движением мыши ( при переходе между точками ). Чтобы например получалось чтобы мышка доходила до нужного текста за 40-50 секунд например. Нашел у вас вот такую строчку в другом посте
//Делаем случайную паузу от 0,5 до 3 секунд
Thread.Sleep(rnd.Next(4,30) * 100);
Но не знаю как ее вставить в код.
И еще такой вопрос ,почему то когда мышка ведется к тексту часто бывает что она проходит намного ниже нужного текста , потом возвращается наверх , а потом только спускается к нужному тексту и там останавливается, а хотелось бы чтобы она только до текста спускалась.
Увеличьте количество точек («Kolichestvo_Tochek»), и/или поиграйтесь с параметром пауз в «instance.ActiveTab.FullEmulationMouseSetOptions» (увеличьте «4,7» до «500,3000»).
А за лишние манипуляции с мышкой: я не особо спец в этой теме, но это вроде такая особенность (косяк) зенки, - при приближении курсора к краю она скролит страницу. Где-то был недавно топик об этом, может исправят, или фиксить как-то в коде (лучше ограничивая наведение курсора к краям).
UPD: нашел тот топик: Некорректное поведение мыши при включенной фул эмулятион в настройках проекта
 
Регистрация
20.02.2019
Сообщения
292
Благодарностей
35
Баллы
28
Не ругайте сильно,
1. как скорость движения мышки увеличить в ZP 7, не теряя качества исполнения? Там просто полная эмуляция, но скорость движения не понимаю как увеличить? Она как обкуренная медленно так ходит.
2. И как в последних версиях просто поводить мышкой по экрану с полной эмуляцией
 
Последнее редактирование:

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
746
Баллы
113
работает до первого сбоя в браузере. а они очень часто происходят.
вот так правильно
C#:
if ((instance.ActiveTab.IsVoid) || (instance.ActiveTab.IsNull)) throw new Exception("Не найдено вкладки");
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["site"].Value), "regexp", 0);//находим элемент по УРЛу
if (he.IsVoid) throw new Exception("Не найдено и т.д."); // их всегда надо проверять
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(500);//ждем пол секунды перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
Вот что нужно!
Как вставить Xpath //*[@id="uniq1589787450527697150"] такой из переменной?
 

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 935
Благодарностей
1 123
Баллы
113

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
746
Баллы
113
получилось
if ((instance.ActiveTab.IsVoid) || (instance.ActiveTab.IsNull)) throw new Exception("Не найдено вкладки");
HtmlElement he = instance.ActiveTab.FindElementByAttribute("div", "id", project.Variables["Yandex_uniq"].Value, "text", 0);
//HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["Site"].Value), "regexp", 0);//находим элемент по УРЛу
if (he.IsVoid) throw new Exception("Не найдено и т.д."); // их всегда надо проверять
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(500);//ждем пол секунды перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
 
  • Спасибо
Реакции: Valandersi

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
746
Баллы
113
Это динамическое значение, нужно больше кусок чтобы что-то составить
У меня так получилось
(?<=<h2\ class="organic__title-wrapper).*?(?=data-counter=") - беру дом
C#:
 typo typo_text_l typo_line_m" aria-labelledby="uniq1589807999892279784"><a class="link link_theme_normal organic__url link_cropped_no i-bem" data-bem="{&quot;link&quot;:{}}" rel="noopener" data-log-node="j6fzcw" target="_blank" tabindex="0" href="https://star-like.ru/services/website-development"
Получается
1589827029363.png
Удаляю рся yabs.yandex.ru, директ и яндекс услуги. и клик получается прямо в тайл, осталось мышка чтобы немного быстрее подводила, люди так не ведут медленно
 

Iv1

Client
Регистрация
21.02.2016
Сообщения
1 950
Благодарностей
774
Баллы
113
Добрый день. Есть вот такой код (код ниже, код взят из вашего примера). Он введет мышку до определенного текста на странице. Мне нужно как то в этом коде сделать паузы рандомные (в пределах например от 1 от 2 секунд) между каждым движением мыши ( при переходе между точками ). Чтобы например получалось чтобы мышка доходила до нужного текста за 40-50 секунд например. Нашел у вас вот такую строчку в другом посте
//Делаем случайную паузу от 0,5 до 3 секунд
Thread.Sleep(rnd.Next(4,30) * 100);
Но не знаю как ее вставить в код.
И еще такой вопрос ,почему то когда мышка ведется к тексту часто бывает что она проходит намного ниже нужного текста , потом возвращается наверх , а потом только спускается к нужному тексту и там останавливается, а хотелось бы чтобы она только до текста спускалась.




//ищем наш элдемент по XPath:
HtmlElement Elemetik = instance.ActiveTab.FindElementByXPath("//span[contains(text(), 'Текст')]", 0);
//его координаты подставляем в наши координаты первой точки в массиве
int x = Elemetik.DisplacementInTabWindow.X;
int y = Elemetik.DisplacementInTabWindow.Y;
Random rnd = new Random();
// указываем количество точек
int Kolichestvo_Tochek = 20;
// обьявляем массив точек, по которым будет двигаться курсор мыши
Point[] points = new Point[Kolichestvo_Tochek];
// в цикле заполняем наш масив
for (int i = 0; i<Kolichestvo_Tochek; i++)
{
// если координаты выходят за пределы страницы (минусовые), то водим не доходя до края (меняем на "чуть плюсовые").
if (x < 0) {
x = rnd.Next(0,5);
}
if (y < 0) {
y = rnd.Next(0,5);
}
points = new Point(x, y);
project.SendInfoToLog(x.ToString() + " , " + y.ToString(), false); // выводим в лог координаты
// указываем рандомные пределы для сдвига курсора в пикселях для следующего круга цикла:
x += rnd.Next(-150,150);
y += rnd.Next(-500,500);
}
// в цикле двигаем курсором между точками, но обрабатываем массив координат уже с конца:
for (int i = Kolichestvo_Tochek-1; i>=0; i--)
{
//задаем рандомно скорость движения для каждого рывка:
instance.ActiveTab.FullEmulationMouseSetOptions(rnd.Next(4,7),rnd.Next(4,7),rnd.Next(2,5));
//Двигаем мышкой плавно:
instance.ActiveTab.FullEmulationMouseMove(points.ElementAt(i).X, points.ElementAt(i).Y);
}
//на всякий пожарный подводим к елементу курсор более рандомно, а то оно только к его крайней левой точке по координатам подводит:
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(Elemetik);
// и кликаем в этом месте:
Тут спорное решение. Потому что
1. Ехать по своим точкам функцией которая и так уже эмулирует "естественное" движение - это избыточность
2. Вызов функции FullEmulationMouseMove - довольно медленное занятие и скорее всего очень медленно мышка будет ездить, спотыкаясь на каждой точке
3. "Тряска" при движении и так уже реализована. Смотрите вебвизор на разных настройках движение мышки.
4. Так же лучше посмотреть вебвизор и проанализировать траектории. Дело вообще не в "тряске" чаще всего
5. Рикошет координат мышки от края экрана - в последней версии зенки там переделан механизм эмуляции. И ручная корректировка координат при движении - чаще всего только больше лишних дерганий и глюков добавляет.


p.s. Я бы такой код не пользовал
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
746
Баллы
113
Как в сниппет вставить?
Такой код
//div[@id='uniq1590143420870312884' and contains(@class, 'organic__url-text')]
1590162189487.png
Клин хороший получился, осталось мышку подвести
C#:
var rnd = new Random();

var tab = instance.ActiveTab;
//Ищем элемент
var div = tab.FindElementByAttribute("div", "id", project.Variables["Yandex_Uniq"].Value, "text", 0);
//Наводим на него мышку
tab.FullEmulationMouseMoveToHtmlElement(div);
 

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
  • Спасибо
Реакции: Roman48

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
Не дает редактировать предыдущий пост. Так правильно var div = tab.FindElementByXPath("//div[@id='uniq1590143420870312884' and contains(@class, 'organic__url-text')]", 0);
 
  • Спасибо
Реакции: Roman48

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
746
Баллы
113

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
746
Баллы
113
Хорошее расширение, вообще огонь!
 

Iv1

Client
Регистрация
21.02.2016
Сообщения
1 950
Благодарностей
774
Баллы
113
C#:
'" + variable + "'
что-то типо того
 

Iv1

Client
Регистрация
21.02.2016
Сообщения
1 950
Благодарностей
774
Баллы
113
Хорошее расширение, вообще огонь!
А перегружаемый код как ты будешь тут тестить?
Например код, который под логином, особенно когда ajax подгружается?

Прикол в том, что в зенке и в хроме одновременно вроде на одном и том же этапе будут разные html
 

Iv1

Client
Регистрация
21.02.2016
Сообщения
1 950
Благодарностей
774
Баллы
113
И сразу ответ, в зено хроме встроен инструмент для разработчиков.
там просто нажимаешь ctl+F и тестируешь свои Xpath как и в расширении.
И не надо мучаться
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
746
Баллы
113
И сразу ответ, в зено хроме встроен инструмент для разработчиков.
там просто нажимаешь ctl+F и тестируешь свои Xpath как и в расширении.
И не надо мучаться
Проблема в том что я хз как пользоваться
1590164034864.png
Подробно не написано, хоть бы статья вышла.
Как вставить переменную?
var rnd = new Random();

var tab = instance.ActiveTab;
//Ищем элемент
var div = tab.FindElementByXPath("//div[@id='project.Variables["Yandex_Uniq"].Value"and contains(@class, 'organic__url-text')]", 0);//Наводим на него мышку
tab.FullEmulationMouseMoveToHtmlElement(div);
 

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
746
Баллы
113

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
Мы говорим на разном языке, я даже не понял что это такое, и куда вставить
а зачем лезть в c# не понимая там ничего ? есть же стандартный кубик, забил туда xpath и он кликает. всего навсего надо изучить составление xpath. ну этого добра в инете навалом. да и тут на форуме в конкурсных статьях полно написано и про xpath и про навигацию бота на странице.
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
746
Баллы
113
а зачем лезть в c# не понимая там ничего ? есть же стандартный кубик, забил туда xpath и он кликает. всего навсего надо изучить составление xpath. ну этого добра в инете навалом. да и тут на форуме в конкурсных статьях полно написано и про xpath и про навигацию бота на странице.
Некоторые клики не устраивают, если нужный сайт находиться на первой позиции, мышкой пошарил, а потом она подводиться к сайту который на первой позиции, и может кликнуть на картинки, видео.

1590165332142.png
Думаю может по другому лучше будет
 

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
Некоторые клики не устраивают, если нужный сайт находиться на первой позиции, мышкой пошарил, а потом она подводиться к сайту который на первой позиции, и может кликнуть на картинки, видео.

Посмотреть вложение 56458
Думаю может по другому лучше будет
Не будет. Нужно сначала изучить xpath. Тогда не будешь составлять пути с таким id='uniq1590143420870312884' Нужно привязываться к чему-то стабильному. Поэтому дело не в кубиках и снипетах.
 
  • Спасибо
Реакции: orka13 и molotok

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
эти клики по шапке сайта , происходят не от того что используется кубик или снипет. это особенность верстки этого сайта. шапка закреплена и начинает перекрывать некоторые элементы.
тут просто так не получиться. тут либо надо находить элемент этой шапки и удалять из верстки, либо проверять куда крыса кликает и сравнивать с тем элементом на который хотим кликнуть. и если есть перекрытие то что то сделать, например проскролить выше страницу и идти на второй заход клика. тут нужны циклы , счетчики повторов, проверки элементов. наверно 1-й вариант проще все таки :-)
 
  • Спасибо
Реакции: Roman48 и LaGir

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
746
Баллы
113
эти клики по шапке сайта , происходят не от того что используется кубик или снипет. это особенность верстки этого сайта. шапка закреплена и начинает перекрывать некоторые элементы.
тут просто так не получиться. тут либо надо находить элемент этой шапки и удалять из верстки, либо проверять куда крыса кликает и сравнивать с тем элементом на который хотим кликнуть. и если есть перекрытие то что то сделать, например проскролить выше страницу и идти на второй заход клика. тут нужны циклы , счетчики повторов, проверки элементов. наверно 1-й вариант проще все таки :-)
Или убрать, полную эмуляцию мыши (максимальное качество) тогда такого нет.
Если отключаешь нормально, но не хотелось бы. Проскролить выше, вот что надо, но как это сделать
 

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)