验证码,特殊情况:我们用三十行代码破坏神经网络

   我不记得我是如何看过文章habr.com/ru/post/464337的,但它沉入我的大脑,直到最后一天才休息。几次我试图了解正在发生的事情,几次尝试使它起作用,但无济于事:我完全不了解神经网络,甚至像真正的程序员一样对程序不了解。
快乐验证码


   最后,几天前,我压制了python的发布,并决定了为什么不这样做等等。忘记了我在提到的文章中阅读的所有内容之后,我便按照自己的方式去做。
   记住无数解析的验证码,我建议您可以通过与遮罩的平凡比较来解决它们,此问题后来得到了证实。
   首先,手动组装了验证码(83件),并给了他们明显的名字。该脚本将它们转换为位图。

   验证码中的数字是两个高度,相差1个像素,宽度为三到四个面。所有验证码中所有字符的基线是相同的。事实证明,所有这些多样性都有一定的通用遮罩,通过比较可以唯一地标识人物。我从不同的验证码中删除了几个相同的数字(起初为5,然后又添加了1-2;从“ 4”开始花费的时间比其余时间更长)。在paint.net中,我将它们放在彼此的顶部,并得到了每个数字的所有面都通用的蒙版。

   我后来在批量处理中发现了唯一的问题,但成功绕过了它
用拐杖
   , — «1», «2» .. «9». , , «4», «4», «1». , -, «123456789» «423156789» -, «4» , «1».

   除了这种微小的误解之外,噪声完全不会干扰。此阶段的结果是一组9个蒙版。两个嵌套循环,瞧!-我所有的83个验证码都被认可!

   

   然后出现了一个问题:从哪里获取大量的验证码进行验证。我从提到的文章中下载了“ 29,000个验证码”。
但是,事实证明这是浪费时间。
   - (, -, .. ), : : 6503 , 5420 , 760 .. – .. 14882, , , .
-, – -, – . PNG, – JPG, , . , – «”” ».

   因此,我不得不自己揭露Google并挖掘出完美的验证码:每晚积累3224个文件,其中包括49个完全空的文件,后来才发现。谢谢Ganesha提供的代码

   验证码的识别实际上适合26行无聊的python代码。在外部模块中,仅需要PIL。在旧版Core 2“四核四演出”上,速度约为每分钟1000验证码(每分钟1000验证码)。在更合适的八流i5上,速度显然要快得多,尽管这当然不在线程中。识别率100%或非常接近:抽查显示没有错误。

   当然,从神经网络和其他区块链的角度来看,所有这些都不是很有趣,但是与先前提出的选项相比,它具有非常明显的优势:速度和准确性。验证码参数的任何更改(耳机或字体大小,噪音类型等)也确实是这样。-将导致我的决定完全无法操作。

从Yandex.Disk(14MB)下载带有验证码的存档。

资源
from PIL import Image, ImageTk

def recognize(filepath):
  Zlist = [] # [(x1, z1), (x2, z2), (x3, z3), etc.] - position and digit
  captcha = ""
  originalimage = Image.open(filepath).convert('L').point(lambda x : 255 if x > 20 else 0, mode='1').convert('1').convert('RGBA')
  if originalimage.getextrema() == ((0, 0), (0, 0), (0, 0), (255, 255)):
    return("empty image")
  for z in [4, 2, 3, 1, 5, 6, 7, 8, 9]: # reorder to exclude false 1 on 4
    mask = Image.open('mask' + str(z) + '.png').convert('RGBA')
    previ = 0
    for i in range(15, 120): # no digit in left part
      resultimage = Image.alpha_composite(originalimage.crop((i, 0, i + 30, 0 + 50)), mask)
      if resultimage.getextrema() == ((0, 0), (0, 0), (0, 0), (255, 255)):
        if z == 4: # delete 4 to exclude false 1 on 4
          maskx = Image.open('mask4x.png').convert('RGBA') 
          originalimage.paste(Image.alpha_composite(originalimage.crop((i, 0, i + 30, 0 + 50)), maskx), (i, 0))
        if previ == 0 or i > previ + 15: #no digit closer then 15 px
          Zlist.append((i, z))
          if len(Zlist) == 5:
              Zlist.sort()
              for z in Zlist:
                captcha = captcha + str(z[1])
              return(captcha)
          previ = i
          i = i + 15 #skip a little
  Zlist.sort()
  return(str(Zlist)) #if less then 5 digits recognized
	
def main():
  captcha = recognize(entry.path)
#----------------------------------------------#
#          #
#----------------------------------------------#

main()




截至2020年2月13日更新。
   这是怎么回事?不是为了运动识别保存的图像?不,所有这些纯粹是出于务实的目的。
   准备工作的解决方案。 -本地http识别服务器以及Chrome扩展程序。
   到目前为止,唯一可以做的(我希望可以)是将验证码自动插入正确的位置。计划:
  -清理站点界面,保留必要的最低限度;
  -查看信息时自动更新验证码,例如一个验证码只能打开4个对象。
  -一次下载所有准备好的语句,而不一次下载一个。

2020年3月5日更新。
   准备工作的解决方案。-本地http识别服务器以及Chrome扩展程序。
   更新了Chrome扩展程序。现在,除了验证码自动替换之外,它还可以:
 1.打开包含房地产对象信息的页面时,扩展有关权利的信息;
 2.从这些页面收集信息以进行进一步处理。
   注释的屏幕快照habr.com/post/488018/#comment_21360646

截至2020年 4月17日的更新。
   从列表中自动下单 -由于对订购语句频率的限制-5分钟内发送1条语句。截图中的评论

All Articles