用的是 Node ,验证码的图像识别部分打算用 tesseract.js 这个库,试了下成功率还是很高的,但是在获取验证码图片的时候遇到了麻烦。
页面登录需要验证码,看了下代码,是这么一段 src="/login/verificationCode"
,点击会切换,应该是 PHP 生成的图片,然后后端根据 Session 来判断填入的数字是否正确(是否在 Session 数组中)。现在问题来了,如何能获取这张图片然后让 tesseract.js 去调用?直接用地址(不行,乱码了,不乱码应该也不是一个 Session 中了吧?),或者下载下来,应该不是一个 Session 了吧?我看到很多网站的验证码都是这么做的,请老司机们带带路!
1
hanzichi OP 啊啊啊没人么
|
2
kulove 2016-11-10 13:52:00 +08:00
用 java 和 python 写过类似的,保存图片或直接读流 调用识别提交就好了,是同一个 session 的
|
3
golmic 2016-11-10 13:52:36 +08:00 via Android
有人,偶是专业做验证码识别的。直接 down 下验证码,然后识别了填上去不可以么?
|
4
kulove 2016-11-10 13:56:31 +08:00
```
def get_captcha(self, data, captcha_url): self._session.post(self.login_url, data=data) r = self._session.get(captcha_url) with open('image/captcha.gif', 'wb') as f: f.write(r.content) image = Image.open('image/captcha.gif') captcha = '' try: captcha = pytesseract.image_to_string(image, lang='eng') except Exception: pass if len(captcha) == 0: self.get_captcha(data, captcha_url) else: print('captcha:', captcha) # os.remove('image/captcha.gif') return captcha ``` 附上 python 代码, Node 不太了解,应该也差不多 |
5
MuaGeWang 2016-11-10 14:00:22 +08:00
人肉先登录一次,然后 node 里面请求字节带上 cookie
|
6
hanzichi OP @kulove 你的思路和我类似。假设我已经保存图片,然后带着验证码去模拟登录 login.php ,这时 login.php 又加载了验证码,这个 Session 和之前保存图片获取的验证码,又不是一个 Session 了,于是失败了 ... 求指导,是不是哪里姿势有误
|
9
kulove 2016-11-10 15:01:59 +08:00
@hanzichi 先拿到登录以及获取验证码的 url ,模拟进入登录界面拿到 session ,访问获取验证码的 url 下载识别,登录提交参数,没有地方会重复获取验证码吧?
|
10
hanzichi OP @kulove 这个登录页面和表单提交地址是一样的,假设都是 login.php ,我怀疑模拟 post 的时候,因为是一个地址,这个时候 Session 变了,也就是说提交的验证码是之前一次的验证码了
|
12
hanzichi OP @kulove 打印了一发返回信息,发现验证码通过了, username 有点问题, username 不知怎么处理过了,我再看看,谢谢指导 @@
|
13
hanzichi OP @kulove 现在的问题是 username 不正确, username 是中文,页面是 GBK ,看请求,是这样的 `username:(unable to decode value)`,看 raw ,不知道被怎么编码了。现在我是用中文发送或者用 raw 里被编码的发送,都提示用户名错误,什么原因?而且我在页面里也没看到编码的过程 ... 求指导
|
15
hanzichi OP @kulove 试了下 urlencode 后的这个字符串,确实就是实际请求的字符串,带上 urlencode 后的字符串和直接拼上实际请求的这个字符串,效果应该是一样的吧?都提示用户名错误 ... 是不是还有其他编码问题要注意 。。。
|
16
isbase 2016-11-10 21:08:38 +08:00 via Android
人工打码平台
|
17
hanzichi OP @hanzichi 参考了这个帖子 <https://cnodejs.org/topic/56d2e1c69f876b7e665857c9>,用 request 的 write 方法发送中文参数,可以了。不过出现了另一个问题,用 Node 将直接读流保存图片,无法用 tesseract.js 解析,而直接在页面上右键复制验证码图片,然后保存,就可以解析了。。囧
|