调用myqr库生成的二维码如何加密呢,pygame游戏编

#先导入模块fromMyQRimportmyqrmyqr.run(words='111',#扫描二维码后,显示的内容,或是跳转的链接version=5,#设置容错率level='H',#控制纠错水平,范围是L、M、Q、H,从左到右依次升高picture='weixin.gif',#图片所在目录,可以是动图colorized=True,#黑白(False)还是彩色(True)contrast=1.0,#用以调节图片的对比度,1.0表示原始图片。默认为1.0。brightness=1.0,#用来调节图片的亮度,用法同上。save_name='weixin.gif',#控制输出文件名,格式可以是.jpg,.png,.bmp,.gif)例如这个代码,我想用input语句输入密码,然后可以查看words里的内容。当然是在扫描以后

myqr.run中words参数无法输入中文
myqr.run(words='你好',version=6,picture='龙猫.gif' ,colorized=True,contrast=2.0,save_name='happy.gif'# raise ValueError('Wrong words! Make sure the characters are supported!')ValueError: Wrong words! Make sure the characters are supported!结果就是这样的

 本节实现一个在窗口中自由运动的小球程序,做了详细注释,不多做解释了。

前言
      最近在爬取数据的过程当中遇到验证码问题,正好遇到的是比较容易的,是字母和数字的验证码。本文就描述一下常规破解的方式。
主要内容包括:
图片二值化
图片降噪
图片切割
矢量计算
验证码获取
要破解验证码,第一步需要将我们看到的验证码下载下来。
我们点击我们要破解的验证码,然后按下F12,看一下浏览器提交的请求,可以看到验证码的图片。

 代码:

然后我们写一个captchaDownload.py的程序:

/* ---示例代码----*/
 
import urllib.request
from PIL import Image
import io
 
imagePath = 'D:/Yonyou/验证码yy/'
 
for count in range(0,1000):
    checkCodeUrl = ''
    
    headers = {'Referer':'
    headers['Host'] = 'euc.yonyoucloud.com'
    headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
    headers['Connection'] = 'keep-alive'
    
    request = urllib.request.Request(checkCodeUrl)
    res = urllib.request.urlopen(request).read()
    
    #print(res)
    
    image = Image.open(io.BytesIO(res))
    fullName = imagePath 'CheckCode' str(count) '.jpg'
    image.save(fullName)
    count = 1  

[python]
# -*- coding:utf-8 -*-  
 
import sys 
 
import pygame 
from pygame.locals import * 
 
def play_ball(): 
     
    pygame.init() 
     
    #窗口大小  
    window_size = (width, height) =(700, 500) 
     
    #小球运行偏移量[水平,垂直],值越大,移动越快  
    speed = [1, 1] 
     
    #窗口背景色RGB值  
    color_black = (0, 0, 139) 
     
    #设置窗口模式  
    screen = pygame.display.set_mode(window_size) 
     
    #设置窗口标题  
    pygame.display.set_caption('运动的小球') 
     
    #加载小球图片  
    ball_image = pygame.image.load('ball.gif') 
     
    #获取小球图片的区域开状  
    ball_rect = ball_image.get_rect() 
     
    while True: 
         
        #退出事件处理  
        for event in pygame.event.get(): 
            if event.type == pygame.QUIT: 
                pygame.quit() 
                sys.exit() 
         
        #使小球移动,速度由speed变量控制  
        ball_rect = ball_rect.move(speed) 
         
        #当小球运动出窗口时,重新设置偏移量  
        if (ball_rect.left < 0) or (ball_rect.right > width): 
            speed[0] =- speed[0] 
        if (ball_rect.top < 0) or (ball_rect.bottom > height): 
            speed[1] =- speed[1] 
         
        #填充窗口背景  
        screen.fill(color_black) 
         
        #在背景Surface上绘制 小球  
        screen.blit(ball_image, ball_rect) 
         
        #更新窗口内容  
        pygame.display.update() 
         
if __name__ == '__main__': 
    play_ball() 
# -*- coding:utf-8 -*-

/* ---示例代码----*/

运行以上代码以后,在验证码yy文件夹下就下载了100个验证码图片。如下图:

这样,验证码图片就准备好了。
降噪及切割
可以看到字母和数字的背后有很多噪音,首先要考虑去除这些噪音。

import sys

可以参考prepareCaptcha.py文件。

/* ---示例代码----*/
 
from PIL import Image
 
 
imagePath = 'D:/验证码yy/'
 
count = 0
for i in range(339,984):
    imageFile = 'CheckCode' str(i) '.jpg'
    image = Image.open(str(imagePath imageFile))
    imageGray = image.convert('L') #转化为灰度
    #降低噪音,同时转化成二进制
    threshold = 75
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
            
    out = imageGray.point(table,'1')
    #转回RGB格式
    img2 = out.convert('L')
    
    #截取字符
    inletter = False
    foundletter = False
    start = 0
    end = 0
    letters = []
    
    for x in range(0,img2.width):
        for y in range(0,img2.height):
            pix = img2.getpixel((x,y))
            if pix != 255:
                inletter = True
                
        if foundletter == False and inletter == True:
            foundletter = True
            start = x
            
        if foundletter == True and inletter == False:
            foundletter = False
            end = x
            letters.append((start,end))
            
        inletter = False
    
    #只保留切割后最大的四个图片
    lens = []
    if len(letters)>4:
        for letter in letters:
            temp = letter[1]-letter[0]
            lens.append(temp)
        #对宽度进行排序
        lens.sort(reverse=True)
        #小于第四个宽度的则删除
        for letter in letters:
            if (letter[1]-letter[0])<lens[3]:
                letters.remove(letter)
            
    savePath = 'D:/验证码yy/切割后图片/'
    for letter in letters:
        tmpImg = img2.crop((letter[0],0,letter[1],img2.height))
        fullName = 'D:/验证码yy/切割后图片/' str(count) '.jpg'
        tmpImg.save(fullName)
        count = 1
        print(count)      

import pygame
from pygame.locals import *

/* ---示例代码----*/

程序运行后,可以看到,切割好的图片。

字符匹配
因为这些字符采用都是标准字符,没有变形,所以我们可以将标准的文字库与截取的图片进行对比,对比的方式就是将截取图片和标准图片处理成两个向量,然后计算两个向量的相似度。计算的方式就是将每个图片与标准库中的每个图片计算cos值,最小的就是最接近的。
使用的是 AI与向量空间图像识别 将标准图片转换成向量坐标a,需要识别的图片字段为向量坐标b,cos(a,b)值越大说明夹角越小,越接近重合。
空间向量的计算公式:

def play_ball():
   
    pygame.init()
   
    #窗口大小
    window_size = (width, height) =(700, 500)
   
    #小球运行偏移量[水平,垂直],值越大,移动越快
    speed = [1, 1]
   
    #窗口背景色RGB值
    color_black = (0, 0, 139)
   
    #设置窗口模式
    screen = pygame.display.set_mode(window_size)
   
    #设置窗口标题
    pygame.display.set_caption('运动的小球')
   
    #加载小球图片
    ball_image = pygame.image.load('ball.gif')
   
    #获取小球图片的区域开状
    ball_rect = ball_image.get_rect()
   
    while True:
       
        #退出事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
       
        #使小球移动,速度由speed变量控制
        ball_rect = ball_rect.move(speed)
       
        #当小球运动出窗口时,重新设置偏移量
        if (ball_rect.left < 0) or (ball_rect.right > width):
            speed[0] =- speed[0]
        if (ball_rect.top < 0) or (ball_rect.bottom > height):
            speed[1] =- speed[1]
       
        #填充窗口背景 www.2cto.com
        screen.fill(color_black)
       
        #在背景Surface上绘制 小球
        screen.blit(ball_image, ball_rect)
       
        #更新窗口内容
        pygame.display.update()
       
if __name__ == '__main__':
    play_ball()

核心代码如下:

/* ---示例代码----*/
# 夹角公式
class VectorCompare:
    # 计算矢量大小
    # 计算平方和
    def magnitude(self, concordance):
        total = 0
        for word, count in concordance.items():
            total = count ** 2
        return math.sqrt(total)
 
    # 计算矢量之间的 cos 值
    def relation(self, concordance1, concordance2):
        topvalue = 0
        for word, count in concordance1.items():
            if word in concordance2:
                # 计算相乘的和
                topvalue = count * concordance2[word]
        return topvalue / (self.magnitude(concordance1) * self.magnitude(concordance2))
 
 
# 将图片转换为矢量
def buildvector(im):
    d1 = {}
    count = 0
    for i in im.getdata():
        d1[count] = i
        count = 1
    return d1

测试:

/* ---示例代码----*/

  动画程序,抓几张不同时刻的图片。

 
 1、
 图片 1
2、
图片 2
3、
图片 3  

摘自  Socrates的专栏  

代码: [python] # -*- coding:utf-8 -*- import sys import pygame from pygam...

本文由新葡萄京娱乐场8522发布于计算机编程,转载请注明出处:调用myqr库生成的二维码如何加密呢,pygame游戏编

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。