Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in Identifikations- und Verifizierungscodes für den Einstieg in Python

Einführung in Identifikations- und Verifizierungscodes für den Einstieg in Python

高洛峰
高洛峰Original
2017-03-06 11:28:291430Durchsuche

Vorwort

Bestätigungscode? Kann ich es auch knacken?

Ich werde nicht näher auf Verifizierungscodes eingehen. Im Leben von Menschen tauchen von Zeit zu Zeit verschiedene Verifizierungscodes auf, mit denen man am häufigsten in Berührung kommt den Verifizierungscode, wie zum Beispiel den folgenden Verifizierungscode:

Einführung in Identifikations- und Verifizierungscodes für den Einstieg in Python

Identifikationsmethode

Die simulierte Anmeldung umfasst komplizierte Schritte. Unabhängig von anderen Vorgängen sind wir hier nur für die Rückgabe einer Antwortzeichenfolge basierend auf einem Eingabebestätigungscodebild verantwortlich.

Wir wissen, dass der Bestätigungscode das Bild bunt macht, um Störungen zu erzeugen, und wir müssen diese Störungen zunächst entfernen. Dieser Schritt erfordert kontinuierliches Experimentieren, die Verbesserung der Bildfarbe, die Erhöhung des Kontrasts usw . kann helfen.

Einführung in Identifikations- und Verifizierungscodes für den Einstieg in Python

Einführung in Identifikations- und Verifizierungscodes für den Einstieg in Python

Nach verschiedenen Bearbeitungen der Bilder habe ich endlich eine perfektere Lösung zur Beseitigung von Störungen gefunden. Es ist ersichtlich, dass wir nach dem Entfernen der Interferenzen unter optimalen Umständen ein sehr reines Schwarz-Weiß-Zeichenbild erhalten. Ein Bild enthält vier Zeichen. Es ist unmöglich, alle vier Zeichen gleichzeitig zu erkennen. Das Bild muss so zugeschnitten werden, dass jedes kleine Bild nur ein Zeichen enthält, und dann wird jedes Bild einzeln erkannt.

Der nächste Schritt besteht darin, den Text zu erkennen Wir wandeln zunächst das erhaltene kleine Bild in eine durch 01 dargestellte Matrix um, wobei jede Matrix ein Zeichen darstellt.

Zum Beispiel die Matrix der Zahl Sechs

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,
]

Aus der Ferne betrachtet kann man sie noch unterscheiden es, wenn Sie Ihre Augen zusammenkneifen.

Da der Bestätigungscode sehr regelmäßig ist und die Position jeder Zahl festgelegt ist, ist kein maschineller Lernalgorithmus erforderlich, sondern nur ein einfacher Matrixvergleich. Finden Sie einfach die Matrix mit der höchsten Ähnlichkeit zwischen allen implementierten Matrizen. Es gibt jedoch verschiedene Vergleichsmethoden, solange die Daten einfach sind und korrekt identifiziert werden können.

An diesem Punkt ist unsere Arbeit zur Identifizierung des Bestätigungscodes abgeschlossen.

Die diesmal durchgeführte Bestätigungscode-Erkennung verwendet hauptsächlich Pythons PIL zur Bildmanipulation. Alle Codes zur Simulation der Anmeldung und zum automatischen Ausfüllen des Bestätigungscodes finden Sie hier:

Beispielcode

# -*- 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 = &#39;http://202.118.31.197/&#39;+re.findall(&#39;<img src="(.+?)" width="55"&#39;,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= {
  &#39;WebUserNO&#39;:str(self.user),
  &#39;Password&#39;:str(self.password),
  &#39;Agnomen&#39;: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 = &#39;[0,"&#39;+re.findall(&#39;alert((.+?));&#39;,t)[1][1][2:-2]+&#39;"]&#39;+" "+self.user+" "+self.password+"\n"
   # print l
   # return &#39;[0,"&#39;+re.findall(&#39;alert((.+?));&#39;,t)[1][1][2:-2]+&#39;"]&#39;
   return [False,l]
  else:
   l = &#39;登录成功 &#39;+re.findall(&#39;! (.+?) &#39;,t)[0]+" "+self.user+" "+self.password+"\n"
   # print l
   return [True,l]

 def getInfo(self):
  imageUrl = &#39;http://202.118.31.197/ACTIONDSPUSERPHOTO.APPPROCESS&#39;
  data = self.s.get(&#39;http://202.118.31.197/ACTIONQUERYBASESTUDENTINFO.APPPROCESS?mode=3&#39;).text #学籍信息
  data = BeautifulSoup(data,"lxml")
  q = data.find_all("table",attrs={&#39;align&#39;:"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[&#39;照片&#39;] = io.BytesIO(self.s.get(imageUrl).content)
  return json.dumps(data)

 def getPic(self):
  imageUrl = &#39;http://202.118.31.197/ACTIONDSPUSERPHOTO.APPPROCESS&#39;
  pic = Image.open(io.BytesIO(self.s.get(imageUrl).content))
  return pic

 def getScore(self):
   score = self.s.get(&#39;http://202.118.31.197/ACTIONQUERYSTUDENTSCORE.APPPROCESS&#39;).text #成绩单
   score = BeautifulSoup(score, "lxml")
   q = score.find_all(attrs={&#39;height&#39;:"36"})[0]
   point = q.text
   print point[point.find(&#39;平均学分绩点&#39;):]
   table = score.html.body.table
   people = table.find_all(attrs={&#39;height&#39; : &#39;36&#39;})[0].string
   r = table.find_all(&#39;table&#39;,attrs={&#39;align&#39; : &#39;left&#39;})[0].find_all(&#39;tr&#39;)
   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(&#39;http://202.118.31.197/ACTIONLOGOUT.APPPROCESS&#39;).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()

Weitere Artikel zur Einführung von Identifikations- und Verifizierungscodes für den Einstieg in Python finden Sie auf der chinesischen PHP-Website !

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn