鱼C论坛

 找回密码
 立即注册
查看: 6231|回复: 15

[技术交流] Python3简单验证码识别

[复制链接]
发表于 2016-6-13 15:48:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
说好的pillow库的实战篇 这次是识别简单的验证码, 先贴上代码:
  1. from PIL import Image
  2. import requests
  3. import re

  4. splitter = re.compile(r'\d{30}')  # 分割二值化后的图片


  5. # distance('11110000', '00000000')
  6. # 比较两个字符串有多少位不同, 返回不同的位数
  7. def distance(string1, string2):
  8.     d_str1 = len(string1)
  9.     d_str2 = len(string2)
  10.     d_arr = [[0] * d_str2 for i in range(d_str1)]
  11.     for i in range(d_str1):
  12.         for j in range(d_str2):
  13.             if string1[i] == string2[j]:
  14.                 if i == 0 and j == 0:
  15.                     d_arr[i][j] = 0
  16.                 elif i != 0 and j == 0:
  17.                     d_arr[i][j] = d_arr[i - 1][j]
  18.                 elif i == 0 and j != 0:
  19.                     d_arr[i][j] = d_arr[i][j - 1]
  20.                 else:
  21.                     d_arr[i][j] = d_arr[i - 1][j - 1]
  22.             else:
  23.                 if i == 0 and j == 0:
  24.                     d_arr[i][j] = 1
  25.                 elif i != 0 and j == 0:
  26.                     d_arr[i][j] = d_arr[i - 1][j] + 1
  27.                 elif i == 0 and j != 0:
  28.                     d_arr[i][j] = d_arr[i][j - 1] + 1
  29.                 else:
  30.                     d_arr[i][j] = min(d_arr[i][j - 1], d_arr[i - 1][j], d_arr[i - 1][j - 1]) + 1

  31.     current = max(d_arr[d_str1 - 1][d_str2 - 1], abs(d_str2 - d_str1))
  32.     return current


  33. # 去除字符串里面连续的1
  34. def no_one(string):
  35.     n_arr = splitter.findall(string)
  36.     n_arr = filter(lambda each_str: each_str != '111111111111111111111111111111', n_arr)
  37.     n_result = ''
  38.     for n_each in n_arr:
  39.         n_result += str(n_each)

  40.     return n_result


  41. opener = requests.session()
  42. res = opener.get('http://60.211.254.236:8402/Ajax/ValidCodeImg.ashx').content

  43. with open('verify.gif', 'wb') as v:
  44.     v.write(res)

  45. img = Image.open('verify.gif')
  46. img = img.convert('L')

  47. size = img.size
  48. # img = img.point(table, '1')
  49. img_arr = img.load()

  50. # img.save('after.gif')
  51. inc = 0

  52. str1 = ''
  53. str2 = ''
  54. str3 = ''
  55. cur_str = ''
  56. for x in range(size[0]):
  57.     for y in range(size[1]):
  58.         if img_arr[x, y] > 210:
  59.             cur_str += '1'
  60.         else:
  61.             cur_str += '0'
  62.         # print(img_arr[i, j], end='')
  63.         # cur_str += str(img_arr[x, y])

  64.     inc += 1
  65.     if inc == 18:
  66.         str1 = cur_str
  67.         cur_str = ''
  68.     elif inc == 36:
  69.         str2 = cur_str
  70.         cur_str = ''
  71.     elif inc == 54:
  72.         str3 = cur_str
  73.         cur_str = ''

  74. str1 = str1[:-60]
  75. str2 = str2[:-60]
  76. str3 = str3[:-60]
  77. str1 = no_one(str1)
  78. str2 = no_one(str2)
  79. str3 = no_one(str3)
  80. str1 = str1.strip('1')
  81. str2 = str2.strip('1')
  82. str3 = str3.strip('1')

  83. with open('./dict/plus') as plus:
  84.     with open('./dict/minus') as minus:
  85.         p = plus.read()
  86.         m = minus.read()
  87.         is_add = 1 if distance(p, str2) < distance(m, str2) else 0

  88. arr1 = []
  89. arr3 = []

  90. for each in range(1, 10):
  91.     with open('./dict/{}'.format(each)) as f:
  92.         ff = f.read()
  93.         arr1.append([each, distance(ff, str1)])
  94.         arr3.append([each, distance(ff, str3)])

  95. arr1 = sorted(arr1, key=lambda item: item[1])
  96. arr3 = sorted(arr3, key=lambda item: item[1])
  97. result = arr1[0][0] + arr3[0][0] if is_add else arr1[0][0] - arr3[0][0]
  98. print(result)
复制代码


主要注释都写在了代码中, 涉及到的字库文件上传到了gitHub上, 我是链接

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
小甲鱼 + 5 + 5 + 3 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-13 22:12:21 | 显示全部楼层
请教一下楼主怎么安装那些模块。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-13 22:54:00 | 显示全部楼层
leozyre 发表于 2016-6-13 22:12
请教一下楼主怎么安装那些模块。。

pip
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 22:55:35 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-14 10:07:49 | 显示全部楼层
还没学到这
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-6 22:50:25 | 显示全部楼层
不错哈,下次贴个大图 or 动图演示程序就完美了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-11 20:43:16 | 显示全部楼层
楼主进步好快啊 15年底也是初学者吧???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-11 20:45:26 | 显示全部楼层
jin6220 发表于 2016-12-11 20:43
楼主进步好快啊 15年底也是初学者吧???

对, 自学半年, 目前主攻 php web 后端, Python 客户端开发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-11 21:19:01 | 显示全部楼层
hldh214 发表于 2016-12-11 20:45
对, 自学半年, 目前主攻 php web 后端, Python 客户端开发

趁着您在线,请问我做一个论坛发帖的,如果不登陆的话,直接把浏览器里的cookies放进date里,是不是也可以啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-11 21:25:25 | 显示全部楼层
jin6220 发表于 2016-12-11 21:19
趁着您在线,请问我做一个论坛发帖的,如果不登陆的话,直接把浏览器里的cookies放进date里,是不是也可 ...

还有其他因素, 要看具体情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-17 11:47:51 | 显示全部楼层
66666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-4 19:02:27 | 显示全部楼层
66666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-17 19:40:25 | 显示全部楼层
用captcha不香吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-11 23:52:18 | 显示全部楼层
厉害,可惜楼主没上号了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 08:30:02 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 08:35:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 15:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表