captcha.py 1.62 KB
import random
import string

from wheezy.captcha.image import captcha, background, noise, smooth, text, offset

from ..tools import *


def img_captcha(request, length=5, chars=string.ascii_uppercase + string.digits):
    kode_captcha = randomcaptcha(length, chars)
    _here = os.path.dirname(__file__)
    # captcha_path = os.path.abspath('/static/img/captcha.png'))
    # font_path = os.path.abspath(os.path.join('/static/v3/fonts/arial.ttf'))
    settings = get_settings()
    captcha_files = settings['captcha_files']
    if not os.path.exists(captcha_files):
        os.makedirs(captcha_files)

    file_name = get_random_string(16)+ '.png'
    from pyramid.path import AssetResolver
    a = AssetResolver('opensipkd.base')
    static_path = a.resolve('static').abspath()
    captcha_path = os.path.abspath(os.path.join(captcha_files, file_name))
    font_path = os.path.abspath(os.path.join(static_path, 'v3/fonts/arial.ttf'))
    captcha_image = captcha(drawings=[
        background(color='#fff'),
        text(fonts=[font_path],
             drawings=[
                 offset(0.8)
             ]),
        noise(),
        smooth()
    ], width=300)
    image = captcha_image(' ' + kode_captcha + ' ')
    image.save(captcha_path, 'PNG', quality=75)
    kode_captcha = kode_captcha
    request.session['captcha'] = kode_captcha
    return kode_captcha, file_name


def randomcaptcha(length, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for i in range(length))


def get_captcha(request):
    kode_captcha, file_name = img_captcha(request)
    request.session['captcha'] = kode_captcha
    return file_name