如何模拟登录有验证码的网站?

2016-11-10 11:49:23 +08:00
 hanzichi

用的是 Node ,验证码的图像识别部分打算用 tesseract.js 这个库,试了下成功率还是很高的,但是在获取验证码图片的时候遇到了麻烦。

页面登录需要验证码,看了下代码,是这么一段 src="/login/verificationCode",点击会切换,应该是 PHP 生成的图片,然后后端根据 Session 来判断填入的数字是否正确(是否在 Session 数组中)。现在问题来了,如何能获取这张图片然后让 tesseract.js 去调用?直接用地址(不行,乱码了,不乱码应该也不是一个 Session 中了吧?),或者下载下来,应该不是一个 Session 了吧?我看到很多网站的验证码都是这么做的,请老司机们带带路!

5953 次点击
所在节点    问与答
21 条回复
hanzichi
2016-11-10 13:03:48 +08:00
啊啊啊没人么
kulove
2016-11-10 13:52:00 +08:00
用 java 和 python 写过类似的,保存图片或直接读流 调用识别提交就好了,是同一个 session 的
golmic
2016-11-10 13:52:36 +08:00
有人,偶是专业做验证码识别的。直接 down 下验证码,然后识别了填上去不可以么?
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 不太了解,应该也差不多
MuaGeWang
2016-11-10 14:00:22 +08:00
人肉先登录一次,然后 node 里面请求字节带上 cookie
hanzichi
2016-11-10 14:58:43 +08:00
@kulove 你的思路和我类似。假设我已经保存图片,然后带着验证码去模拟登录 login.php ,这时 login.php 又加载了验证码,这个 Session 和之前保存图片获取的验证码,又不是一个 Session 了,于是失败了 ... 求指导,是不是哪里姿势有误
hanzichi
2016-11-10 14:59:10 +08:00
@golmic 有个 Session 的问题,见上
hanzichi
2016-11-10 14:59:46 +08:00
@MuaGeWang 这样确实可以,不过要每天换 cookie ,比较麻烦
kulove
2016-11-10 15:01:59 +08:00
@hanzichi 先拿到登录以及获取验证码的 url ,模拟进入登录界面拿到 session ,访问获取验证码的 url 下载识别,登录提交参数,没有地方会重复获取验证码吧?
hanzichi
2016-11-10 15:10:56 +08:00
@kulove 这个登录页面和表单提交地址是一样的,假设都是 login.php ,我怀疑模拟 post 的时候,因为是一个地址,这个时候 Session 变了,也就是说提交的验证码是之前一次的验证码了
kulove
2016-11-10 15:35:50 +08:00
@hanzichi 是不是模拟参数的时候漏掉了什么?可以登录就能模拟的
hanzichi
2016-11-10 15:41:36 +08:00
@kulove 打印了一发返回信息,发现验证码通过了, username 有点问题, username 不知怎么处理过了,我再看看,谢谢指导 @@
hanzichi
2016-11-10 17:26:10 +08:00
@kulove 现在的问题是 username 不正确, username 是中文,页面是 GBK ,看请求,是这样的 `username:(unable to decode value)`,看 raw ,不知道被怎么编码了。现在我是用中文发送或者用 raw 里被编码的发送,都提示用户名错误,什么原因?而且我在页面里也没看到编码的过程 ... 求指导
kulove
2016-11-10 17:53:40 +08:00
@hanzichi 看下是不是 UrlEncode
hanzichi
2016-11-10 19:00:53 +08:00
@kulove 试了下 urlencode 后的这个字符串,确实就是实际请求的字符串,带上 urlencode 后的字符串和直接拼上实际请求的这个字符串,效果应该是一样的吧?都提示用户名错误 ... 是不是还有其他编码问题要注意 。。。
isbase
2016-11-10 21:08:38 +08:00
人工打码平台
hanzichi
2016-11-10 22:25:54 +08:00
@hanzichi 参考了这个帖子 <https://cnodejs.org/topic/56d2e1c69f876b7e665857c9>,用 request 的 write 方法发送中文参数,可以了。不过出现了另一个问题,用 Node 将直接读流保存图片,无法用 tesseract.js 解析,而直接在页面上右键复制验证码图片,然后保存,就可以解析了。。囧
kukat
2016-11-11 01:09:35 +08:00
imagemagick 把图片转存一下
@hanzichi
kulove
2016-11-11 09:26:35 +08:00
@hanzichi 还是觉得你参数哪里写错了..
hanzichi
2016-11-11 10:44:30 +08:00
@kulove 验证码应该没问题了,现在是 download 下来验证码图片,但是 tesseract.js 识别不了,如果是直接在页面上右键复制验证码图片,然后保存,就可以解析了。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/319504

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX