Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Введите число с картинки
Форумы портала PHP.SU » PHP » Пользовательские функции » Введите число с картинки

Страниц (1): [1]
 

1. valenok - 12 Апреля, 2007 - 10:01:57 - перейти к сообщению
Осуществляется так:

index.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP header('Content-Type: text/html');
  3. session_register("secret_number");
  4.  
  5. if(isset($_GET['error'])){
  6. switch ($_GET['error']) {
  7. case 'number': echo "<Font color='red'>Введите число указанное на картинке</font>";
  8. }
  9. }
  10.  
  11. $_SESSION["secret_number"]=rand(1000,9999);
  12.        
  13. ?>
  14.  
  15. <form action="submit.php" method="post">
  16. Ваш E-Mail:<br>
  17. <input type="text" name="email" value=""><br>
  18. <br>
  19. Введите код, который вы видете на картинке:<br>
  20. <input type="text" name="secretcode" value=""><br>
  21. <img src='image.php' width=101 height=26 vspace=5>
  22. <br><br>
  23. <input type="submit">
  24. </form>
  25.  
  26.  



image.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. // Регистрируем переменную
  4. session_register("secret_number");
  5.  
  6. function mt() {
  7.         list($usec, $sec) = explode(' ', microtime());
  8.         return (float) $sec + ((float) $usec * 100000);
  9.         }
  10.  
  11. header("Content-type: image/png");
  12.  
  13. // создаем изображение
  14. $im=imagecreate(101, 26);
  15.  
  16. // Выделяем цвет фона (белый)
  17. $w=imagecolorallocate($im, 255, 255, 255);
  18.  
  19. // Выделяем цвет для фона (светло-серый)
  20. $g1=imagecolorallocate($im, 192, 192, 192);
  21.  
  22. // Выделяем цвет для более темных помех (темно-серый)
  23. $g2=imagecolorallocate($im, 64,64,64);
  24.  
  25. // Выделяем четыре случайных темных цвета для символов
  26. $cl1=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128));
  27. $cl2=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128));
  28. $cl3=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128));
  29. $cl4=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128));
  30.  
  31. // Рисуем сетку
  32. for ($i=0;$i<=100;$i+=5) imageline($im,$i,0,$i,25,$g1);
  33. for ($i=0;$i<=25;$i+=5) imageline($im,0,$i,100,$i,$g1);
  34.  
  35. // Выводим каждую цифру по отдельности, немного смещая случайным образом
  36. imagestring($im, 5, 0+rand(0,10), 5+rand(-5,5), substr($_SESSION["secret_number"],0,1), $cl1);
  37. imagestring($im, 5, 25+rand(-10,10), 5+rand(-5,5), substr($_SESSION["secret_number"],1,1), $cl2);
  38. imagestring($im, 5, 50+rand(-10,10), 5+rand(-5,5), substr($_SESSION["secret_number"],2,1), $cl3);
  39. imagestring($im, 5, 75+rand(-10,10), 5+rand(-5,5), substr($_SESSION["secret_number"],3,1), $cl4);
  40.  
  41. // Выводим пару случайных линий тесного цвета, прямо поверх символов.
  42. // Для увеличения количества линий можно увеличить,
  43. // изменив число выделенное красным цветом
  44. for ($i=0;$i<8;$i++) imageline($im,rand(0,100),rand(0,25),rand(0,100),rand(0,25),$g2);
  45.  
  46.  
  47. // Коэфициент увеличения/уменьшения картинки
  48. $k=1.7;
  49.  
  50. // Создаем новое изображение, увеличенного размера
  51. $im1=imagecreatetruecolor(101*$k,26*$k);
  52.  
  53. // Копируем изображение с изменением рамеров в большую сторону
  54. imagecopyresized($im1, $im, 0, 0, 0, 0, 101*$k, 26*$k, 101, 26);
  55.  
  56. // Создаем новое изображение, нормального размера
  57. $im2=imagecreatetruecolor(101,26);
  58.  
  59. // Копируем изображение с изменением рамеров в меньшую сторону
  60. imagecopyresampled($im2, $im1, 0, 0, 0, 0, 101, 26, 101*$k, 26*$k);
  61.  
  62. // Генерируем изображение
  63. imagepng($im2);
  64.  
  65. // Освобождаем память
  66. ?>
  67.  
  68.  


submit.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. session_register("secret_number");
  4.  
  5.  
  6.  
  7. if ($_SERVER["REQUEST_METHOD"]!="POST") { header("Location: index.php");die();}
  8.  
  9. if ($_POST["secretcode"]!=$_SESSION["secret_number"] || intval($_POST["secretcode"])==0)
  10. { header("Location: index.php?error=number");die();}
  11.  
  12.                 // Выполняем необходимые действия с данными
  13.                 // ..
  14.                 print "Hello ".htmlspecialchars(StripSlashes($_POST["email"]));
  15.                
  16.  
  17. ?>
  18.  


