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.完。