图形验证码后台生成,sqlite3操作类python,网页登陆验证

本文介绍了一个使用Python实现的图片验证码生成与验证系统。该系统包括SQLite数据库操作类、图片验证码类以及Flask接口类。文章详细展示了如何生成包含随机字符的图片验证码,并通过Flask接口实现验证码的获取与验证过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.sqlite3操作类python

import sqlite3


class MyEasySqlite:
    """
    sqlite数据库操作工具类
    database: 数据库文件地址,例如:db/mydb.db
    """
    _connection = None

    def __init__(self, database):
        # 连接数据库
        self._connection = sqlite3.connect(database)

    def _dict_factory(self, cursor, row):
        d = {}
        for idx, col in enumerate(cursor.description):
            d[col[0]] = row[idx]
        return d

    def execute(self, sql, args=[], result_dict=True, commit=True) -> list:
        """
        执行数据库操作的通用方法
        Args:
        sql: sql语句
        args: sql参数
        result_dict: 操作结果是否用dict格式返回
        commit: 是否提交事务
        Returns:
        list 列表,例如:
        [{'id': 1, 'name': '张三'}, {'id': 2, 'name': '李四'}]
        """
        if result_dict:
            self._connection.row_factory = self._dict_factory
        else:
            self._connection.row_factory = None
        # 获取游标
        _cursor = self._connection.cursor()
        # 执行SQL获取结果
        _cursor.execute(sql, args)
        if commit:
            self._connection.commit()
        data = _cursor.fetchall()
        _cursor.close()
        return data


if __name__ == '__main__':
    db = MyEasySqlite('imgCheck.db')
    # print(db.execute("select name from sqlite_master where type=?", ['table']))
    # print(db.execute("pragma table_info([user])"))
    # print(execute("insert into user(id, name, password) values (?, ?, ?)", [2, "李四", "123456"]))

    print(db.execute("CREATE TABLE IF NOT EXISTS IMGCODE2 (id INTEGER PRIMARY KEY AUTOINCREMENT,CODE TEXT, GUID TEXT, [CreatedTime] TimeStamp NOT NULL DEFAULT (datetime('now','localtime')));"))
    # print(db.execute("insert into IMGCODE values('%s','%s','%s')" % ('aa','b','c')))
    print(db.execute("insert into IMGCODE(code,guid) values('%s','%s')" % ('aa','c')))
    print(db.execute("select * from IMGCODE where code='aa' and guid='b'", result_dict=True))

2.图片验证码类

# 来源;https://www.cnblogs.com/huangxm/p/6227001.html
import base64
import uuid
from io import BytesIO

from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random

from flask import json
from sqlite3op import MyEasySqlite


