成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

python:使用PIL,制作并驗(yàn)證圖片驗(yàn)證碼

laznrbfe / 469人閱讀

摘要:驗(yàn)證碼制作模塊自帶數(shù)字字母特殊字符變量集合,不需要我們手寫(xiě)集合生成隨機(jī)生成數(shù)字或字母生成干擾字符定義干擾字符顏色生成驗(yàn)證碼建議下載幾款字體,變換下風(fēng)格,我在粒定義了路徑,這里就直接導(dǎo)入了填充顏色填充驗(yàn)證碼填充驗(yàn)證碼路由配置前端配置郵

驗(yàn)證碼制作
#string模塊自帶數(shù)字、字母、特殊字符變量集合,不需要我們手寫(xiě)集合
import string
import random
import os
import uuid

import settings
from  PIL import Image, ImageDraw, ImageColor, ImageFilter, ImageFont


class Code(object):
    # 生成隨機(jī)生成數(shù)字或字母
    def random_hexdigits(self, len=1):
        return random.sample(string.hexdigits, len)
    
    # 生成干擾字符
    def punctuation(self, len=1):
        return tuple(random.sample(string.punctuation, len))
    
    # 定義干擾字符顏色
    def random_color(self, min=64, max=255):
        return tuple((random.randint(min, max) for i in range(3)))
    
    # 生成驗(yàn)證碼
    def creat_code(self, width=80, height=24, color=(192, 192, 192)):
        image = Image.new("RGB", (width, height), color)
        #建議下載幾款字體,變換下風(fēng)格,我在setting粒定義了static路徑,這里就直接導(dǎo)入了
        font = ImageFont.truetype(os.path.join(settings.STATICPATH, "fonts/Lora-Regular.ttf"), 20)
        draw = ImageDraw.Draw(image)
        self.fill_color(draw, image, 5)
        self.fill_dischar(draw, image, 10)
        code = self.fill_char(draw, image, 4, 10, font)
        image_name = "{}.jpeg".format(uuid.uuid4().hex)
        image_path = os.path.join(settings.STATICPATH, "code/{}".format(image_name))
        print(image_path)
        image.save(image_path)
        return {"code": code, "image_path": image_path}
    
    # 填充顏色
    def fill_color(self, draw, image, interval):
        for i in range(0, image.width, interval):
            for j in range(0, image.height, interval):
                draw.point((i, j), fill=self.random_color())
    
    # 填充驗(yàn)證碼
    def fill_dischar(self, draw, image, interval):
        for i in range(0, image.width, interval):
            dis = self.punctuation()
            j = random.randrange(3, image.height - 3)
            draw.text((i, j), dis[0], fill=self.random_color(64, 255))
    
    # 填充驗(yàn)證碼
    def fill_char(self, draw, image, num, interval, font):
        code = ""
        for i in range(num):
            cha = self.random_hexdigits()
            code += str(cha[0])
            j = random.randrange(0, 5)
            # print(cha)
            # print(image.width*(i/num)+interval,j)
            draw.text((image.width * (i / num) + interval, j), cha[0], fill=self.random_color(32, 127), font=font)
        return code


if __name__ == "__main__":
    code = Code()
    print(code.creat_code())
flask路由配置
import os
from flask import Flask, Response
from flask import render_template
from utils.code import Code

app = Flask(__name__)


@app.route("/")
def Register():
    return render_template("verify.html")


@app.route("/codes/")
def code():
    infor = Code().creat_code()
    image_path = infor["image_path"]
    code = infor["code"]
    
    print(image_path)
    with open(image_path, "rb") as f:
        image_content = f.read()
    os.remove(image_path)
    return Response(image_content, mimetype="jpeg")


if __name__ == "__main__":
    app.run(debug=True)
前端配置
 
引用

github源碼

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44623.html

