Doma2Util

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.SocketAddress;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;


import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;


public class Dama2Web {
    // 错误码宝岛
    public final static int errCalcEncInfo = -1000001; // 计算加密信息失败
    public final static int errBalanceNotNumber = -1000002; // 返回的余额不是数字
    public final static int errIdNotNumber = -1000003; // 返回的ID不是数字
    public final static int errEncodingError = -1000004; // 编码错误
    public final static int errRespError = -1000005; // HTTP响应错误,描述中包括HTTP的响应码
    public final static int errJsonParseError = -1000006; // JSON分析错误
    public final static int errJsonMapError = -1000007; // JSON映射错误
    public final static int errIOException = -1000008; // IO异常(包括网络异常)
    public final static int errGetResultTimeout = -1000009; // 得到结果超时


    private final static String _urlPrex = "http://api.dama2.com:7777/app/";


    // 一般请求的结果
    public class RequestResult {
        public int ret; // 返回码
        public String desc; // 返回码描述


        RequestResult(int ret, String desc) {
            this.ret = ret;
            this.desc = desc;
        }
    }


    // 查询余额结果
    public class ReadBalanceResult extends RequestResult {
        public int balance; // 余额


        ReadBalanceResult(int ret, String desc, int balance) {
            super(ret, desc);
            this.balance = balance;
        }
    }


    // 读用户信息结果
    public class ReadInfoResult extends RequestResult {
        public String name;
        public String qq; // 用户QQ号,不存在时为null
        public String email; // 用户邮箱,不存在时为null
        public String tel; // 用户电话号码,不存在时为null


        ReadInfoResult(int ret, String desc, String name, String qq, String email, String tel) {
            super(ret, desc);
            this.name = name;
            this.qq = qq;
            this.email = email;
            this.tel = tel;
        }
    }


    // 打码结果(getResult返回)
    public class DecodeResult extends RequestResult {
        public String result; // 结果字串
        public String cookie;


        DecodeResult(int ret, String desc, String result, String cookie) {
            super(ret, desc);
            this.result = result;
            this.cookie = cookie;
        }
    }


    // 构造函数
    // appID:应用ID(软件ID)
    // softKey:软件KEY
    // uname:用户名
    // upwd:用户密码
    public Dama2Web(int appID, String softKey, String uname, String upwd) {
        _appID = appID;
        _softKey = softKey;
        _uname = uname;
        _upwd = upwd;
    }


    // 注册新用户,用户名和密码通过构造函数传入
    public RequestResult register(String qq, String email, String tel) {
        RequestResult result = preAuth();
        if (result.ret < 0)
            return result;


        String url = _urlPrex + "register";
        String encInfo = calcEncInfo(result.desc, _softKey, _uname, _upwd);
        if (encInfo == null) {
            return new RequestResult(errCalcEncInfo, "");
        }


        url = url + "?appID=" + _appID + "&qq=" + qq + "&email=" + email + "&tel=" + tel + "&encinfo=" + encInfo;


        return doRequest(url, new IResultHandler() {
            @Override
            public RequestResult handleSucc(Map<String, String> m) {
                return genRequestResult(0);
            }
        }, true, false);
    }


    // 读取用户余额
    public ReadBalanceResult getBalance() {
        RequestResult result = handleRequest(new IActualHandler() {
            @Override
            public RequestResult process() {
                String url = _urlPrex + "getBalance";
                return doRequest(url, new IResultHandler() {
                    @Override
                    public RequestResult handleSucc(Map<String, String> m) {
                        int[] balance = new int[1];
                        try {
                            balance[0] = Integer.parseInt(m.get("balance"));
                        } catch (Exception e) {
                            return genRequestResult(errBalanceNotNumber);
                        }
                        return new ReadBalanceResult(0, "", balance[0]);
                    }
                });
            }
        });


        if (result instanceof ReadBalanceResult) {
            return (ReadBalanceResult) result;
        } else {
            return new ReadBalanceResult(result.ret, result.desc, 0);
        }
    }


    // 读取用户信息
    public ReadInfoResult readInfo() {
        RequestResult result = handleRequest(new IActualHandler() {
            @Override
            public RequestResult process() {
                String url = _urlPrex + "readInfo";


                return doRequest(url, new IResultHandler() {
                    @Override
                    public RequestResult handleSucc(Map<String, String> m) {
                        return new ReadInfoResult(0, "", m.get("name"), m.get("qq"), m.get("email"), m.get("tel"));


                    }
                });
            }


        });


        if (result instanceof ReadInfoResult) {
            return (ReadInfoResult) result;
        } else {
            return new ReadInfoResult(result.ret, result.desc, null, null, null, null);
        }
    }


