利用jsoup爬页面的自动答题系统

 访问https网页的解决方案  http://espace.iteye.com/blog/1917574 

 这个比较麻烦,针对网站利用其证书  http://stackoverflow.com/questions/7744075/how-to-connect-via-https-using-jsoup

解决访问网页javascript部分 

利用jsoup爬页面的自动答题系统_第1张图片

 

获取验证码阶段

 

注意点:

Jsoup,最大特点能以CSS选择器(HTML document形式)来选择内容非常方便,但是要注意它不负责管理Cookies。

不负责管理Cookies可能会造成,提交的Cookies可能不完整(需要人工保存提交),导致Response不成功。

问题描述:刚开始我不知道这点,犯了一个很大错误,我请求的是登陆页面,保存验证码,保存的Cookies是登录页面返回的(不包含验证码),

提交Cookies登陆,一直返回没有验证码的错误提示,但是我明明把验证码填写了。

刚开始我怎么都没办法解决,直到看了这文章才有点感悟 http://outofmemory.cn/code-snippet/10070/EMS

解决:我直接请求的是验证码,保存验证码Cookies,就解决了,原来是说我验证码图片没有提交。

疑问:为什么包含验证码图片Cookies也要提交给服务器?

生成验证码原理与验证原理补充,准备写一篇文章总结。

http://www.cnblogs.com/linkarl/p/4800531.html

 

其他方案:httpClient会管理Cookies,推荐用来模拟登陆,但是解析用正则表达式比较麻烦。

最佳:httpClient+Jsoup结合来用。

    private static Map initAuthCode() {
        //设置 url referrer userAgent
        url = "";
        referrer = "";
        userAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36";
        //create connection
        connection = Jsoup.connect(url).referrer(referrer).userAgent(userAgent)
                .timeout(3000);
        Response authCodeResponse;
        Map authCodeCookies = new HashMap();
        try {
            //由于返回的ContentType不是默认的text/html。而是image/JPEG ignoreContentType
            authCodeResponse = connection.ignoreContentType(true).execute();
            authCodeCookies = authCodeResponse.cookies();
            //cookies的内容(图片)转成byte[]
            byte[] image = authCodeResponse.bodyAsBytes();
            //保存圖片
            savePic(image);
            String JSESSIONID = authCodeCookies.get("JSESSIONID");
            System.out.println(JSESSIONID);
            Scanner scanner = new Scanner(System.in);
            authCode = scanner.nextLine();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return authCodeCookies;
    }

 

模拟登陆阶段

技巧:故意填错验证码,找到登录提交链接。

 

最后response,USERTICKET(用户门票),用着这个userTicket作为请求资源的门票。

但这个网站做的不是很安全,这个userTicket是静态的,被人盗取userTicket后可以一直用这个来进行资源请求,

应该数据库设置一个更新时间,过一段时间更新userTicket。

或者是在生成算法中加入账号+时间变量。

 

 

常见验证码的弱点与验证码识别

http://drops.wooyun.org/tips/141

 

转载于:https://www.cnblogs.com/linkarl/p/4747274.html

你可能感兴趣的:(利用jsoup爬页面的自动答题系统)