相關(guān)文章

  • 純代系列:Python實(shí)現(xiàn)驗(yàn)證圖片(PIL庫(kù)經(jīng)典用法用法,爬蟲(chóng)12306思路)

    摘要:現(xiàn)在的網(wǎng)頁(yè)中,為了防止機(jī)器人提交表單,圖片驗(yàn)證碼是很常見(jiàn)的應(yīng)對(duì)手段之一?,F(xiàn)在就給出用的庫(kù)實(shí)現(xiàn)驗(yàn)證碼圖片的代碼。代碼中有詳細(xì)注釋。生成的驗(yàn)證碼圖片效果這時(shí)候,細(xì)心的同學(xué)可能要問(wèn),如果每次生成驗(yàn)證碼,都要先保存生成的圖片,再顯示到頁(yè)面。 現(xiàn)在的網(wǎng)頁(yè)中,為了防止機(jī)器人提交表單,圖片驗(yàn)證碼是很常見(jiàn)的應(yīng)對(duì)手段之一。這里就不詳細(xì)介紹了,相信大家都遇到過(guò)。 現(xiàn)在就給出用Python的PIL庫(kù)實(shí)現(xiàn)驗(yàn)證...

    teren 評(píng)論0 收藏0
  • 使用Flask-WTF制作一個(gè)帶驗(yàn)證的登陸表單

    摘要:目前還不是很熟悉的驗(yàn)證表單的原理,比如驗(yàn)證應(yīng)該是用,這種就是放在后端處理的。此時(shí)就需要手動(dòng)控制表單的生成。如果表單驗(yàn)證失敗,失敗的消息保存在中。 Flask-WTF遇到的坑 在使用Flask-WTF的時(shí)候,使用qucik_form()快速生成表單的確是很爽,但是生成的表單的樣式并不是想要的,這個(gè)時(shí)候就不能使用qucik_form()了。 PS:目前還不是很熟悉Flask-WTF的驗(yàn)證表...

    i_garfileo 評(píng)論0 收藏0
  • python開(kāi)發(fā)時(shí)幾種安全驗(yàn)證的實(shí)現(xiàn)

    摘要:在這兩種情況下,如果你簽名的都是用戶(hù),那么該用戶(hù)可以在激活賬戶(hù)和升級(jí)賬戶(hù)時(shí),復(fù)用的可變部分。變量是一個(gè)元組,包括一個(gè)透視變換的系數(shù)。 額,一個(gè)突然的交流讓我想起來(lái)我耽擱許久各種驗(yàn)證的實(shí)現(xiàn)遲遲沒(méi)做過(guò)趁著這個(gè)機(jī)會(huì)就搞了一下分為三部分:郵箱驗(yàn)證,短信驗(yàn)證,圖片驗(yàn)證碼 郵箱驗(yàn)證 這個(gè)部分是主要參考的經(jīng)典書(shū)籍-狗書(shū)思路就是根據(jù)用戶(hù)某些信息通過(guò)JSON Web簽名生成token,然后再發(fā)送郵件驗(yàn)證...

    int64 評(píng)論0 收藏0
  • OCR識(shí)別驗(yàn)證

    摘要:識(shí)別網(wǎng)站驗(yàn)證碼詳見(jiàn)維基百科或者百度百科識(shí)別的驗(yàn)證碼原理采集一批驗(yàn)證碼,根據(jù)圖片特點(diǎn)進(jìn)行初步處理二值化灰度化濾波降噪等處理然后分割圖片,旋轉(zhuǎn)圖片,模板選取,訓(xùn)練算法,讓它更準(zhǔn)確。 最近在爬某網(wǎng)站,老是蹦出來(lái)驗(yàn)證碼,就想著找個(gè)OCR破了這個(gè)驗(yàn)證碼,然后就開(kāi)始了OCR探索之旅。 首先簡(jiǎn)單說(shuō)一下什么是OCR OCR是(Optical Character Recognition,光學(xué)字符識(shí)別)的...

    Yangyang 評(píng)論0 收藏0
  • 驗(yàn)證識(shí)別

    摘要:下面我們便來(lái)講種驗(yàn)證碼的識(shí)別方式和一些思路。哈哈庫(kù)其實(shí),驗(yàn)證碼識(shí)別歸根到底還是對(duì)各種各樣圖片的識(shí)別和操作,中有很對(duì)圖像處理的庫(kù),其中就是其中之一。所以在處理驗(yàn)證碼識(shí)別之前,必須先了解庫(kù)和。第五步,按照規(guī)定軌跡進(jìn)行拖動(dòng),完成驗(yàn)證。 寫(xiě)在前面 現(xiàn)在,很多網(wǎng)站采取各種各樣的措施來(lái)反爬蟲(chóng),其中之一就是使用驗(yàn)證碼。當(dāng)我們?cè)L問(wèn)網(wǎng)頁(yè)時(shí),必須先通過(guò)驗(yàn)證碼才能夠訪問(wèn)頁(yè)面。下面我們便來(lái)講2種驗(yàn)證碼的識(shí)別方...

    keke 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<