    // 通过URL地址请求打码,不传递COOKIE和REFERER信息
    // urlPic:图片的URL地址,内部会进行URL编码
    // type:验证码类型ID
    // timeout:超时秒数
    public RequestResult decodeUrl(final String urlPic, final int type, final int timeout) {
        return decodeUrl(urlPic, null, null, type, timeout);
    }


    // 通过URL地址请求打码
    // urlPic:图片的URL地址,内部会进行URL编码
    // type:验证码类型ID
    // timeout:超时秒数
    // RequestResult.ret < 0 failed, ret is error code; > 0, ret is id
    public RequestResult decodeUrl(final String urlPic, final String cookie, final String referer, final int type,
            final int timeout) {
        return handleRequest(new IActualHandler() {


            @Override
            public RequestResult process() {
                String url = _urlPrex + "decodeURL";


                return doRequest(url, new IResultHandler() {
                    @Override
                    public RequestResult handleSucc(Map<String, String> m) {
                        int id = 0;
                        try {
                            id = Integer.parseInt(m.get("id"));
                        } catch (Exception e) {
                            return genRequestResult(errIdNotNumber);
                        }
                        return new RequestResult(id, "");
                    }
                }, new IPostDataGettor() {


                    @Override
                    public byte[] getPostData() {
                        return null;
                    }


                    @Override
                    public Map<String, String> getProperties() {
                        HashMap<String, String> m = new HashMap<String, String>();
                        m.put("type", String.valueOf(type));
                        m.put("timeout", String.valueOf(timeout));
                        try {
                            m.put("url", URLEncoder.encode(urlPic, "utf-8"));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        String temp;
                        try {
                            if (cookie != null && (temp = URLEncoder.encode(cookie, "utf-8")) != null) {
                                m.put("cookie", temp);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }


                        try {
                            if (referer != null && (temp = (URLEncoder.encode(referer, "utf-8"))) != null) {
                                m.put("referer", temp);
                            }
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }


                        return m;
                    }


                }, true, true);
            }
        });
    }


    // 通过URL地址请求打码,并且读取结果
    // urlPic:图片的URL地址,内部会进行URL编码
    // type:验证码类型ID
    // timeout:超时秒数
    // RequestResult.ret < 0 failed, ret is error code; > 0, ret is id
    public DecodeResult decodeUrlAndGetResult(String urlPic, String cookie, String referer, int type, int timeout) {
        RequestResult result = this.decodeUrl(urlPic, cookie, referer, type, timeout);
        if (result.ret < 0) {
            return new DecodeResult(result.ret, result.desc, null, null);
        }


        return this.getResultUntilDone(result.ret, timeout * 1000);
    }


    // 通过URL地址请求打码,并且读取结果
    // urlPic:图片的URL地址,内部会进行URL编码
    // type:验证码类型ID
    // timeout:超时秒数
    // RequestResult.ret < 0 failed, ret is error code; > 0, ret is id
    public DecodeResult decodeUrlAndGetResult(String urlPic, int type, int timeout) {
        return decodeUrlAndGetResult(urlPic, null, null, type, timeout);
    }


    // 通过图片数据请求打码
    // type:验证码类型ID
    // timeout:超时秒数
    // data:图片数据
    // 成功时返回对象的ret > 0,表示验证码ID,用于调用getResult、getResultUtilDone等函数
    private RequestResult decode(final int type, final int timeout, final byte[] data, final String txt) {
        return handleRequest(new IActualHandler() {
            @Override
            public RequestResult process() {
                String url = _urlPrex + "decode";


                return doRequest(url, new IResultHandler() {
                    @Override
                    public RequestResult handleSucc(Map<String, String> m) {
                        int id;
                        try {
                            id = Integer.parseInt(m.get("id"));
                        } catch (Exception e) {
                            return genRequestResult(errIdNotNumber);
                        }
                        return new RequestResult(id, "");
                    }
                }, new IPostDataGettor() {
                    @Override
                    public byte[] getPostData() {
                        return data;
                    }


                    @Override
                    public Map<String, String> getProperties() {
                        Map<String, String> p = new HashMap<String, String>();
                        p.put("type", Integer.toString(type));
                        p.put("timeout", Integer.toString(timeout));
                        if (txt != null && txt.length() > 0) {
                            try {
                                String temp;
                                temp = URLEncoder.encode(txt, "utf-8");
                                p.put("text", temp);
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                        }
                        return p;
                    }
                }, true, true);
            }
        });
    }


    // 通过图片数据请求打码
    // type:验证码类型ID
    // timeout:超时秒数
    // data:图片数据
    // 成功时返回对象的ret > 0,表示验证码ID,用于调用getResult、getResultUtilDone等函数
    public RequestResult decode(final int type, final int timeout, final byte[] data) {
        return decode(type, timeout, data, null);
    }


    // 通过图片数据请求打码
    // type:验证码类型ID
    // timeout:超时秒数
    // txt:文本数据
    // 成功时返回对象的ret > 0,表示验证码ID,用于调用getResult、getResultUtilDone等函数
    public RequestResult decode(final int type, final int timeout, final String txt) {
        byte[] data = null;
        try {
            data = txt.getBytes("gbk");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return decode(type, timeout, data, txt);
    }


    // 查询指定ID的结果,不管成功失败,立即返回
    // id:验证码ID,由decode或decodeUrl返回
    // 返回值:DecodeResult.ret >=0时, 得到结果成功,返回ID; <0失败
    public DecodeResult getResult(final int id) {
        RequestResult res = handleRequest(new IActualHandler() {
            @Override
            public RequestResult process() {
                String url = _urlPrex + "getResult?id=" + id;


                return doRequest(url, new IResultHandler() {
                    @Override
                    public RequestResult handleSucc(Map<String, String> m) {
                        String cookie;
                        try {
                            cookie = URLDecoder.decode(m.get("cookie"), "utf-8");
                        } catch (Exception e) {
                            cookie = "";
                        }
                        return new DecodeResult(id, "", m.get("result"), cookie);
                    }
                });
            }
        });


        if (res instanceof DecodeResult) {
            return (DecodeResult) res;
        } else {
            return new DecodeResult(res.ret, res.desc, null, null);
        }
    }


    // 得到指定ID的请求的结果,直到打码完成、超时未取得结果或者服务器返回错误
    // id:验证码ID,由decode或decodeUrl返回
    // timeout: 单位,毫秒
    // 返回值:DecodeResult.ret >=0时, 得到结果成功,返回ID; <0失败
    public DecodeResult getResultUntilDone(int id, int timeout) {
        long startTime = System.currentTimeMillis();
        while (true) {
            DecodeResult decodeResult = getResult(id);
            if (decodeResult.ret >= 0) {
                return decodeResult;
            }
            if (decodeResult.ret != -303) // 验证码尚未打码完成
                return decodeResult;


            if (System.currentTimeMillis() - startTime > timeout) {
                return new DecodeResult(errGetResultTimeout, getErrorDesc(errGetResultTimeout), null, null);
            }


            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


    // 请求打码并读取打码结果,直到结果返回或者错误
    // type:验证码类型ID
    // timeout:超时秒数
    // data:图片数据
    // 返回值:DecodeResult.ret >=0时, 得到结果成功,返回ID,可用于reportError; <0失败
    public DecodeResult decodeAndGetResult(int type, int timeout, byte[] data) {
        RequestResult result = decode(type, timeout, data);
        if (result.ret < 0) {
            return new DecodeResult(result.ret, result.desc, null, null);
        }


        return getResultUntilDone(result.ret, timeout * 1000);
    }


    // 请求打码并读取打码结果,直到结果返回或者错误
    // type:验证码类型ID
    // timeout:超时秒数
    // txt:文本数据
    // 返回值:DecodeResult.ret >=0时, 得到结果成功,返回ID,可用于reportError; <0失败
    public DecodeResult decodeAndGetResult(int type, int timeout, String txt) {
        RequestResult result = decode(type, timeout, txt);
        if (result.ret < 0) {
            return new DecodeResult(result.ret, result.desc, null, null);
        }


        return getResultUntilDone(result.ret, timeout * 1000);
    }


    // 读取用户余额
    public RequestResult reportError(final int id) {
        RequestResult result = handleRequest(new IActualHandler() {
            @Override
            public RequestResult process() {
                String url = _urlPrex + "reportError?id=" + id;
                return doRequest(url, new IResultHandler() {
                    @Override
                    public RequestResult handleSucc(Map<String, String> m) {
                        return genRequestResult(0);
                    }
                });
            }
        });


        return result;
    }


    // 执行HTTP请求并解析返回结果
    private RequestResult doRequest(String url, IResultHandler handler) {
        return doRequest(url, handler, true, true);
    }


    // 执行HTTP请求并解析返回结果,支持设置是否保存授权信息和在请求中加入授权信息
    private RequestResult doRequest(String url, IResultHandler handler, boolean saveAuth, boolean loadAuth) {
        return doRequest(url, handler, null, saveAuth, loadAuth);
    }


    // 执行HTTP请求,支持POST方法的数据获得
    @SuppressWarnings("unchecked")
    private RequestResult doRequest(String url, IResultHandler handler, IPostDataGettor postDataGettor,
            boolean saveAuth, boolean loadAuth) {
        try {
            // 在URL地址中附带授权信息
            String auth = null;
            if (loadAuth) {
                synchronized (this) {
                    auth = _auth;
                }
                if (postDataGettor == null) {
                    if (url.indexOf('?') > 0) {
                        url += "&auth=" + auth;
                    } else {
                        url += "?auth=" + auth;
                    }
                }
            }


            // -----内网环境代理--------------
            URL sUrl = new URL(url);
            HttpURLConnection conn = null;
            SocketAddress addr = new InetSocketAddress("xxx.xxx.xxx", 80);
            Proxy typeProxy = new Proxy(Proxy.Type.HTTP, addr);
            conn = (HttpURLConnection) sUrl.openConnection(typeProxy);
            // ------------------------


            // 打开连接,设置连接属性
            // HttpURLConnection conn = (HttpURLConnection) (new
            // URL(url)).openConnection();
            conn.setUseCaches(false);
            conn.setConnectTimeout(15 * 1000);
            conn.setReadTimeout(40 * 1000);


            // 处理POST方法的处理
            if (postDataGettor != null) {
                // 处理属性
                Map<String, String> properties = postDataGettor.getProperties();
                Map<String, String> newProp = null;
                if (properties != null && auth != null) {
                    newProp = new HashMap<String, String>(properties);
                    newProp.put("auth", auth);
                } else if (properties == null) {
                    newProp = new HashMap<String, String>();
                    newProp.put("auth", auth);
                } else {
                    newProp = properties;
                }


                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
                conn.setRequestProperty("Charsert", "UTF-8");
                // 处理存在文件数据的情况
                if (postDataGettor.getPostData() != null) {
                    String BOUNDARY = "------WebKitFormBoundary"; // 数据分隔线
                    conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);


                    // 写属性
                    OutputStream os = conn.getOutputStream();
                    if (newProp != null) {
                        Iterator<String> it = newProp.keySet().iterator();
                        while (it.hasNext()) {
                            String key = it.next();
                            String value = newProp.get(key);
                            StringBuilder sb = new StringBuilder();
                            sb.append("\r\n--").append(BOUNDARY).append("\r\nContent-Disposition: form-data;name=\"")
                                    .append(key).append("\";").append("\r\nContent-Type:plain/text\r\n\r\n")
                                    .append(value);
                            os.write(sb.toString().getBytes());
                        }
                    }


                    // 写文件数据
                    StringBuilder sb = new StringBuilder();
                    sb.append("\r\n--")
                            .append(BOUNDARY)
                            .append("\r\nContent-Disposition: form-data;name=\"data\";filename=\"pic.jpg\"\r\nContent-Type:image/jpg\r\n\r\n");
                    os.write(sb.toString().getBytes());
                    os.write(postDataGettor.getPostData());


                    // 写结束符
                    StringBuilder sbEnd = new StringBuilder();
                    sbEnd.append("\r\n--").append(BOUNDARY).append("--\r\n");
                    os.write(sbEnd.toString().getBytes());
                    os.flush();
                } else if (newProp != null && newProp.size() > 0) { // 处理没有文件数据但有属性的情况
                    StringBuilder sb = new StringBuilder();
                    Iterator<String> it = newProp.keySet().iterator();
                    while (it.hasNext()) {
                        String key = it.next();
                        String value = newProp.get(key);
                        if (sb.length() > 0)
                            sb.append("&");
                        sb.append(key).append("=").append(value);
                    }


                    byte[] data = sb.toString().getBytes();
                    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                    conn.setRequestProperty("Content-Length", String.valueOf(data.length));


                    OutputStream os = conn.getOutputStream();
                    os.write(data);
                    os.flush();
                }
            }


            // 连接服务器,与服务器通讯并分析响应码
            conn.connect();
            int ret = conn.getResponseCode();
            if (ret != 200) {
                return new RequestResult(errRespError, conn.getResponseMessage() + "(" + ret + ")");
            }


            // 读取返回数据对象
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
            ObjectMapper om = new ObjectMapper();
            Map<String, String> m = om.readValue(in, Map.class);
            ret = Integer.parseInt(m.get("ret"));
            String desc = m.get("desc");
            if (ret < 0) {
                return new RequestResult(ret, desc);
            }


            // 保存授权信息
            if (saveAuth) {
                synchronized (this) {
                    _auth = m.get("auth");
                }
            }


            // 成功发表的后续处理
            return handler.handleSucc(m);
        } catch (JsonParseException e) {
            e.printStackTrace();
            return genRequestResult(errJsonParseError);
        } catch (JsonMappingException e) {
            e.printStackTrace();
            return genRequestResult(errJsonMapError);
        } catch (IOException e) {
            e.printStackTrace();
            return genRequestResult(errIOException);
        }
    }


    // 计算加密信息
    private String calcEncInfo(String preauth, String softKey, String uname, String upwd) {
        // 压缩软件KEY为8字节,用作DES加密的KEY
        byte[] key16 = hexString2ByteArray(softKey);
        byte[] key8 = new byte[8];
        for (int i = 0; i < 8; i++) {
            key8[i] = (byte) ((key16[i] ^ key16[i + 8]) & 0xff);
        }


        try {
            byte[] pwd_data = upwd.getBytes("utf-8");
            java.security.MessageDigest md5 = java.security.MessageDigest.getInstance("MD5");
            md5.update(pwd_data, 0, pwd_data.length);
            String pwd_md5_str = byteArray2HexString(md5.digest()); // 转为16进制字符串


            String enc_data_str = preauth + "\n" + uname + "\n" + pwd_md5_str;


            SecureRandom sr = new SecureRandom();
            DESKeySpec dks = new DESKeySpec(key8);
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey securekey = keyFactory.generateSecret(dks);
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
            byte[] resultData = cipher.doFinal(enc_data_str.getBytes("utf-8"));
            return byteArray2HexString(resultData);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }


        return null;
    }


    // 能用的处理请求函数,如果需要登陆,则请求预授权,则登陆,最后发出实际请求
    private RequestResult handleRequest(IActualHandler handler) {
        int tryTime = 0;
        RequestResult res = null;
        while (tryTime < 2) {
            tryTime++;


            boolean bNeedLogin = false;
            synchronized (this) {
                if (_auth == null) {
                    bNeedLogin = true;
                }
            }


            if (bNeedLogin) {
                do {
                    res = preAuth();
                } while (processBusy(res.ret));
                if (res.ret < 0) {
                    return res;
                }


                do {
                    res = login(res.desc, _appID, _softKey, _uname, _upwd);
                } while (processBusy(res.ret));
                if (res.ret < 0) {
                    return res;
                }
            }


            do {
                res = handler.process();


            } while (processBusy(res.ret));


            if (res.ret != -10003 && // encinfo timeout
                    res.ret != -10004 && // ip inconsistent
                    res.ret != -10001) // invalid auth
            {
                return res;
            }


            synchronized (this) {
                _auth = null;
            }
        }


        return res;
    }


    // 处理系统忙返回码,如果返回码是系统忙,睡眠500ms,返回true;否则,返回false
    private static boolean processBusy(int ret) {
        if (ret == -10000) { // busy
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return true;
        }


        return false;
    }


    // 预授权
    // 成功时预授权信息从RequestResult.desc返回
    private RequestResult preAuth() {
        String url = _urlPrex + "preauth";
        return doRequest(url, new IResultHandler() {
            @Override
            public RequestResult handleSucc(Map<String, String> m) {
                return new RequestResult(0, m.get("auth"));
            }
        }, false, false);
    }


    // 登陆
    private RequestResult login(String preAuthInfo, int appID, String softKey, String uname, String upwd) {
        String url = _urlPrex + "login";
        String encInfo = calcEncInfo(preAuthInfo, softKey, uname, upwd);
        if (encInfo == null) {
            return genRequestResult(errCalcEncInfo);
        }


        url = url + "?appID=" + appID + "&encinfo=" + encInfo;


        return doRequest(url, new IResultHandler() {
            @Override
            public RequestResult handleSucc(Map<String, String> m) {
                return genRequestResult(0);
            }
        }, true, false);
    }


    // 16进制字符串转为BYTE数组
    private byte[] hexString2ByteArray(String hexStr) throws NumberFormatException {
        int len = hexStr.length();
        if (len % 2 != 0)
            throw new NumberFormatException();


        byte[] result = new byte[len / 2];


        for (int i = 0; i < len; i += 2) {
            String s = hexStr.substring(i, i + 2);
            int n = Integer.parseInt(s, 16);
            result[i / 2] = (byte) (n & 0xff);
        }


        return result;
    }


    // 转化BYTE数组为16进制字符串
    private String byteArray2HexString(byte[] data) {
        StringBuilder sb = new StringBuilder();
        for (byte b : data) {
            String s = Integer.toHexString(b & 0xff);
            if (s.length() == 1) {
                sb.append("0" + s);
            } else {
                sb.append(s);
            }
        }
        return sb.toString();
    }


    // 根据错误码得到得到错误描述
    private String getErrorDesc(int ret) {
        switch (ret) {
        case 0:
            return "成功";
        case errCalcEncInfo:
            return "calc encinfo error";
        case errBalanceNotNumber:
            return "balance is not number";
        case errIdNotNumber:
            return "id is not number";
        case errEncodingError:
            return "encoding error";
        case errRespError:
            return "response error";
        case errJsonParseError:
            return "Json parse error";
        case errJsonMapError:
            return "Json map error";
        case errIOException:
            return "IO Exception";
        case errGetResultTimeout:
            return "Get Result timeout";
        }
        return "" + ret;
    }


    // 根据返回码生成请求结果
    private RequestResult genRequestResult(int ret) {
        return new RequestResult(ret, getErrorDesc(ret));
    }


    //
    // 内部接口定义
    //
    private interface IActualHandler { // 实际处理器
        RequestResult process();
    }


    private interface IResultHandler // 结果处理 器
    {
        RequestResult handleSucc(Map<String, String> m);
    }


    private interface IPostDataGettor // POST数据提供者
    {
        byte[] getPostData();


        Map<String, String> getProperties();
    }


    public static void main(String[] argvs) {
        String key = "9503ce045ad14d83ea876ab578bd3184";
        String uname = "user";
        String upwd = "test";
        int idApp = 205;
        Dama2Web web = new Dama2Web(idApp, "", uname, upwd);
        String preAuth = "1234567890abcdef1234567890abcdef";
        String s = web.calcEncInfo(preAuth, key, uname, upwd);
        System.out.println(s);
    }


    // 成员变量定义
    private String _auth; // 返回的授权信息


    private final int _appID; // 应用ID
    private final String _softKey; // 软件KEY
    private final String _uname; // 用户名
    private final String _upwd; // 用户密码

}




import org.apache.log4j.Logger;


import com.zte.weizhang.util.Dama2Web.DecodeResult;


public class Doma2Util {


    private static Logger logger = Logger.getLogger(Doma2Util.class);


    private static int type = 200;
    private static int timeout = 30;
    private static Dama2Web dama2 = new Dama2Web(1111 "1111", "1111", "1111");


    public static DecodeResult decode(byte[] data) {
        DecodeResult res = dama2.decodeAndGetResult(type, timeout, data);
        String s;
        if (res.ret >= 0) {
            s = "success: result=" + res.result + "; id=" + res.ret;
        } else {
            s = "failed: ret = " + res.ret + "; desc=" + res.desc;
        }
        logger.error("Doma2返回结果:" + s);
        return res;
    }
}



客户端:

import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;


import cn.smy.dama2.Dama2Web;
import cn.smy.dama2.Dama2Web.DecodeResult;
import cn.smy.dama2.Dama2Web.ReadBalanceResult;
import cn.smy.dama2.Dama2Web.ReadInfoResult;
import cn.smy.dama2.Dama2Web.RequestResult;


public class MainFrame extends JFrame {


    /**

*/
    private static final long serialVersionUID = 1325980466616825482L;
    // private Dama2Web dama2 = new Dama2Web(205,
    // "9503ce045ad14d83ea876ab578bd3184", "test", "test");
    private Dama2Web dama2 = new Dama2Web(11111, "11111", "11111", "11111");
    private int id;


    public MainFrame() throws HeadlessException {
        this.setLayout(new FlowLayout());


        // query balance
        JButton getBalanceButton = new JButton("queryBalance");
        getBalanceButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                ReadBalanceResult res = dama2.getBalance();
                String s;
                if (res.ret >= 0) {
                    s = "balance=" + res.balance;
                } else {
                    s = "failed: ret = " + res.ret + "; desc=" + res.desc;
                }
                JOptionPane.showMessageDialog(null, s);
            }


        });
        getContentPane().add(getBalanceButton);


        // read info
        JButton readInfoButton = new JButton("readInfo");
        readInfoButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                ReadInfoResult res = dama2.readInfo();
                String s;
                if (res.ret == 0) {
                    s = "name=" + res.name + "; qq=" + res.qq + "; email=" + res.email + "; tel=" + res.tel;
                } else {
                    s = "failed: ret = " + res.ret + "; desc=" + res.desc;
                }
                JOptionPane.showMessageDialog(null, s);
            }


        });
        getContentPane().add(readInfoButton);


