1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Еще один полезный бот

Автор: Helmut · 17 май 2019 ·
  1. Вообще, для чего нужны дневнички? Для меня, например, ответ очевиден - чтобы сохранить какую-то информацию, которая может еще понадобиться. Форум для этого вполне подходит - под рукой всегда и везде, да и аккаунт и так уже есть, не надо региться где-то еще. Но, разумеется, такой вариант хранения информации имеет и свои существенные недостатки.

    А именно - система комментирования. Крайне кривая и бажная, и @SAS, похоже, вряд ли когда выберет время, чтобы отладить ее. В самом деле, какой смысл в модерации дневничка на этом движке, если пользователь, хоть раз отписавшийся, может продолжать создавать сообщения и восстанавливать удаленные независимо от настроек дневника? Собственно, и закрытие, и даже полное удаление дневника оставляет возможность читать и писать в нем.

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

    В самом деле, очень похоже на то, что некоторые пользователи в принципе не способны постичь, что писать что-либо можно для себя, а не для того, чтобы привлечь к себе внимание или собирать "лайки". И уж тем более они не могут допустить мысль, что их такое ценное мнение может кому-то быть просто не нужным и не интересным.

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

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

    Кто-то верит в б-га, кто-то в подлинность "велесовой книги", кто-то в атлантов или пришельцев, кто-то в современный игропром. Кто-то истово верует в то, что компьютерное пиратство является воровством, кто-то в то, что использование старых версий ПО является жуткой ересью. И это было краткое перечисление странностей (мягко говоря), встречающихся конкретно на этом форуме. Не говоря уж об откровенных неадекватах (типа тех же чайлдфри и анти-чайлдфри).

    Ну и зачем нам в нашем дневничке такие люди? И что с ними делать? Не писать о вещах, которые могут оскорбить чьи-либо чувства? Не вариант, как уже упоминалось выше, чувства идиота может оскорбить что угодно, и тут не угадаешь. Сидеть сутками и чистить мусор в комментах? Да нафиг надо. В конце концов, мы программисты или уже где? Мы живем в 21-м веке, где, как известно, вкалывают роботы - счастлив человек.

    Отсюда очевидное решение - переложить заботу о чистоте дневничка на робота. Который не знает усталости, не отвлекается и ничего не забывает. Собственно, так даже веселее - кто-нибудь пишет глупый пост, а он просто исчезает. Пациент возмущается и пишет гневный пост - а он снова исчезает. Настойчивый дятел начинает лихорадочно стучать по кнопочкам, раз за разом восстанавливая удаленные посты и дополняя их, изливая свое негодование, искрясь "остроумием" и "ехидством" - а оно все равно исчезает. Но дятел потому и дятел, что он "самый умный" и решает взять дневничок измором, уверенный, что автору рано или поздно надоест и не понимая, что соревнуется с роботом. Который по определению превосходит в терпеливости. Да и в уровне интеллекта, видимо, тоже.

    Традиционно, после лирического отступления, переходим к практике.
    С чего начать? Разумеется, с логина на форуме. Оформим это в виде отдельной подпрограммы. Так красивше, да и мало ли еще где-нибудь пригодится.

    Код:
    sub login {
       my ($response, $html, %token);
       my $cookie = HTTP::Cookies->new();
       my $browser = new LWP::UserAgent(agent => $agent);
       $browser->cookie_jar($cookie);
    
       $response = $browser->head('https://www.old-games.ru/forum/');
       $cookie->extract_cookies($response);
       $cookie->scan(sub{$token{$_[1]}=$_[2]});
    
       my @post = ['login' => $_[0], 'password' => $_[1], 'register' => 0, 'remember' => 1, 'cookie_check' => 1];
       $cookie->set_cookie(0, 'xf_session', $token{'xf_session'}, '/', 'old-games.ru');
       $response = $browser->post('https://www.old-games.ru/forum/login/login', @post);
       $cookie->extract_cookies($response);
       $cookie->scan(sub{$token{$_[1]}=$_[2]});
     
       $cookie->set_cookie(0, 'xf_user', $token{'xf_user'}, '/', 'old-games.ru');
       $response = $browser->get('https://www.old-games.ru/forum/');
       $token{'_xfToken'} = $1 if ($response->content =~ /_csrfToken:\s*"([^"]+)"/);
       return %token;
    }
    
    Теперь инициализируем робота и зададим ему все необходимые параметры для работы. Описание настроек приведем ниже.

    Код:
    #!/usr/bin/perl
    use HTTP::Cookies;
    use LWP::UserAgent;
    
    $login = 'Helmut';
    $password = '';
    
    $mode = 1;
    $hardmode = 0;
    $cooldown = 120;
    @whitelist = ();
    @blacklist = ('Grue13', 'coole', 'Bato-San', 'Vissavald');
    $message = 'Ваше мнение очень важно для нас. Мы вам перезвоним.';
    $url = 'https://www.old-games.ru/forum/xfa-blog-entry/esche-odin-poleznyj-bot.4868/';
    $agent = 'Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0';
    
    $timer = time;
    $jar = HTTP::Cookies->new();
    $ua = new LWP::UserAgent(agent => $agent);
    $ua->cookie_jar($jar);
    
    %cookie = login($login, $password);
    $jar->set_cookie(0, 'xf_user', $cookie{'xf_user'}, '/', 'old-games.ru');
    $jar->set_cookie(0, 'xf_session', $cookie{'xf_session'}, '/', 'old-games.ru');
    
    @request = [
       'reason' => $message,
       'hard_delete' => $hardmode,
       '_xfConfirm' => 1,
       '_xfNoRedirect' => 1,
       '_xfResponseType' => 'json',
       '_xfToken' => $cookie{'_xfToken'}
    ];
    
    
    Здесь:
    1) $login, $password - понятно что.
    2) $mode - режим работы. 1 - писать могут все, кроме пользователей из черного списка. 2 - писать могут только топикстартер и пользователи из белого списка. 3 - писать может только топикстартер.
    3) $hardmode - при вдумчивом исследовании перехваченного форумного трафика обнаружилась весьма интересная возможность - если выставить эту переменную в 1, то сообщения будут удаляться именно что безвозвратно. Причем штатными средствами форума использовать это, похоже, почему-то нельзя. Хотя что мешало добавить галочку в окно удаления постов? Что, в итоге, придает нашему роботу новый смысл - его можно использовать и для обычного, штатного удаления постов. Кстати, ранее "недоудаленные" посты таким образом тоже можно очистить (посмотрев их номера в коде страницы). Разве что, следует учесть один нюанс - если мы выставим переменную в 1, то сообщение именно что исчезнет, и пациент не увидит $message. тут уж надо решать, что нам интереснее в данный момент - просто убрать мусор или побесить идиота.
    4) $cooldown - время в секундах, через какое робот будет перепроверять форум. Две минуты, по-моему, в самый раз, чтобы не нагружать форум.
    5) @whitelist - понятно, белый список пользователей.
    6) @blacklist - Список пользователей, чьи сообщения заведомо не несут никакой ценности и не представляют ни малейшего интереса.
    7) $message - собственно сообщение, оставляемое на месте удаленного поста (в режиме $hardmode = 0). На форуме, кажется, называется "причина удаления".
    8) $url - ссылка на подлежащий модерации дневник.
    9) $agent - просто подпись. Каким именно браузером будет притворяться наш робот.

    Далее, создаем вечный цикл с пропуском итераций по таймеру, помещаем в него парсер сообщений и сам удалятор. Ну и пусть лог где-нибудь в файл пишет, на всякий случай.

    Код:
    while () {
       next if ($timer + $cooldown >= time);
       $response = $ua->get($url);
       $html = $response->decoded_content;
       while ($html =~ m/<li\s+id="comment-(\d+)"\s+class="comment">(.+?)<\/li>/sgi) {
           ($number, $body) = ($1, $2);
           $user = $1 if ($body =~ /<a href="members\/[^"]+" class="username poster" dir="auto">(.+?)<\/a>/si);
           $content = $1 if ($body =~ /<blockquote class="messageText ugc baseHtml">(.+)<\/blockquote>/si);
           if ($user ne $login && ($mode == 3
           || ($mode == 1 && (scalar grep {$_ eq $user} @blacklist))
           || ($mode == 2 && !(scalar grep {$_ eq $user} @whitelist)))) {
               $response = $ua->post("https://www.old-games.ru/forum/xfa-blog-comment/$number/delete-comment", @request);
               open(my $fh, '>>:utf8', 'botlog.txt');
               print $fh "$user\n$content\n\n";
               close $fh;
           }
       }
       $timer = time;
    }
    
    Вот, собственно и все. В принципе, ничто не мешает кому-нибудь на основе этого маленького, но полезного чистильщика создать своего, с прямо противоположными целями - написанием постов.
    Код:
    @request = [
       'message_html' => "<p>$message</p>",
       '_xfToken' => $cookie{'_xfToken'},
       '_xfNoRedirect' => 1,
       '_xfResponseType' => 'json'
    ];
    $response = $ua->post(($url."add-reply"), @request);
    
    И можно будет даже устроить войну ботов. Но, прямо как в известном анекдоте, есть один нюанс. Чистка мусора - б-гоугодное дело, а вот спам - прямо наоборот. И спамера кто-нибудь обязательно тюкнет банхаммером по темечку.
    Текстоплёт, Dimouse, ThisSuXX и 3 другим нравится это.

Комментарии

Чтобы оставить комментарий просто зарегистрируйтесь и станьте участником!
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление