PDA

Просмотр полной версии : Плагин AntiBotKiller (перевод на инглиш)


Derrek
16.02.2013, 23:27
Нашел старенький плагин AntiBotKiller модифицированный под русский язык Moonlight. Мне он нужен был в инглиш варианте и я решил попробовать сам его преобразовать. В итоге работает иногда сразу, иногда с 3ей попытки из 5ти. Пока ни разу все 5 раз не сфейлил. Хотелось бы мнения знатаков как можно исправить ещё лучше.

Вот некоторые ошибки:
[Feb 16 22:40:23 2013.43] [АвтоБот] Вроди нашел ту строчку: "one Hundred seventy nine".
[Feb 16 22:40:23 2013.43] [АвтоБот] Распознал СОТНЮ: "Hundred".
[Feb 16 22:40:23 2013.44] [АвтоБот] Распознал 1: "one".
[Feb 16 22:40:23 2013.44] [АвтоБот] Распознал 3: "seventy".
[Feb 16 22:40:23 2013.44] [АвтоБот] Итого в граммах: "170".
[Feb 16 22:40:23 2013.44] [АвтоБот] Эрегиру.. тоесть реагируем - пиздим "170".
[Feb 16 22:40:23 2013.44] [АвтоБот] ах да, •••••, для приличия ждем 5 секунд


Проблема из-за двойного пробела, в итоге в последнюю переменную попадает пустота вместо числа.


[Feb 16 22:40:17 2013.16] [АвтоБот] Вроди нашел ту строчку: "seven Hundred meighty oney".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал СОТНЮ: "Hundred".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал 1: "seven".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал 3: "eight".
[Feb 16 22:40:17 2013.17] [АвтоБот] Распознал 4: "one".
[Feb 16 22:40:17 2013.17] [АвтоБот] Итого в граммах: "709".
[Feb 16 22:40:17 2013.17] [АвтоБот] Эрегиру.. тоесть реагируем - пиздим "709".
[Feb 16 22:40:17 2013.18] [АвтоБот] ах да, •••••, для приличия ждем 5 секунд


Проблема в том что плагин путает 8 и 80, считает что окончание "y" это мусор.

плагин:
# =======================
# АвтоБот v.1.2.666
#( с помощью ебаной матери и перла, русификация Moonlight)
# =======================
# Copyright 2006
# Base Script : hakore(reactOnNPC)
# Modified by : AqlX
# Далее помог : Moonlight 2007
# Далее помог : Derrek 2013
#

package AntiBotkiller;

use strict;
use Plugins;
use Globals;
use Utils;
use Commands;
use Log qw(message debug);
use encoding 'Russian';

Plugins::register('АвтоБот', "Умно объебем тупого антибота", \&Unload);
my $hooks = Plugins::addHooks(
['packet/npc_talk', \&onNPCTalk, undef],
['packet/npc_talk_close', \&onClo, undef],
['packet/npc_talk_continue', \&onCon, undef],
['packet/npc_talk_number', \&onNPCAction, undef]
);

sub Unload
{
Plugins::delHooks($hooks);
};

my %reactOnNPC;
my $code;
my $str;

sub onNPCTalk
{
my (undef, $args) = @_;
my $msg = unpack("Z*", substr($args->{RAW_MSG}, 8));
$msg = I18N::bytesToString($msg);
$msg =~ s/\^[a-fA-F0-9]{6}//g;
if (!defined %reactOnNPC || $reactOnNPC{action})
{
undef %reactOnNPC if defined %reactOnNPC;
$reactOnNPC{index} = 1;
$reactOnNPC{msg}[$reactOnNPC{index}] = $msg;
}
else
{
$reactOnNPC{index}++;
$reactOnNPC{msg}[$reactOnNPC{index}] = $msg;
}
}

sub onNPCAction
{
$code = reply();
message "[АвтоБот] Эрегиру.. тоесть реагируем - пиздим \"$code\".\n", "success";
message "[АвтоБот] ах да, •••••, для приличия ждем 5 секунд ...\n", "success";
my $cmd = "talk num $code";
sleep 5;
Commands::run($cmd);
}

sub onClo
{
undef %reactOnNPC if defined %reactOnNPC;
}

