helpers.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import random
  2. from django.urls import reverse
  3. from captcha.conf import settings
  4. def math_challenge():
  5. operators = ("+", "*", "-")
  6. operands = (random.randint(1, 10), random.randint(1, 10))
  7. operator = random.choice(operators)
  8. if operands[0] < operands[1] and "-" == operator:
  9. operands = (operands[1], operands[0])
  10. challenge = "%d%s%d" % (operands[0], operator, operands[1])
  11. return (
  12. "{}=".format(challenge.replace("*", settings.CAPTCHA_MATH_CHALLENGE_OPERATOR)),
  13. str(eval(challenge)),
  14. )
  15. def random_char_challenge():
  16. chars, ret = "abcdefghijklmnopqrstuvwxyz", ""
  17. for i in range(settings.CAPTCHA_LENGTH):
  18. ret += random.choice(chars)
  19. return ret.upper(), ret
  20. def unicode_challenge():
  21. chars, ret = "äàáëéèïíîöóòüúù", ""
  22. for i in range(settings.CAPTCHA_LENGTH):
  23. ret += random.choice(chars)
  24. return ret.upper(), ret
  25. def word_challenge():
  26. fd = open(settings.CAPTCHA_WORDS_DICTIONARY, "r")
  27. lines = fd.readlines()
  28. fd.close()
  29. while True:
  30. word = random.choice(lines).strip()
  31. if (
  32. len(word) >= settings.CAPTCHA_DICTIONARY_MIN_LENGTH
  33. and len(word) <= settings.CAPTCHA_DICTIONARY_MAX_LENGTH
  34. ):
  35. break
  36. return word.upper(), word.lower()
  37. def huge_words_and_punctuation_challenge():
  38. "Yay, undocumneted. Mostly used to test Issue 39 - http://code.google.com/p/django-simple-captcha/issues/detail?id=39"
  39. fd = open(settings.CAPTCHA_WORDS_DICTIONARY, "rb")
  40. lines = fd.readlines()
  41. fd.close()
  42. word = ""
  43. while True:
  44. word1 = random.choice(lines).strip()
  45. word2 = random.choice(lines).strip()
  46. punct = random.choice(settings.CAPTCHA_PUNCTUATION)
  47. word = "%s%s%s" % (word1, punct, word2)
  48. if (
  49. len(word) >= settings.CAPTCHA_DICTIONARY_MIN_LENGTH
  50. and len(word) <= settings.CAPTCHA_DICTIONARY_MAX_LENGTH
  51. ):
  52. break
  53. return word.upper(), word.lower()
  54. def noise_arcs(draw, image):
  55. size = image.size
  56. draw.arc([-20, -20, size[0], 20], 0, 295, fill=settings.CAPTCHA_FOREGROUND_COLOR)
  57. draw.line(
  58. [-20, 20, size[0] + 20, size[1] - 20], fill=settings.CAPTCHA_FOREGROUND_COLOR
  59. )
  60. draw.line([-20, 0, size[0] + 20, size[1]], fill=settings.CAPTCHA_FOREGROUND_COLOR)
  61. return draw
  62. def noise_dots(draw, image):
  63. size = image.size
  64. for p in range(int(size[0] * size[1] * 0.1)):
  65. draw.point(
  66. (random.randint(0, size[0]), random.randint(0, size[1])),
  67. fill=settings.CAPTCHA_FOREGROUND_COLOR,
  68. )
  69. return draw
  70. def noise_null(draw, image):
  71. return draw
  72. def post_smooth(image):
  73. from PIL import ImageFilter
  74. return image.filter(ImageFilter.SMOOTH)
  75. def captcha_image_url(key):
  76. """Return url to image. Need for ajax refresh and, etc"""
  77. return reverse("captcha-image", args=[key])
  78. def captcha_audio_url(key):
  79. """Return url to image. Need for ajax refresh and, etc"""
  80. return reverse("captcha-audio", args=[key])