PDA

Просмотр полной версии : [Вопрос] CAPTCHA



denis01
27.05.2016, 15:03
Здравствуйте пользователи Pro-Pawn возник вопрос, как можно сделать CAPTCHA(для различения компьютеров и людей)

Создаю диалог при регистрации которое сравнивает Бота и Игрока он выдаёт рандомно цифры/буквы (0..9/A..Z) далее игрок должен вписать в диалоговое окно эти цифры/буквы если правильно то спавним а если нет то снова даём ему ввести.

Вопрос как мне проверить ввёл он правильно цифры/буквы с вариантом предложенного. Если можно пожалуйста на примере:)

newbie01
27.05.2016, 15:39
делай переменную в которую вводятся рандомные данные капчи, потом сверяй то что игрок пишет в диалоговое оконо и сравнивай с той переменной если совпадает то спавни.

StevenH
27.05.2016, 16:23
Писал через телефон



new captcha = random(1000); // Генерируем число
new string[5];
format(string, sizeof(string), "%d", captcha); // форматируем генерируемое число
ShowPlayerDialog(playerid, 100, 1, "Captcha", string, "Далее", ""); // выводим в диалог само число
SetPVarInt(playerid, "Captcha", captcha); // В ПВар игрока записываем генерируемое число


Потом в диалоге 100, например делаем проверки:


case 100:
{
if(!response) return true; // если нажали правую кнопку
new code = strval(inputtext); // мне так удобнее, в переменную записать введенные символы
if(GetPVarInt(playerid, "Captcha") == code) SpawnPlayer(playerid); // допустим спавним, если капча верная
else SendClientMessage(playerid, -1, "Код введен не верно"); // fail
}

Sp1ke
27.05.2016, 17:04
Если каптча состоит только из цифр то можно сделать простую проверку в виде "==", но если есть буквы то: https://wiki.sa-mp.com/wiki/Strcmp_RU

Daniel_Cortez
27.05.2016, 18:04
Если под "ботами" вы имеете в виду RakSamp, то в нём есть возможность читать текст в диалогах.

denis01
28.05.2016, 11:15
Сделал так:

new captcha[] = "0123456789ABCDEFGHIKLMNOPQRSTVXYZ";
new string[31 + 4 + 1];


format(string, sizeof(string), "\t%c%c%c%c\n\nВведите код выше написанный:", captcha[random(sizeof(captcha))],captcha[random(sizeof(captcha))],captcha[random(sizeof(captcha))],captcha[random(sizeof(captcha))]);
ShowPlayerDialog(playerid,1, DIALOG_STYLE_INPUT, "Капча", string, "Ок", "Отмена");
SetPVarString(playerid,"captchaСode",string);


GetPVarString(playerid, "captchaСode", string, sizeof(string));
if(!strcmp(inputtext, string, true) && strlen(inputtext) )
{
/*Тут действие(допустим спавним)*/
DeletePVar(playerid, "captchaСode");
}
else
{
SendClientMessage(playerid, -1, "Код веден не верно");
format(string, sizeof(string), "\t%c%c%c%c\n\nВведите код выше написанный:", captcha[random(sizeof(captcha))],captcha[random(sizeof(captcha))],captcha[random(sizeof(captcha))],captcha[random(sizeof(captcha))]);
ShowPlayerDialog(playerid,1, DIALOG_STYLE_INPUT, "Капча", string, "Ок", "Отмена");
SetPVarString(playerid,"captchaСode",string);
}

- - - Добавлено - - -

Но что то в любой введенный код с выше написанным не совподает, и всегда выводит ошибку:

SendClientMessage(playerid, -1, "Код веден не верно");

И иногда пол текста начинает пропадать:

\t%c%c%c%c\n\nВведите

\t%c%c%c%c

\t%c%c%c%c\n\nВведите код выше написанный:

\t%c%c%c%c\n\nВведите код выше

ziggi
28.05.2016, 12:15
Возьми вот эту функцию: https://github.com/Open-GTO/gtolib/blob/master/gtolib.inc#L398-L425
Используй так:

GenerateRandomString(string, 10, .alphabet = "0123456789ABCDEFGHIKLMNOPQRSTVXYZ");

denis01
28.05.2016, 13:13
#if !defined DEFAULT_ALPHABET
#define DEFAULT_ALPHABET "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#endif

