Beispiel #1
0
def captcha_audio(request, key):
    if not settings.CAPTCHA['FLITE_PATH']:
        raise Http404()

    store = get(key)

    challenge, response = store.split('\x00')

    if 'captcha.helpers.math_challenge' == settings.CAPTCHA['CHALLENGE_FUNCT']:
        challenge = challenge.replace('*', 'times').replace('-', 'minus')
    else:
        challenge = ', '.join(list(challenge))
    path = str(os.path.join(tempfile.gettempdir(), '%s.wav' % key))
    cline = '%s -t "%s" -o "%s"' % (settings.CAPTCHA['FLITE_PATH'], challenge, path)
    os.popen(cline).read()

    if os.path.isfile(path):
        response = HttpResponse()
        f = open(path, 'rb')
        response['Content-Type'] = 'audio/x-wav'
        response.write(f.read())
        f.close()
        os.unlink(path)

        return response
Beispiel #2
0
def captcha_image(request, key, scale=1):
    store = get(key)

    challenge, response = store.split('\x00')

    if settings.CAPTCHA['FONT_PATH'].lower().strip().endswith('ttf'):
        font = ImageFont.truetype(settings.CAPTCHA['FONT_PATH'], settings.CAPTCHA['FONT_SIZE'] * scale)
    else:
        font = ImageFont.load(settings.CAPTCHA['FONT_PATH'])

    size = getsize(font, challenge)
    size = (size[0] * 2, int(size[1] * 1.4))
    image = Image.new('RGB', size, settings.CAPTCHA['BACKGROUND_COLOR'])

    try:
        PIL_VERSION = int(NON_DIGITS_RX.sub('', Image.VERSION))
    except:
        PIL_VERSION = 116
    xpos = 2

    charlist = []
    for char in challenge:
        if char in settings.CAPTCHA['PUNCTUATION'] and len(charlist) >= 1:
            charlist[-1] += char
        else:
            charlist.append(char)
    for char in charlist:
        fgimage = Image.new('RGB', size, settings.CAPTCHA['FOREGROUND_COLOR'])
        charimage = Image.new('L', getsize(font, ' %s ' % char), '#000000')
        chardraw = ImageDraw.Draw(charimage)
        chardraw.text((0, 0), ' %s ' % char, font=font, fill='#ffffff')
        if settings.CAPTCHA['LETTER_ROTATION']:
            if PIL_VERSION >= 116:
                charimage = charimage.rotate(random.randrange(*settings.CAPTCHA['LETTER_ROTATION']), expand=0, resample=Image.BICUBIC)
            else:
                charimage = charimage.rotate(random.randrange(*settings.CAPTCHA['LETTER_ROTATION']), resample=Image.BICUBIC)
        charimage = charimage.crop(charimage.getbbox())
        maskimage = Image.new('L', size)

        maskimage.paste(charimage, (xpos, from_top, xpos + charimage.size[0], from_top + charimage.size[1]))
        size = maskimage.size
        image = Image.composite(fgimage, image, maskimage)
        xpos = xpos + 2 + charimage.size[0]

    image = image.crop((0, 0, xpos + 1, size[1]))
    draw = ImageDraw.Draw(image)

    for f in settings.noise_functions():
        draw = f(draw, image)
    for f in settings.filter_functions():
        image = f(image)

    out = StringIO()
    image.save(out, "PNG")
    out.seek(0)

    response = HttpResponse(content_type='image/png')
    response.write(out.read())
    response['Content-length'] = out.tell()

    return response