首页  >  问答  >  正文

python selenium 获取图片验证码

我想缓存图片验证码到本地,然后让用户通过web服务看到图片手动打码登录。
由于考虑到正式运行是无界面的,所以无法使用selenium的截屏。
除了selenium截屏和右键方式,还有没有其他的办法?

目前想到了用js将验证码重新请求到放入canvas中再toDataURL成png的base64码输出到Dom再用selenium获取。
下面的代码测试用的是移动商城的登录入口验证码。

$('body').append('<canvas id="CAVASIMG"></canvas>');
var img=new Image();
img.src="http://shop.10086.cn/i/authImg";
var d=document.getElementById("CAVASIMG");
var cxt=d.getContext("2d");
img.onload = function(){
    d.width = img.width;d.height = img.height;
    cxt.drawImage(img,0,0);
    console.log(d.toDataURL('png'));
};

如果请求验证码的url与登录的url不同域的话就会报错跨域。
而且还需要测试这样拿到的验证码图片是否还存在当前会话有效期内。
请问上面的跨域问题该如何解决?

PHP中文网PHP中文网2685 天前1561

全部回复(4)我来回复

  • 欧阳克

    欧阳克2017-06-12 09:23:28

    你先抓包看看图片的请求路径,然后用requests下载图片就行了

    回复
    0
  • 漂亮男人

    漂亮男人2017-06-12 09:23:28

    楼上的是一种方法, 用selenium + PhantomJS也可以

    回复
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-12 09:23:28

    图片验证码 和 读取图片时的cokies是一体的

    只要保证回答的验证码和cokies相一致就行。

    回复
    0
  • 高洛峰

    高洛峰2017-06-12 09:23:28

    最后我采用的是js方式

    var img=document.getElementById('IMGCODEID');
    var d=document.createElement('CANVAS');
    var cxt=d.getContext('2d');
    d.width=img.width;d.height=img.height;
    cxt.drawImage(img,0,0);
    img.src=d.toDataURL('png');

    回复
    0
  • 取消回复