sub onCon
{
message "[АвтоБот] 0 \"$reactOnNPC{msg}[0]\".\n", "success";
message "[АвтоБот] 1 \"$reactOnNPC{msg}[1]\".\n", "success";
message "[АвтоБот] 2 \"$reactOnNPC{msg}[2]\".\n", "success";
message "[АвтоБот] 3 \"$reactOnNPC{msg}[3]\".\n", "success";
message "[АвтоБот] 4 \"$reactOnNPC{msg}[4]\".\n", "success";

$reactOnNPC{msg}[3] =~ s/> //;
$reactOnNPC{msg}[4] =~ s/> //;

undef $str;
$str = $reactOnNPC{msg}[3];
if (length($str) < 2) {
undef $str;
$str = $reactOnNPC{msg}[4];
}
undef %reactOnNPC if defined %reactOnNPC;
}

sub reply
{
message "[АвтоБот] Вроди нашел ту строчку: \"$str\".\n", "success";

my %sn = ("one", 1, "two", 2, "three", 3, "four", 4, "five", 5, "six", 6, "seven", 7, "eight", 8, "nine", 9, "ten", 10, "eleven", 11, "twelve", 12, "thirteen", 13, "fourteen", 14, "fifteen", 15,"sixteen", 16,"seventeen", 17, "eighteen", 18, "nineteen", 19 ,"twenty", 20, "thirty", 30, "forty", 40, "fifty", 50, "sixty", 60, "seventy", 70, "eighty", 80, "ninety", 90,"one Hundred",100,"two Hundred",200,"three Hundred",300,"four Hundred",400,"five Hundred",500,"six Hundred",600,"seven Hundred",700,"eight Hundred",800,"nine Hundred",900);
my @sl = ("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", "one Hundred","two Hundred","three Hundred","four Hundred","five Hundred","six Hundred","seven Hundred","eight Hundred","nine Hundred");
my @sy = ("Hundred","hundred");



my ($str1, $str2, $str3,$str4) = split(/ /, $str);

my $tmp;
my $tmr;
my $kflag=0;


foreach $tmr (@sy){
if ($str2 =~/^.?$tmr.?$/) {
$kflag=1;
message "[АвтоБот] Распознал СОТНЮ: \"$tmr\".\n", "success";
}
}
if ($kflag==1) {
foreach $tmp (@sl){
if ($str1 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 1: \"$tmp\".\n", "success";
$str1 = $tmp;
}
}

foreach $tmp (@sl){
if ($str3 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 3: \"$tmp\".\n", "success";
$str3 = $tmp;
}
}

foreach $tmp (@sl){
if ($str4 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 4: \"$tmp\".\n", "success";
$str4 = $tmp;
}
}
}

if ($kflag==0) {
foreach $tmp (@sl){
if ($str1 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 1: \"$tmp\".\n", "success";
$str1 = $tmp;
}
}

foreach $tmp (@sl){
if ($str2 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 2: \"$tmp\".\n", "success";
$str2 = $tmp;
}
}

foreach $tmp (@sl){
if ($str3 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 3: \"$tmp\".\n", "success";
$str3 = $tmp;
}
}
}

if ($kflag==0) {
$code = $sn{$str1}+$sn{$str2}+$sn{$str3};
}
if ($kflag==1) {
$code = $sn{$str1}*100+$sn{$str3}+$sn{$str4};
$kflag=0;
}
message "[АвтоБот] Итого в граммах: \"$code\".\n", "success";

return $code;


}

return 1;

4epT
17.02.2013, 10:57
Derrek, а на каком серваке стоит этот древний антибот? скинь настроечки.

попробуй в плагине строчку:
my ($str1, $str2, $str3,$str4) = split(/ /, $str);
заменить на:
my ($str1, $str2, $str3,$str4) = split(/\s+/, $str);