Скачать все три файла:
2. UserID - 12 Апреля, 2007 - 13:26:25 - перейти к сообщению
Ой как много Улыбка А если gd2 бесплатный хост не даёт использовать?
3. valenok - 12 Апреля, 2007 - 13:29:16 - перейти к сообщению
Agava (h17.ru | hut.ru) даёт.\n\n(Добавление)
Я тогда использовал в сессии номер, а показывал надпись "Три тысячи пятьсот шестьдесят четыре"
котору надо было ввести циферками.
А так в принципе на что оригинальности хватает, то делать и надо.

Вот тут человек идейку подкидывал: Анти-спам без captcha
4. valenok - 14 Сентября, 2007 - 11:38:53 - перейти к сообщению
image.php для использоватния без GD *
* Потребуются 10 картинок со всефи циферками

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function sha($num)
  4. {
  5.         // sha = Secret / Super Hash Algorithm =)
  6.        
  7.         $num ++;                                // range : 1 - 10 instead of 0-9
  8.         $q = rand(100,111);             // range: 100 - 999  {3 digits}
  9.         $num = $num * $q;               //
  10.         settype($num, "string");
  11.         $num = rand(100,999) . $num{2} . rand(1000,9999) .  $num{1} . rand(10,99) .  $num{0} . "e+" . ($q-98);
  12.         return $num;
  13.        
  14. }
  15. ?>
  16.  <img src="showimage.php?id=<?PHP echo sha($_SESSION['secret_number']){0};?>">
  17.  <img src="showimage.php?id=<?PHP echo sha($_SESSION['secret_number']){1};?>">
  18.  <img src="showimage.php?id=<?PHP echo sha($_SESSION['secret_number']){2};?>">
  19.  <img src="showimage.php?id=<?PHP echo sha($_SESSION['secret_number']){3};?>">
  20.  



showimage.php
PHP:
скопировать код в буфер обмена
  1.  
  2. function unsha($id)
  3. {
  4.  
  5.         // Super un SHA
  6.  
  7.         $num = '   ';
  8.         $num{2} = $id{3};
  9.         $num{1} = $id{8};
  10.         $num{0} = $id{11};
  11.         $q = substr($id,13) + 98;
  12.         $num = $num / $q;
  13.         return --$num;
  14.  
  15. }
  16.  
  17.  
  18. if(!isset($_GET['id']) OR !preg_match("/d{12}e\+d{1,2}/",$_GET['id']))
  19.         die('Куда параметры пихаешь?');
  20.  
  21. # А вообще в этом случае лучше выводить случайные картинки
  22. # чтоб думал что это на чтото влияет.
  23. # Раньше отвянет. Особенно если сохранять в сессиях
  24. # на какие запросы что ему давали
  25.  
  26. $num = unsha($_GET['id']);
  27.  
  28. // open the file in a binary mode
  29. $name = 'images/'.$num.'.jpg';
  30. $fp = fopen($name, 'rb');
  31.  
  32. // send the right headers
  33. header("Content-Type: image/png");
  34. header("Content-Length: " . filesize($name));
  35.  
  36. // dump the picture and stop the script
  37. fpassthru($fp);
  38. exit(0);
  39.  
  40.  
5. EuGen - 22 Октября, 2007 - 09:42:43 - перейти к сообщению
Вот так я немного модифицировал картинку:
PHP:
скопировать код в буфер обмена
  1.  
  2. //...
  3.         $IM_X=151;
  4.         $IM_Y=46;
  5.         // создаем изображение
  6.         $im=imagecreate($IM_X, $IM_Y);
  7.          
  8.         // Выделяем цвет фона (белый)
  9.         $w=imagecolorallocate($im, 255, 255, 255);
  10.            
  11.         // Выделяем цвет для фона (светло-серый)
  12.         $g1=imagecolorallocate($im, 192, 192, 192);
  13.          
  14.         // Выделяем цвет для более темных помех (темно-серый)
  15.         $g2=imagecolorallocate($im, 64,64,64);
  16.          
  17.         // Выделяем четыре случайных темных цвета для символов
  18.         $colors=array();
  19.         for($j=0;$j<$len;$j++)
  20.         {
  21.                 $colors[]=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128));
  22.         };
  23.         // Рисуем сетку
  24.         for ($i=-10;$i<=$IM_X-1;$i+=5)
  25.                 imageline($im,$i,0,$i+10,$IM_Y-1,$g1);
  26.         for ($i=-15;$i<=$IM_Y-1;$i+=5)
  27.                 imageline($im,0,$i,$IM_X-1,$i+15,$g1);
  28.          
  29.         // Выводим каждую цифру по отдельности, немного смещая случайным образом
  30.         $part_x=(int)($IM_X/$len);
  31.         for ($j=0;$j<$len;$j++)
  32.         {
  33.                 $rx=$part_x*$j+(int)(0.5*$part_x)+rand(-(int)(0.5*$part_x)+10,(int)(0.5*$part_x)-10);
  34.                 $ry=5+rand(-5,5);
  35.                 $rr=rand(4,5);
  36.                 imagestring($im, $rr, $rx, $ry, substr($secret_number,$j,1), $colors[$j]);
  37.         };
  38. //...
  39.  
6. james - 02 Января, 2008 - 00:00:54 - перейти к сообщению
А как это всё по функциям разбросать? Или в класс объеденить?

 

Powered by ExBB FM 1.0 RC1