com.abc.turkey.service.unfreeze.UnfreezeProxy.java Source code

Java tutorial

Introduction

Here is the source code for com.abc.turkey.service.unfreeze.UnfreezeProxy.java

Source

/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.abc.turkey.service.unfreeze;

import java.util.ArrayList;

import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.ProtocolException;
import org.apache.http.client.RedirectStrategy;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.abc.turkey.service.ServiceException;
import com.abc.turkey.utils.SpringContextUtil;
import com.alibaba.fastjson.JSON;

/**
 * ??.
 * 
 * @author calvin
 */
public class UnfreezeProxy {
    private static Logger logger = LoggerFactory.getLogger(UnfreezeProxy.class);

    private static final String agent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0";
    // private CookieStore cookieStore = new BasicCookieStore();
    private CloseableHttpClient httpclient = null;
    private SmsService smsService = null;

    public UnfreezeProxy() {
        logger.info("create proxy==");
        smsService = SpringContextUtil.getBean(SmsService.class);
        ArrayList<Header> headers = new ArrayList<Header>();
        // headers.add(new BasicHeader("Referer", referer));
        headers.add(new BasicHeader("User-Agent", agent));
        // forbid redirect
        RedirectStrategy redirectStrategy = new RedirectStrategy() {

            @Override
            public boolean isRedirected(HttpRequest arg0, HttpResponse arg1, HttpContext arg2)
                    throws ProtocolException {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public HttpUriRequest getRedirect(HttpRequest arg0, HttpResponse arg1, HttpContext arg2)
                    throws ProtocolException {
                // TODO Auto-generated method stub
                return null;
            }
        };
        httpclient = HttpClients.custom().setDefaultHeaders(headers).setRedirectStrategy(redirectStrategy).build();
    }

    public void unfreeze(String number, String ticket, String randstr) throws Exception {
        logger.info("begin unfreezing: " + number);
        // ??
        String checkUrl = "https://aq.qq.com/cn2/ajax/check_verifycode?CaptchaSig=" + ticket + "&account=" + number
                + "&session_type=on_rand&verify_code=" + randstr + "&flag=1&appid=1600000491";
        HttpGet httpGet = new HttpGet(checkUrl);
        CloseableHttpResponse response = httpclient.execute(httpGet);
        String res = EntityUtils.toString(response.getEntity(), "utf8");
        logger.debug(res);
        response.close();

        // ?
        String lockUrl = "https://aq.qq.com/cn2/login_limit/checkstate?from=1&account=" + number + "&verifycode="
                + randstr + "&_=1452372769684";
        httpGet = new HttpGet(lockUrl);
        response = httpclient.execute(httpGet);
        res = EntityUtils.toString(response.getEntity(), "utf8");
        logger.debug(res);
        response.close();
        int lockFlag = JSON.parseObject(res).getIntValue("if_lock");
        if (lockFlag == 0) {
            throw new ServiceException("?");
        }

        // ???
        String smsUrl = "http://aq.qq.com/cn2/login_limit/getsms?verifycode=" + randstr;
        httpGet = new HttpGet(smsUrl);
        response = httpclient.execute(httpGet);
        res = EntityUtils.toString(response.getEntity(), "utf8");
        logger.debug(res);
        response.close();

        // ?
        String smsCode = JSON.parseObject(res).getString("sms");
        smsService.sendSms(smsCode);

        // 
        Thread.sleep(1000);
        int queryTimes = 7;
        while (queryTimes > 0) {
            lockFlag = checkState2(randstr);
            if (lockFlag == 0) {
                break;
            } else {
                if (queryTimes > 3) {
                    Thread.sleep(1000);
                } else {
                    Thread.sleep(2000);
                }
                queryTimes--;
            }
        }
        if (lockFlag != 0) {
            throw new ServiceException("?");
        }
    }

    private int checkState2(String randstr) throws Exception {
        // ?
        String lockUrl = "https://aq.qq.com/cn2/login_limit/checkstate?from=2&verifycode=" + randstr;
        HttpGet httpGet = new HttpGet(lockUrl);
        CloseableHttpResponse response = httpclient.execute(httpGet);
        String res = EntityUtils.toString(response.getEntity(), "utf8");
        logger.debug(res);
        response.close();
        return JSON.parseObject(res).getIntValue("if_lock");
    }

    @Override
    protected void finalize() throws Throwable {
        // TODO Auto-generated method stub
        super.finalize();
        logger.debug("clean up");
        httpclient.close();
    }

}