WEB——驗證碼生成、IO儲存、二進位制傳輸
阿新 • • 發佈:2018-11-09
執行下段程式,瀏覽器訪問127.0.0.1:8000
即可在頁面展現驗證碼
程式碼包含了驗證碼的生成 io儲存 二進位制資料傳輸等知識點
# coding=utf-8
# wsgi_server.py
import random
import string
import base64
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
from wsgiref.simple_server import make_server
class Captcha(object):
def __init__ (self, number=4, size_x=150, size_y=40, fontsize=35, line_num=2):
self.number = number # 生成幾位數的驗證碼
self.size = (size_x, size_y) # 驗證碼圖片的寬度和高度
self.fontsize = fontsize # 驗證碼字型大小
self.line_number = line_num # 加入干擾線的條數
self.SOURCE = list(string.ascii_letters + "123456789" ) # 構建一個驗證碼源文字,包括大小寫數字
###################################生成干擾元素######################################
def __gene_line(self, draw, width, height):
# 開始點 X,Y
begin = (random.randint(0, width), random.randint(0, height))
# 結束點
end = (random.randint(0, width), random. randint(0, height))
# 畫線條,開始 結束點 線條顏色 線條寬度
draw.line([begin, end], fill=self.__gene_random_color(), width=2)
def __gene_points(self, draw, point_chance, width, height):
# 大小限制
chance = min(50, max(0, int(point_chance)))
for w in range(width):
for h in range(height):
tmp = random.randint(0, 100)
if tmp > 100 - chance:
draw.point((w, h), fill=self.__gene_random_color())
#########################################################################
############################# 生成隨機的顏色 ###############################
# 起始顏色 最終顏色
def __gene_random_color(cls, start=0, end=255):
# 初始化隨機數
random.seed()
# 按範圍生成隨機輸R G B
return (random.randint(start, end), random.randint(start, end), random.randint(start, end))
# 隨機選擇一個字型
def __gene_random_font(cls):
fonts = [
# 字型檔案路徑
'/usr/share/fonts/truetype/TTF/SourceCodePro-It.ttf',
]
# 隨機選一個 字型
font = random.choice(fonts)
return font
# 用來隨機生成一個字串(包括英文和數字)
def gene_text(self):
# cls.SOURCE生成list A-Z a-z 0-9 number是生成驗證碼的位數
return ''.join(random.sample(self.SOURCE, self.number))
# 生成驗證碼
def gene_graph_captcha(self):
# 驗證碼圖片的寬和高
width, height = self.size
# 建立圖片
# R:Red(紅色)0-255 G:G(綠色)0-255 B:B(藍色)0-255 A:Alpha(透明度),添加了A,則就只能生成png圖片
image = Image.new('RGB', (width, height), self.__gene_random_color(0, 100))
# 驗證碼的字型 隨機產生字型 字型大小
font = ImageFont.truetype(self.__gene_random_font(), self.fontsize)
# 建立畫筆
draw = ImageDraw.Draw(image)
# 隨機生成4為字串
text = self.gene_text()
# 獲取字型的尺寸
font_width, font_height = font.getsize(text)
# 填充字串 x y座標 文字 字型 字型顏色
draw.text(((width - font_width) / 2, (height - font_height) / 2),
text, font=font, fill=self.__gene_random_color(150, 255))
# 繪製干擾線 繪製多少條幹擾線
for x in range(0, self.line_number):
self.__gene_line(draw, width, height)
# 繪製噪點
self.__gene_points(draw, 10, width, height)
return text, image
# 開啟圖片驗證碼
def auth_code():
# 獲取驗證碼圖片,和驗證碼值
captcha=Captcha()
code, img=captcha.gene_graph_captcha()
#若要儲存圖片檔案 此處 img.save(path)
buf = BytesIO() # 構建一個輸入輸出流
img.save(buf, "jpeg") # 將圖片儲存到輸入輸出流,也就是記憶體中
bur_str = buf.getvalue() # 獲得輸入輸出流裡面的內容
# Base64是一種任意二進位制到文字字串的編碼方法,常用於在URL、Cookie、網頁中傳輸少量二進位制資料。
data = str(base64.b64encode(bur_str))
return data
##################################為方便演示寫一個簡單的web程式##########################
def application(env, start_response):
start_response('200 ok', [('Content-Type', 'text/html')])
data = auth_code()
res = "<img src= \"data:image/jpg;base64,%s\" >" % data
print res
return res
httpd = make_server('', 8000, application)
print "Serving is running..."
httpd.serve_forever()