서문
인증코드는요? 나도 깰 수 있을까?
인증코드에 대해서는 자세히 설명하지 않겠습니다. 학생으로서 매일 가장 많이 접하는 것이 바로 다양한 인증코드입니다.
식별방법
여기서 시뮬레이션된 로그인은 다른 작업과 상관없이 입력된 인증 코드 이미지를 기반으로 답변 문자열을 반환하는 책임만 있습니다.
우리는 인증 코드가 간섭을 일으키기 위해 사진을 다채롭게 만들 것이라는 것을 알고 있으며, 먼저 이러한 간섭을 제거해야 합니다. 이 단계에서는 사진의 색상을 강화하고 대비를 높이는 등 지속적인 실험이 필요합니다. .도움이 될 수 있습니다.
사진에 대한 다양한 작업을 거쳐 마침내 간섭을 제거하는 더 완벽한 솔루션을 찾았습니다. 간섭을 제거한 후 최적의 상황에서 매우 순수한 흑백 문자 그림을 얻을 수 있음을 알 수 있습니다. 사진에 4개의 문자가 있습니다. 4개의 문자를 동시에 인식하는 것은 불가능합니다. 각 작은 그림에 한 문자만 포함되도록 사진을 잘라야 하며, 각 사진은 별도로 인식됩니다.
다음 단계는 텍스트를 인식하는 것입니다. , 우리는 먼저 획득한 작은 그림을 01로 표시되는 행렬로 변환합니다. 각 행렬은 문자를 나타냅니다.
예를 들어 숫자 6의 행렬
num_6=[ 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,0,0,0,0,0,0, 0,0,0,0,1,1,1,0,0,0,0,0,0, 0,0,0,1,1,1,0,0,0,0,0,0,0, 0,0,0,1,1,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,0,0,0,0, 0,1,1,0,0,0,0,1,1,1,0,0,0, 0,1,1,0,0,0,0,0,1,1,0,0,0, 0,1,1,0,0,0,0,0,1,1,0,0,0, 0,1,1,1,0,0,0,1,1,1,0,0,0, 0,0,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, ]
멀리서 보면 구별할 수 있습니다. 당신은 눈을 가늘게 뜨고 있습니다.
인증코드가 매우 규칙적이고 각 숫자의 위치가 고정되어 있기 때문에 머신러닝 알고리즘을 개입시킬 필요가 없고 간단하게 행렬비교가 가장 높은 행렬을 찾으면 됩니다. 구현된 모든 행렬 간의 유사성 여기에는 데이터가 간단하고 올바르게 식별될 수 있는 한 다양한 비교 방법이 있습니다.
이 시점에서 인증번호 식별 작업이 완료되었습니다.
이번에 수행한 인증코드 인식은 이미지 조작을 위해 Python의 PIL을 주로 사용합니다. 로그인을 시뮬레이션하고 인증코드를 자동으로 입력하는 모든 코드는 여기에서 확인하세요.
샘플 코드
# -*- coding: utf-8 -* import sys reload(sys) sys.setdefaultencoding( "utf-8" ) import re import requests import io import os import json from PIL import Image from PIL import ImageEnhance from bs4 import BeautifulSoup import mdata class Student: def __init__(self, user,password): self.user = str(user) self.password = str(password) self.s = requests.Session() def login(self): url = "http://202.118.31.197/ACTIONLOGON.APPPROCESS?mode=4" res = self.s.get(url).text imageUrl = 'http://202.118.31.197/'+re.findall('<img src="(.+?)" width="55"',res)[0] im = Image.open(io.BytesIO(self.s.get(imageUrl).content)) enhancer = ImageEnhance.Contrast(im) im = enhancer.enhance(7) x,y = im.size for i in range(y): for j in range(x): if (im.getpixel((j,i))!=(0,0,0)): im.putpixel((j,i),(255,255,255)) num = [6,19,32,45] verifyCode = "" for i in range(4): a = im.crop((num[i],0,num[i]+13,20)) l=[] x,y = a.size for i in range(y): for j in range(x): if (a.getpixel((j,i))==(0,0,0)): l.append(1) else: l.append(0) his=0 chrr=""; for i in mdata.data: r=0; for j in range(260): if(l[j]==mdata.data[i][j]): r+=1 if(r>his): his=r chrr=i verifyCode+=chrr # print "辅助输入验证码完毕:",verifyCode data= { 'WebUserNO':str(self.user), 'Password':str(self.password), 'Agnomen':verifyCode, } url = "http://202.118.31.197/ACTIONLOGON.APPPROCESS?mode=4" t = self.s.post(url,data=data).text if re.findall("images/Logout2",t)==[]: l = '[0,"'+re.findall('alert((.+?));',t)[1][1][2:-2]+'"]'+" "+self.user+" "+self.password+"\n" # print l # return '[0,"'+re.findall('alert((.+?));',t)[1][1][2:-2]+'"]' return [False,l] else: l = '登录成功 '+re.findall('! (.+?) ',t)[0]+" "+self.user+" "+self.password+"\n" # print l return [True,l] def getInfo(self): imageUrl = 'http://202.118.31.197/ACTIONDSPUSERPHOTO.APPPROCESS' data = self.s.get('http://202.118.31.197/ACTIONQUERYBASESTUDENTINFO.APPPROCESS?mode=3').text #学籍信息 data = BeautifulSoup(data,"lxml") q = data.find_all("table",attrs={'align':"left"}) a = [] for i in q[0]: if type(i)==type(q[0]) : for j in i : if type(j) ==type(i): a.append(j.text) for i in q[1]: if type(i)==type(q[1]) : for j in i : if type(j) ==type(i): a.append(j.text) data = {} for i in range(1,len(a),2): data[a[i-1]]=a[i] # data['照片'] = io.BytesIO(self.s.get(imageUrl).content) return json.dumps(data) def getPic(self): imageUrl = 'http://202.118.31.197/ACTIONDSPUSERPHOTO.APPPROCESS' pic = Image.open(io.BytesIO(self.s.get(imageUrl).content)) return pic def getScore(self): score = self.s.get('http://202.118.31.197/ACTIONQUERYSTUDENTSCORE.APPPROCESS').text #成绩单 score = BeautifulSoup(score, "lxml") q = score.find_all(attrs={'height':"36"})[0] point = q.text print point[point.find('平均学分绩点'):] table = score.html.body.table people = table.find_all(attrs={'height' : '36'})[0].string r = table.find_all('table',attrs={'align' : 'left'})[0].find_all('tr') subject = [] lesson = [] for i in r[0]: if type(r[0])==type(i): subject.append(i.string) for i in r: k=0 temp = {} for j in i: if type(r[0])==type(j): temp[subject[k]] = j.string k+=1 lesson.append(temp) lesson.pop() lesson.pop(0) return json.dumps(lesson) def logoff(self): return self.s.get('http://202.118.31.197/ACTIONLOGOUT.APPPROCESS').text if __name__ == "__main__": a = Student(20150000,20150000) r = a.login() print r[1] if r[0]: r = json.loads(a.getScore()) for i in r: for j in i: print i[j], print q = json.loads(a.getInfo()) for i in q: print i,q[i] a.getPic().show() a.logoff()
Python 시작을 위한 식별 및 인증 코드 소개와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!