bitshares研究系列【水龙头加上验证码】

in #bitshares6 years ago

前面说过的faucet已经被改为python flask版本的了,自然是要加入需要的功能,这次尝试在注册时加入验证码功能。

captcha

安装

pip install captcha

测试代码

from captcha.audio import AudioCaptcha
from captcha.image import ImageCaptcha

# audio = AudioCaptcha(voicedir='/path/to/voices')
image = ImageCaptcha(fonts=['./fonts/Vera.ttf'])

# data = audio.generate('1234')
# audio.write('1234', 'out.wav')

data = image.generate('abcd')
image.write('abcd', './captcha1.png')

Vera.ttf可以在此下载https://github.com/agoravoting/flask-captcha/blob/master/flask_captcha/fonts/Vera.ttf

测试结果:
captcha1.png

recaptucha

安装依赖库

(env3) Chaim:python Chaim$ pip install flask-recaptcha
...
Successfully built flask-recaptcha
Installing collected packages: flask-recaptcha
Successfully installed flask-recaptcha-0.4.2

在templates目录中配置网页模块captcha.html:

<form method="post" action="/submit">
    {{ recaptcha }}

    <input type="submit" value="Submit" name="submit"/>
</form>

在views.py中加入:

from flask_recaptcha import ReCaptcha

# recaptcha
app.config.update({
    "debug": True,
    "RECAPTCHA_SITE_KEY": "SITE_KEY",
    "RECAPTCHA_SITE_SECRET": "SECRET",
    "RECAPTCHA_ENABLED": True
})

recaptcha = ReCaptcha()
recaptcha.init_app(app)

views.py加入以下route:

@app.route('/captcha')
def captcha():
    return render_template("captcha.html")
    # strCode = recaptcha.get_code()
    # print(strCode)
    # return strCode

@app.route('/submit', methods=['POST', 'GET'])
def submit():
    if recaptcha.verify():
        print("verify ok!")
        return "ok"
    else:
        print("verify fail!")
        return "fail"

调用 /captcha 测试结果:

get_code()返回结果如下:

        <script src='//www.google.com/recaptcha/api.js'></script>
        <div class="g-recaptcha" data-sitekey="zosfaucet" data-theme="light" data-type="image" data-size="normal"         data-tabindex="0"></div>

从get_code返回结果看出ReCaptcha是Google的,要连接Google网站,在GFW中根本就没法使用!

特别注意,要指定config中参数才能正常显示,否则什么也不显示,is_enable为false

flask-session-captcha

安装:

(env3) Chaim:zos-pyfaucet Chaim$ pip install flask-sqlalchemy
(env3) Chaim:zos-pyfaucet Chaim$ pip install flask_session
(env3) Chaim:zos-pyfaucet Chaim$ pip install flask-session-captcha

在templates中加入captcha.html

<form method="POST" action="/checkcaptcha">
    {{ captcha() }} (html comment removed:  This renders an <img> tag with the captcha img. )
    <input type="text" name="captcha">
    <input type="submit">
</form>

在views.py加入代码:

import uuid
from flask_session import Session
from flask_session_captcha import FlaskSessionCaptcha

# captcha
app.config["SECRET_KEY"] = uuid.uuid4()
app.config['CAPTCHA_ENABLE'] = True
app.config['CAPTCHA_NUMERIC_DIGITS'] = 5
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
app.config['SESSION_TYPE'] = 'sqlalchemy'
Session(app)
captcha = FlaskSessionCaptcha(app)
# captcha end

在views.py加入route

@app.route('/getcaptcha')
def getcaptcha():
    return render_template("captcha.html")

@app.route('/checkcaptcha', methods=['POST', 'GET'])
def checkcaptcha():
    print(request)
    if captcha.validate():
        print("validate ok!")
        return "ok"
    else:
        print("validate fail!")
        return "fail"

在浏览器中访问 /getcaptcha,输入验证码:

查看网页源代码,发现这个是直接加入img标签,图像数据是base64直接在网页代码中,这样就能在各个环境下使用了!

验证码功能测试成功了,注册时加上验证码功能只是多做了这个验证,就不再细说了!


感谢您阅读 @chaimyu 的帖子,期待您能留言交流!

Sort:  

你那里天气如何?听说有才的人都去参加 “三个一” 活动了呢,你要不要去耍耍?如果不想再收到我的留言,请回复“取消”。

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.032
BTC 60521.50
ETH 3005.55
USDT 1.00
SBD 3.85