V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hanzichi
V2EX  ›  问与答

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

  •  
  •   hanzichi · 2016-11-10 11:49:23 +08:00 · 5936 次点击
    这是一个创建于 2730 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2016-11-10 22:33:18 +08:00
    现在问题已经变了,变成用 Node 下载 PHP 生成的验证码图片,无法用 tesseract.js 来解析了,但是相同的图片,客户端右键复制图片,然后保存,就可以解析了 。。。
    21 条回复    2016-11-11 10:44:57 +08:00
    hanzichi
        1
    hanzichi  
    OP
       2016-11-10 13:03:48 +08:00
    啊啊啊没人么
    kulove
        2
    kulove  
       2016-11-10 13:52:00 +08:00
    用 java 和 python 写过类似的,保存图片或直接读流 调用识别提交就好了,是同一个 session 的
    golmic
        3
    golmic  
       2016-11-10 13:52:36 +08:00 via Android
    有人,偶是专业做验证码识别的。直接 down 下验证码,然后识别了填上去不可以么?
    kulove
        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 不太了解,应该也差不多
    MuaGeWang
        5
    MuaGeWang  
       2016-11-10 14:00:22 +08:00
    人肉先登录一次,然后 node 里面请求字节带上 cookie
    hanzichi
        6
    hanzichi  
    OP
       2016-11-10 14:58:43 +08:00
    @kulove 你的思路和我类似。假设我已经保存图片,然后带着验证码去模拟登录 login.php ,这时 login.php 又加载了验证码,这个 Session 和之前保存图片获取的验证码,又不是一个 Session 了,于是失败了 ... 求指导,是不是哪里姿势有误
    hanzichi
        7
    hanzichi  
    OP
       2016-11-10 14:59:10 +08:00
    @golmic 有个 Session 的问题,见上
    hanzichi
        8
    hanzichi  
    OP
       2016-11-10 14:59:46 +08:00
    @MuaGeWang 这样确实可以,不过要每天换 cookie ,比较麻烦
    kulove
        9
    kulove  
       2016-11-10 15:01:59 +08:00
    @hanzichi 先拿到登录以及获取验证码的 url ,模拟进入登录界面拿到 session ,访问获取验证码的 url 下载识别,登录提交参数,没有地方会重复获取验证码吧?
    hanzichi
        10
    hanzichi  
    OP
       2016-11-10 15:10:56 +08:00
    @kulove 这个登录页面和表单提交地址是一样的,假设都是 login.php ,我怀疑模拟 post 的时候,因为是一个地址,这个时候 Session 变了,也就是说提交的验证码是之前一次的验证码了
    kulove
        11
    kulove  
       2016-11-10 15:35:50 +08:00
    @hanzichi 是不是模拟参数的时候漏掉了什么?可以登录就能模拟的
    hanzichi
        12
    hanzichi  
    OP
       2016-11-10 15:41:36 +08:00
    @kulove 打印了一发返回信息,发现验证码通过了, username 有点问题, username 不知怎么处理过了,我再看看,谢谢指导 @@
    hanzichi
        13
    hanzichi  
    OP
       2016-11-10 17:26:10 +08:00
    @kulove 现在的问题是 username 不正确, username 是中文,页面是 GBK ,看请求,是这样的 `username:(unable to decode value)`,看 raw ,不知道被怎么编码了。现在我是用中文发送或者用 raw 里被编码的发送,都提示用户名错误,什么原因?而且我在页面里也没看到编码的过程 ... 求指导
    kulove
        14
    kulove  
       2016-11-10 17:53:40 +08:00
    @hanzichi 看下是不是 UrlEncode
    hanzichi
        15
    hanzichi  
    OP
       2016-11-10 19:00:53 +08:00
    @kulove 试了下 urlencode 后的这个字符串,确实就是实际请求的字符串,带上 urlencode 后的字符串和直接拼上实际请求的这个字符串,效果应该是一样的吧?都提示用户名错误 ... 是不是还有其他编码问题要注意 。。。
    isbase
        16
    isbase  
       2016-11-10 21:08:38 +08:00 via Android
    人工打码平台
    hanzichi
        17
    hanzichi  
    OP
       2016-11-10 22:25:54 +08:00
    @hanzichi 参考了这个帖子 <https://cnodejs.org/topic/56d2e1c69f876b7e665857c9>,用 request 的 write 方法发送中文参数,可以了。不过出现了另一个问题,用 Node 将直接读流保存图片,无法用 tesseract.js 解析,而直接在页面上右键复制验证码图片,然后保存,就可以解析了。。囧
    kukat
        18
    kukat  
       2016-11-11 01:09:35 +08:00
    imagemagick 把图片转存一下
    @hanzichi
    kulove
        19
    kulove  
       2016-11-11 09:26:35 +08:00
    @hanzichi 还是觉得你参数哪里写错了..
    hanzichi
        20
    hanzichi  
    OP
       2016-11-11 10:44:30 +08:00
    @kulove 验证码应该没问题了,现在是 download 下来验证码图片,但是 tesseract.js 识别不了,如果是直接在页面上右键复制验证码图片,然后保存,就可以解析了。。
    hanzichi
        21
    hanzichi  
    OP
       2016-11-11 10:44:57 +08:00
    @kukat 转存?有啥用 ...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2194 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:53 · PVG 14:53 · LAX 23:53 · JFK 02:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.