Для потомков: плагин с распознаванием русских символов (http://rofan.ru/viewtopic.php?p=17709#p17709)

А вот этот же анти-антибот на основе макроса (http://forums.openkore.com/viewtopic.php?p=60896#p60896)

Derrek
17.02.2013, 19:15
ip 199.59.160.223
port 6900
private 1
master_version 14
version 25
serverType kRO_RagexeRE_2010_07_13a
serverEncoding Russian
charBlockSize 112
recvpackets recvpackets.txt
addTableFolders translated/kRO_english;kRO


split(/\s+/, $str);
А что это регулярное выражение означает, я не очень разбираюсь в них? Он раньше по пробелам делил, а так по чему будет? И вопрос, если там вместо деления на 4 поставить деление на 8 слов, он когда закончится строка будет просто пустоту в них писать или мусор из буфера?

А вот этот же анти-антибот на основе макроса
Сурово =)

4epT
17.02.2013, 22:29
А что это регулярное выражение означает
"\s+" - это означает один или несколько пробелов

И вопрос, если там вместо деления на 4 поставить деление на 8 слов, он когда закончится строка будет просто пустоту в них писать или мусор из буфера?
пустоту

Derrek
19.02.2013, 00:32
Работает как часы, только проблему с восьмёркой осталось решить. Чую нужно ветвления делать при каждой проверке на наличие "y" в конце "eight"... Но скорее всего можно забить. Там 5 попыток и обычно больше 1го раза подряд восьмёрка не всплывает.

4epT
19.02.2013, 10:20
а ты попробуй изменить строчку:
my @sl = ("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", "one Hundred","two Hundred","three Hundred","four Hundred","five Hundred","six Hundred","seven Hundred","eight Hundred","nine Hundred");

на:

my @sl = ("eighty", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "ninety", "one Hundred","two Hundred","three Hundred","four Hundred","five Hundred","six Hundred","seven Hundred","eight Hundred","nine Hundred");

т.е. "eighty" перенести в начало массива

Derrek
19.02.2013, 17:46
Ок, потестирую, если в логах 8ку найду сообщу о результате.
Вот что вышло:
[Feb 20 03:14:41 2013.54] [АвтоБот] Вроди нашел ту строчку: "~five Hundred eighty one!".
[Feb 20 03:14:41 2013.54] [АвтоБот] Распознал СОТНЮ: "Hundred".
[Feb 20 03:14:41 2013.55] [АвтоБот] Распознал 1: "five".
[Feb 20 03:14:41 2013.55] [АвтоБот] Распознал 3: "eighty".
[Feb 20 03:14:41 2013.56] [АвтоБот] Распознал 3: "eight".
[Feb 20 03:14:41 2013.56] [АвтоБот] Распознал 4: "one".
[Feb 20 03:14:41 2013.57] [АвтоБот] Итого в граммах: "509".
[Feb 20 03:14:47 2013.23] [АвтоБот] Вроди нашел ту строчку: "six Hundred eightym ".
[Feb 20 03:14:47 2013.24] [АвтоБот] Распознал СОТНЮ: "Hundred".
[Feb 20 03:14:47 2013.24] [АвтоБот] Распознал 1: "six".
[Feb 20 03:14:47 2013.25] [АвтоБот] Распознал 3: "eighty".
[Feb 20 03:14:47 2013.25] [АвтоБот] Распознал 3: "eight".
[Feb 20 03:14:47 2013.26] [АвтоБот] Итого в граммах: "608".
[Feb 20 04:06:40 2013.31] [АвтоБот] Вроди нашел ту строчку: "tone Hundred eighty msix".
[Feb 20 04:06:40 2013.32] [АвтоБот] Распознал СОТНЮ: "Hundred".
[Feb 20 04:06:40 2013.32] [АвтоБот] Распознал 1: "one".
[Feb 20 04:06:40 2013.33] [АвтоБот] Распознал 3: "eighty".
[Feb 20 04:06:40 2013.33] [АвтоБот] Распознал 3: "eight".
[Feb 20 04:06:40 2013.34] [АвтоБот] Распознал 4: "six".
[Feb 20 04:06:40 2013.34] [АвтоБот] Итого в граммах: "114".

Вот здесь:

foreach $tmp (@sl){
if ($str3 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 3: \"$tmp\".\n", "success";
$str3 = $tmp;
}
}

нужно после присваивания как-то выйти из цикла проверки, иначе оно дальше проверяет и заменяет переменную $str3.

foreach $tmp (@sl){
if ($str3 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 3: \"$tmp\".\n", "success";
$str3 = $tmp;
last;
}
}

или

foreach $tmp (@sl){
last if ($str3 =~/^.?$tmp.?$/) {
message "[АвтоБот] Распознал 3: \"$tmp\".\n", "success";
$str3 = $tmp;
}
}

Протестирую первое наверно.


UPD ^_^
[Feb 20 14:47:24 2013.21] [АвтоБот] Вроди нашел ту строчку: "nthreed Hundred eighty ~niney".
[Feb 20 14:47:24 2013.21] [АвтоБот] Распознал СОТНЮ: "Hundred".
[Feb 20 14:47:24 2013.22] [АвтоБот] Распознал 1: "three".
[Feb 20 14:47:24 2013.22] [АвтоБот] Распознал 3: "eighty".
[Feb 20 14:47:24 2013.22] [АвтоБот] Распознал 4: "nine".
[Feb 20 14:47:24 2013.23] [АвтоБот] Итого в граммах: "389".

4epT
22.02.2013, 08:29
всё типо клёво теперь?

Derrek
22.02.2013, 09:04
Да, бот с первого раза проходил все проверки. Только админы как-то вычислили всех моих ботов всё равно =)) Забанили все акки по айпи. Ищу другой щас сервак.