Однажды в далеком 2009 году я делал сайт для музыкантов. Единственным средством обратной связи на сайте была гостевая книга. Чтобы не пустить ботов, спамеров и нехороших людей, нужна была капча. Так как сайт для музыкантов, то я подумал, пусть капча тоже будет музыкальной.
То, что получилось, выглядит примерно так:

или так:

Ноты нужно распознать и выбрать соответствующие в четырех (по количеству нот) выпадающих списках:

От знаков альтерации пришлось отказаться, т. к. это было бы слишком сложно как для меня (на тот момент не мог придумать, как это сделать), так и для пользователей, потому что процесс ввода усложнился бы в разы.
На сервере генерируется картинка из (псевдо)случайно выбранных четырех картинок нот и пауз. Имена картинок — цифры от 0 до 13 + расширение (png) — соответствуют номеру позиции ноты на нотном стане, начиная от нижней добавочной. Ключ тоже случайный — басовый или скрипичный. Чтобы понять, что нота означает в текущем ключе, был сделан такой конвертер:
Дальше все просто — генерируем ключ и ноты:
Конвертируем то что получилось во что-то понятное:
Затем остается только записать получившийся код в сессию, склеить и отдать картинку.
Таким образом, в сессии у нас записаны реальные номера нот (пауза=0, до=1, ре=2, и т. д.), а пользователь видит забавную капчу.
Спасибо, что дочитали до конца.
То, что получилось, выглядит примерно так:

или так:

Ноты нужно распознать и выбрать соответствующие в четырех (по количеству нот) выпадающих списках:

От знаков альтерации пришлось отказаться, т. к. это было бы слишком сложно как для меня (на тот момент не мог придумать, как это сделать), так и для пользователей, потому что процесс ввода усложнился бы в разы.
На сервере генерируется картинка из (псевдо)случайно выбранных четырех картинок нот и пауз. Имена картинок — цифры от 0 до 13 + расширение (png) — соответствуют номеру позиции ноты на нотном стане, начиная от нижней добавочной. Ключ тоже случайный — басовый или скрипичный. Чтобы понять, что нота означает в текущем ключе, был сделан такой конвертер:
<?php function scrip_href($x){ switch( $x ) { case 0: $x1=0; break; case 1: $x1=1; break; case 2: $x1=2; break; case 3: $x1=3; break; case 4: $x1=4; break; case 5: $x1=5; break; case 6: $x1=6; break; case 7: $x1=7; break; case 8: $x1=1; break; case 9: $x1=2; break; case 10: $x1=3; break; case 11: $x1=4; break; case 12: $x1=5; break; case 13: $x1=6; break; } return $x1; } function bass_href($x){ switch( $x ) { case 0: $x1 = 0; break; case 1: $x1 = 3; break; case 2: $x1 = 4; break; case 3: $x1 = 5; break; case 4: $x1 = 6; break; case 5: $x1 = 7; break; case 6: $x1 = 1; break; case 7: $x1 = 2; break; case 8: $x1 = 3; break; case 9: $x1 = 4; break; case 10: $x1 = 5; break; case 11: $x1 = 6; break; case 12: $x1 = 7; break; case 13: $x1 = 1; break; } return $x1; } ?>
Дальше все просто — генерируем ключ и ноты:
<?php mt_srand( time() + (double)microtime()*55 ); $n = mt_rand(1, 2); $n1 = mt_rand(0, 13); $n2 = mt_rand(0, 13); $n3 = mt_rand(0, 13); $n4 = mt_rand(0, 13); ?>
Конвертируем то что получилось во что-то понятное:
<?php if( $n == 1 ){ $x1 = scrip_href($n1); $x2 = scrip_href($n2); $x3 = scrip_href($n3); $x4 = scrip_href($n4); } elseif( $n == 2 ){ $x1 = bass_href($n1); $x2 = bass_href($n2); $x3 = bass_href($n3); $x4 = bass_href($n4); } ?>
Затем остается только записать получившийся код в сессию, склеить и отдать картинку.
Таким образом, в сессии у нас записаны реальные номера нот (пауза=0, до=1, ре=2, и т. д.), а пользователь видит забавную капчу.
Спасибо, что дочитали до конца.