class Picture(object):
    def __init__(self, text_str="abcdefghjkmnpqrstwxyz23456789ABCDEFGHJKLMNPQRSTWXYZ", size=(150, 50), background='white'):
        '''
        text_str: 验证码显示的字符组成的字符串
        size:  图片大小
        background: 背景颜色
        '''
        self.text_list = list(text_str)
        self.size = size
        self.background = background
        self.text = ""

    def create_pic(self):
        '''
        创建一张图片
        '''
        self.width, self.height = self.size
        self.img = Image.new("RGB", self.size, self.background)
        # 实例化画笔
        self.draw = ImageDraw.Draw(self.img)

    def create_point(self, num, color):
        '''
        num: 画点的数量
        color: 点的颜色
        功能:画点
        '''
        for i in range(num):
            self.draw.point(
                (random.randint(0, self.width), random.randint(0, self.height)),
                fill=color
            )

    def create_line(self, num, color):
        '''
        num: 线条的数量
        color: 线条的颜色
        功能:画线条
        '''
        for i in range(num):
            self.draw.line(
                [
                    (random.randint(0, self.width), random.randint(0, self.height)),
                    (random.randint(0, self.width), random.randint(0, self.height))
                ],
                fill=color
            )

    def create_text(self, font_type, font_size, font_color, font_num, start_xy):
        '''
        font_type: 字体
        font_size: 文字大小
        font_color: 文字颜色
        font_num:  文字数量
        start_xy:  第一个字左上角坐标,元组类型,如 (5,5)
        功能: 画文字
        '''
        font = ImageFont.truetype(font_type, font_size)
        txt = random.sample(self.text_list, font_num)
        txt = "".join(txt)
        print(txt)
        self.text = txt
        self.draw.text(start_xy, txt, font=font, fill=font_color)

    def opera(self):
        '''
        功能:给画出来的线条,文字,扭曲一下,缩放一下,位移一下,滤镜一下。
        就是让它看起来有点歪,有点扭。
        '''
        params = [
            1 - float(random.randint(1, 2)) / 100,
            0,
            0,
            0,
            1 - float(random.randint(1, 10)) / 100,
            float(random.randint(1, 2)) / 500,
            0.001,
            float(random.randint(1, 2)) / 500
        ]
        self.img = self.img.transform(self.size, Image.PERSPECTIVE, params)
        self.img = self.img.filter(ImageFilter.EDGE_ENHANCE_MORE)

    def get_img_code(self):
        strings = "abcdefghjkmnpqrstwxyz23456789ABCDEFGHJKLMNPQRSTWXYZ"
        size = (150, 50)
        background = 'white'

        self.text_list = list(strings)
        self.size = size
        self.background = background

        # pic = Picture(strings, size, background)
        self.create_pic()
        self.create_point(500, (220, 220, 220))
        self.create_line(30, (220, 220, 220))
        self.create_text("simsun.ttc", 24, (0, 0, 205), 5, (7, 7))
        self.opera()
        # pic.img.show()
        # 将图片保存到内存中
        f = BytesIO()
        self.img.save(f, 'jpeg')
        # 从内存中取出bytes类型的图片
        data = f.getvalue()
        # 将bytes转成base64
        data = base64.b64encode(data).decode()

        ret = {}
        ret['base64'] = data
        ret['guid'] = str(uuid.uuid1())

        db = MyEasySqlite('imgCheck.db')
        db.execute("insert into IMGCODE(code,guid) values('%s','%s')" % (self.text.lower(), ret['guid']))

        return json.dumps(ret)

    def check_img_code(self,code,guid):
        db = MyEasySqlite('imgCheck.db')
        ret = db.execute("select * from IMGCODE where code='%s' and guid='%s'" % (code, guid))

        check = False
        for item in ret:
            check = True

        obj = {}
        obj["status"] = "0"
        obj["msg"] = "验证码核验"
        obj["data"] = {"check": check}
        return json.dumps(obj)

if __name__ == "__main__":
    strings = "abcdefghjkmnpqrstwxyz23456789ABCDEFGHJKLMNPQRSTWXYZ"
    size = (150, 50)
    background = 'white'
    pic = Picture(strings, size, background)
    pic.create_pic()
    pic.create_point(500, (220, 220, 220))
    pic.create_line(30, (220, 220, 220))
    pic.create_text("simsun.ttc", 24, (0, 0, 205), 5, (7, 7))
    pic.opera()
    pic.img.show()
    pic.img.save("2.png")

    # 将图片保存到内存中
    f = BytesIO()
    pic.img.save(f, 'jpeg')
    # 从内存中取出bytes类型的图片
    data = f.getvalue()
    # 将bytes转成base64
    data = base64.b64encode(data).decode()

    print(data)
    print(pic.text)

3.接口类flask

import hashlib
import os
import base64
import uuid
from io import BytesIO

from flask import Flask, request, json
from flask_cors import CORS

from yzm2 import Picture

from sqlite3op import MyEasySqlite

app = Flask(__name__)
CORS(app, resources={r"/*": {"origins":"*"}}, send_wildcard=True)

gdict={}

@app.route('/')
def index():
    s = hashlib.md5(b'!a23456').hexdigest()
    data = '!a23456'
    s = hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()
    return '<h1>Hello World</h1>' + s

@app.route('/get_img_code')
def get_img_code():

    pic = Picture()
    return pic.get_img_code()
    # strings = "abcdefghjkmnpqrstwxyz23456789ABCDEFGHJKLMNPQRSTWXYZ"
    # size = (150, 50)
    # background = 'white'
    # pic = Picture(strings, size, background)
    # pic.create_pic()
    # pic.create_point(500, (220, 220, 220))
    # pic.create_line(30, (220, 220, 220))
    # pic.create_text("simsun.ttc", 24, (0, 0, 205), 5, (7, 7))
    # pic.opera()
    # # pic.img.show()
    # # 将图片保存到内存中
    # f = BytesIO()
    # pic.img.save(f, 'jpeg')
    # # 从内存中取出bytes类型的图片
    # data = f.getvalue()
    # # 将bytes转成base64
    # data = base64.b64encode(data).decode()
    #
    # ret={}
    # ret['base64'] = data
    # ret['guid'] = str(uuid.uuid1())
    #
    # db = MyEasySqlite('imgCheck.db')
    # db.execute("insert into IMGCODE(code,guid) values('%s','%s')" % (pic.text.lower(),ret['guid']))
    #
    # return json.dumps(ret)