        // 通过URL请求打码
        JButton decodeUrlButton = new JButton("decodeUrl");
        decodeUrlButton.addActionListener(new ActionListener() {


            @Override
            public void actionPerformed(ActionEvent arg0) {
                int type = 42;
                int timeout = 30;
                String url = "http://icode.renren.com/getcode.do?t=web_reg&rnd=1383107243557";
                DecodeResult res = dama2.decodeUrlAndGetResult(url, type, timeout);
                String s;
                if (res.ret >= 0) {
                    id = res.ret;
                    s = "success: result=" + res.result + "; id=" + res.ret + "; cookie=" + res.cookie;
                } else {
                    s = "failed: ret = " + res.ret + "; desc=" + res.desc;
                }
                JOptionPane.showMessageDialog(null, s);
            }


        });
        getContentPane().add(decodeUrlButton);


        // 通过URL请求打码
        JButton decodeButton = new JButton("decode");
        decodeButton.addActionListener(new ActionListener() {


            @Override
            public void actionPerformed(ActionEvent arg0) {
                int type = 200;
                int timeout = 30;
                JFileChooser fc = new JFileChooser();
                fc.showOpenDialog(null);
                File file = fc.getSelectedFile();
                if (file == null)
                    return;


                FileInputStream fis;
                byte[] data = new byte[(int) file.length()];
                try {
                    fis = new FileInputStream(file);
                    fis.read(data);
                    fis.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    JOptionPane.showMessageDialog(null, "open file failed");
                    return;
                } catch (IOException e) {
                    e.printStackTrace();
                    JOptionPane.showMessageDialog(null, "read file failed");
                    return;
                }


                DecodeResult res = dama2.decodeAndGetResult(type, timeout, data);
                String s;
                if (res.ret >= 0) {
                    id = res.ret;
                    s = "success: result=" + res.result + "; id=" + res.ret;
                } else {
                    s = "failed: ret = " + res.ret + "; desc=" + res.desc;
                }
                JOptionPane.showMessageDialog(null, s);
            }


        });
        getContentPane().add(decodeButton);


        // 文本题
        JButton decodeTextButton = new JButton("decodeText");
        decodeTextButton.addActionListener(new ActionListener() {


            @Override
            public void actionPerformed(ActionEvent arg0) {
                int type = 106;
                int timeout = 30;


                DecodeResult res = dama2.decodeAndGetResult(type, timeout, "一加上五");
                String s;
                if (res.ret >= 0) {
                    id = res.ret;
                    s = "success: result=" + res.result + "; id=" + res.ret;
                } else {
                    s = "failed: ret = " + res.ret + "; desc=" + res.desc;
                }
                JOptionPane.showMessageDialog(null, s);
            }


        });
        getContentPane().add(decodeTextButton);


        // read info
        JButton reportErrorButton = new JButton("reportError");
        reportErrorButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                RequestResult res = dama2.reportError(id);
                String s;
                if (res.ret == 0) {
                    s = "report success(id=" + id + ")";
                } else {
                    s = "failed: ret = " + res.ret + "; desc=" + res.desc;
                }
                JOptionPane.showMessageDialog(null, s);
            }


        });
        getContentPane().add(reportErrorButton);


        this.pack();
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


    public static void main(String[] args) {
        new MainFrame();


    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值