stock GenerateRandomString(result_str[], length, size = sizeof(result_str), alphabet[] = DEFAULT_ALPHABET, alphabet_size = sizeof(alphabet))
{
result_str[0] = '\0';

if (length > size) {
length = size - 1;
}

if (length < 1) {
return 0;
}

for (new i = 0; i < length; i++) {
result_str[i] = alphabet[ random(alphabet_size) ];
}

return 1;
}

При всём уважении а не могли бы показать на примере как это будет выглядить, Как я его буду использовать в диалоге???

Если не затруднит могли бы показать на примере выше постом моим

ziggi
28.05.2016, 14:39
#if !defined DEFAULT_ALPHABET
#define DEFAULT_ALPHABET "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#endif

stock GenerateRandomString(result_str[], length, size = sizeof(result_str), alphabet[] = DEFAULT_ALPHABET, alphabet_size = sizeof(alphabet))
{
result_str[0] = '\0';

if (length > size) {
length = size - 1;
}

if (length < 1) {
return 0;
}

for (new i = 0; i < length; i++) {
result_str[i] = alphabet[ random(alphabet_size) ];
}

return 1;
}

При всём уважении а не могли бы показать на примере как это будет выглядить, Как я его буду использовать в диалоге???

Если не затруднит могли бы показать на примере выше постом моим



#define MAX_CAPTCHA_SIZE 10
#define CAPTCHA_ALPHABET "0123456789ABCDEFGHIKLMNOPQRSTVXYZ"



stock ShowCaptchaDialog(playerid)
{
static const
str[] = "\t%s\n\nВведите код выше написанный:";

new
string[sizeof(str) + MAX_CAPTCHA_SIZE + 1];

GenerateRandomString(string, MAX_CAPTCHA_SIZE, .alphabet = "0123456789ABCDEFGHIKLMNOPQRSTVXYZ");
SetPVarString(playerid, "captchaСode", string);

format(string, sizeof(string), str, string);
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Капча", string, "Ок", "Отмена");
}

stock IsCaptchaValid(playerid, text[])
{
new code[MAX_CAPTCHA_SIZE + 1];
GetPVarString(playerid, "captchaСode", code, sizeof(code));
return text[0] != 0 && code[0] != 0 && strcmp(code, text, true) == 0;
}



if (IsCaptchaValid(playerid, inputtext))
{
/*Тут действие(допустим спавним)*/
DeletePVar(playerid, "captchaСode");
}
else
{
SendClientMessage(playerid, -1, "Код веден не верно");
ShowCaptchaDialog(playerid);
}

denis01
28.05.2016, 15:10
#define MAX_CAPTCHA_SIZE 10
#define CAPTCHA_ALPHABET "0123456789ABCDEFGHIKLMNOPQRSTVXYZ"



stock ShowCaptchaDialog(playerid)
{
static const
str[] = "\t%s\n\nВведите код выше написанный:";

new
string[sizeof(str) + MAX_CAPTCHA_SIZE + 1];

GenerateRandomString(string, MAX_CAPTCHA_SIZE, .alphabet = "0123456789ABCDEFGHIKLMNOPQRSTVXYZ");
SetPVarString(playerid, "captchaСode", string);

format(string, sizeof(string), str, string);
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Капча", string, "Ок", "Отмена");
}

stock IsCaptchaValid(playerid, text[])
{
new code[MAX_CAPTCHA_SIZE + 1];
GetPVarString(playerid, "captchaСode", code, sizeof(code));
return text[0] != 0 && code[0] != 0 && strcmp(code, text, true) == 0;
}



if (IsCaptchaValid(playerid, inputtext))
{
/*Тут действие(допустим спавним)*/
DeletePVar(playerid, "captchaСode");
}
else
{
SendClientMessage(playerid, -1, "Код веден не верно");
ShowCaptchaDialog(playerid);
}


Спасибо огромное

denis01
29.05.2016, 10:45
static const
str[] = "\t%s\n\nВведите код выше написанный:";

new
string[sizeof(str) + MAX_CAPTCHA_SIZE + 1];

Можете еще подсказать как правильно подчитывать тут???

Nurick
29.05.2016, 11:21
static const str[] = "\t%s\n\nВведите код выше написанный:";
new string[sizeof(str) + MAX_CAPTCHA_SIZE + 1];
Разве тут уже не подсчитано???

Для "\0" символа ячейку не нужно выделять.


new string[ sizeof( str ) + ( -2 + MAX_CAPTCHA_SIZE ) ];