@app.route('/check_img_code',methods=['GET','POST'])
def check_img_code():
    guid = request.values.get("guid")
    code = request.values.get("code").lower()

    pic = Picture()
    return pic.check_img_code(code,guid)

    # db = MyEasySqlite('imgCheck.db')
    # ret = db.execute("select * from IMGCODE where code='%s' and guid='%s'" % (code,guid))
    #
    # check=False
    # for item in ret:
    #     check=True
    #
    # obj={}
    # obj["status"] = "0"
    # obj["msg"] = "验证码核验"
    # obj["data"] = {"check":check}
    # return json.dumps(obj)

if __name__ == '__main__':
    app.run()

4.前端调用

<!--<!DOCTYPE html>-->
<!--<html lang="en">-->
<!--<head>-->
    <!--<meta charset="UTF-8">-->
    <!--<title>Title</title>-->
<!--</head>-->
<!--<body>-->

<!--</body>-->
<!--</html>-->

<!DOCTYPE HTML>
<html>

<head>
<script src="https://cdn.staticfile.org/jquery/2.0.0/jquery.min.js"></script>
</head>
<body>

<p>
验证码:
<input id="txt1" />
<img id="img1" src="" onclick="imgClick()" width="150" height="50" />
    <button onclick="ok()">确定</button>
</p>
<div>验证结果:<span id='txt2'></span></div>
<script>
    var guid = "";
    imgClick();
    function ok() {
        let code = document.getElementById("txt1").value;

        $.post("http://127.0.0.1:5000/check_img_code",{"guid":guid,"code":code},function (ret) {
            //alert(ret)
			let obj = JSON.parse(ret)
            let s = (obj.data.check).toString();
			$("#txt2").html(s)
        })
    }

    function imgClick() {
        $.get("http://127.0.0.1:5000/get_img_code",function (ret) {
            //alert(ret)
            let obj = JSON.parse(ret);
            guid = obj.guid;
            document.getElementById("img1").src = 'data:image/png;base64,' + obj.base64;
        })
    }

</script>
</body>
</html>

5.网页效果图:

6.python库全部,

打包在线安装

使用命令打包:

pip freeze > requirements.txt

在新机器上自动安装:

pip install -r requirements.txt

certifi==2020.4.5.2
chardet==3.0.4
click==8.0.1
colorama==0.4.4
coverage==4.5.1
cycler==0.10.0
decorator==4.4.1
easysqlite==0.1.2
ExifRead==2.1.2
Flask==2.0.1
Flask-Cors==3.0.10
flup==1.0.3
future==0.16.0
GDAL==3.1.4
geographiclib==1.50
httplib2==0.11.3
idna==2.9
importlib-metadata==4.8.1
itchat==1.3.10
itsdangerous==2.0.1
Jinja2==3.0.1
kiwisolver==1.1.0
lxml==4.3.3
MarkupSafe==2.0.1
matplotlib==3.1.3
mock==2.0.0
networkx==2.2
nose2==0.8.0
numpy==1.19.1
OWSLib==0.20.0
pandas==1.0.1
pbr==4.3.0
Pillow==5.3.0
plotly==4.8.2
ply==3.11
psycopg2-binary==2.8.4
ptvsd==4.3.2
Pygments==2.5.2
pyodbc==4.0.24
PyOpenGL==3.1.0
pyparsing==2.4.6
pypiwin32==223
pypng==0.0.20
pyproj==2.6.1.post1
PyQRCode==1.2.1
PyQt5==5.11.3
python-dateutil==2.8.1
pytz==2020.1
pywin32==224
PyYAML==5.3.1
requests==2.23.0
retrying==1.3.3
scipy==1.5.2
Shapely==1.7.0
simplejson==3.16.0
sip==4.19.14
six==1.15.0
tornado==6.1
typing-extensions==3.10.0.2
urllib3==1.25.9
Werkzeug==2.0.1
wfastcgi==3.0.0
wxPython==4.0.7
xlrd==1.1.0
xlwt==1.3.0
zipp==3.5.0

7.以上资源下载地址:python实现图片验证码及html源代码-互联网文档类资源-优快云下载

8.完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值