├── README.md ├── pom.xml └── src ├── main ├── java │ └── org │ │ └── bianqi │ │ ├── enter │ │ ├── bean │ │ │ └── QQBean.java │ │ ├── code │ │ │ └── VerifyCode.java │ │ ├── encrypt │ │ │ └── QzoneEncrypt.java │ │ ├── key │ │ │ ├── GetQQByProperties.java │ │ │ └── KeyWord.java │ │ ├── login │ │ │ ├── InputNameAndPwd.java │ │ │ └── Login.java │ │ └── sig │ │ │ └── SigInterface.java │ │ └── getdata │ │ ├── GetMsgBoard.java │ │ ├── GetQNum.java │ │ └── GetShuoShuoData.java └── resources │ ├── entry.js │ ├── login.js │ └── num.properties └── test ├── java └── qzone_enter │ ├── GetMsgBord.java │ ├── GetMyShuoShuo.java │ ├── GetQNumTest.java │ ├── GetQQTest.java │ ├── LoginTest.java │ ├── NoInputLogin.java │ └── TestEntryptg_k.java └── resources └── zone.js /README.md: -------------------------------------------------------------------------------- 1 | # Qzone 2 | 1. num.properties中输入用户名密码 至少10个QQ号码
3 | 2. D盘新建文件夹out
4 | 4. 找到GetMyShuoShuo.java i 开始抓取的QQ号 j 结束的QQ号
5 | 3. 找到getMyShuoshuo.java main方法启动 即可开始抓取说说数据
6 | 注 :抓取到的数据均为json数据每一个用户保存为一个文件(都是每一个人的第一页的说说)
7 | ***就目前来说速度提升了不少 没有加入多线程技术***
8 | ***只可以用于学习交流,切勿用于非法买卖,一切后果自负***
9 | ***100W从10001开始到1000000 QQ空间首页JSON数据***
10 | 链接:http://pan.baidu.com/s/1miIFol6 密码:89z6 11 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | org.bianqi.qzone 4 | qzone 5 | 0.0.1-SNAPSHOT 6 | 7 | 8 | 9 | org.jsoup 10 | jsoup 11 | 1.8.2 12 | 13 | 14 | 15 | junit 16 | junit 17 | 4.12 18 | 19 | 20 | 21 | 22 | 23 | 24 | org.apache.maven.plugins 25 | maven-compiler-plugin 26 | 3.2 27 | 28 | 1.8 29 | 1.8 30 | UTF-8 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/enter/bean/QQBean.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.enter.bean; 2 | 3 | import java.io.Serializable; 4 | /** 5 | * 6 | *

Title: QQBean

7 | *

Description:

8 | *

School: qiqihar university

9 | * @author BQ 10 | * @date 2017年7月15日下午1:52:34 11 | * @version 1.0 12 | */ 13 | public class QQBean implements Serializable{ 14 | private String num; 15 | private String pwd; 16 | public String getNum() { 17 | return num; 18 | } 19 | public void setNum(String num) { 20 | this.num = num; 21 | } 22 | public String getPwd() { 23 | return pwd; 24 | } 25 | public void setPwd(String pwd) { 26 | this.pwd = pwd; 27 | } 28 | @Override 29 | public String toString() { 30 | return "QQBean [num=" + num + ", pwd=" + pwd + "]"; 31 | } 32 | public QQBean() { 33 | super(); 34 | } 35 | public QQBean(String num, String pwd) { 36 | super(); 37 | this.num = num; 38 | this.pwd = pwd; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/enter/code/VerifyCode.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.enter.code; 2 | 3 | import java.io.File; 4 | import java.io.FileOutputStream; 5 | import java.io.IOException; 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | import java.util.Map.Entry; 9 | import java.util.Set; 10 | 11 | import org.jsoup.Connection.Response; 12 | import org.jsoup.Jsoup; 13 | 14 | /** 15 | * 16 | *

Title: VerifyCode

17 | *

Description:

18 | *

School: qiqihar university

19 | * @author BQ 20 | * @date 2017年6月21日下午6:15:51 21 | * @version 1.0 22 | */ 23 | public class VerifyCode { 24 | 25 | public static Map cookies = new HashMap<>(); 26 | /** 27 | * 保存验证码图片 28 | *

Title: getVerifyCode

29 | *

Description:

30 | * @param uin 31 | * @param sig 32 | * @throws IOException 33 | */ 34 | public static void getVerifyCode(String uin, String sig) throws IOException { 35 | Response imgResponse = Jsoup 36 | .connect("http://captcha.qq.com/getimgbysig?" + "uin=" + uin + "&aid=549000912" + "&sig=" + sig) 37 | .ignoreContentType(true).execute(); 38 | File imge = new File("VerifyCode.jpg"); 39 | FileOutputStream out = new FileOutputStream(imge); 40 | out.write(imgResponse.bodyAsBytes()); 41 | out.close(); 42 | } 43 | 44 | /** 45 | * 得到sessionCode 46 | *

Title: getVerifysession

47 | *

Description:

48 | * @param uin 49 | * @param verifycode 50 | * @param sig 51 | * @return 52 | * @throws IOException 53 | */ 54 | public static String getVerifysession(String uin, String verifycode, String sig) throws IOException { 55 | Response response = Jsoup.connect("http://captcha.qq.com/cap_union_verify?" + 56 | "aid=539400912" + 57 | "&uin=" + uin + 58 | "&captype=50" + 59 | "&ans=" + verifycode + 60 | "&sig=" + sig + 61 | "&0.49537726398709714") 62 | .execute(); 63 | return response.body(); 64 | } 65 | 66 | /** 67 | * 68 | *

Title: check

69 | *

Description:

70 | * @param uin 71 | * @return 72 | * @throws IOException 73 | */ 74 | public static String check(String uin) throws IOException { 75 | Response response = Jsoup.connect("http://check.ptlogin2.qq.com/check?" + 76 | "regmaster=" + 77 | "&pt_tea=1" + 78 | "&pt_vcode=1" + 79 | "&uin=" + uin + 80 | "&appid=549000912" + 81 | "&js_ver=10140" + 82 | "&js_type=1" + 83 | "&login_sig=" + 84 | "&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone" + 85 | "&r=0.6051182341306292") 86 | .ignoreContentType(true) 87 | .execute(); 88 | cookies = response.cookies(); 89 | return response.body(); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/enter/encrypt/QzoneEncrypt.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.enter.encrypt; 2 | 3 | import java.io.FileReader; 4 | 5 | import javax.script.Invocable; 6 | import javax.script.ScriptEngine; 7 | import javax.script.ScriptEngineManager; 8 | /** 9 | * 空间加密密码 10 | * 调用JS脚本加密密码 11 | *

Title: QzoneEncrypt

12 | *

Description:

13 | *

School: qiqihar university

14 | * @author BQ 15 | * @date 2017年6月21日下午5:56:11 16 | * @version 1.0 17 | */ 18 | public class QzoneEncrypt { 19 | 20 | /** 21 | * 加密QQ空间的密码 22 | * @param uin 用户的QQ号码 23 | * @param password 加密前的密码 24 | * @param verifycode 验证码(非手动添加的验证码) 25 | * @return 26 | */ 27 | public static String encryptPassword(String uin,String password,String verifycode){ 28 | String result = ""; 29 | try{ 30 | String path = QzoneEncrypt.class.getClassLoader().getResource("login.js").getPath(); 31 | FileReader fr = new FileReader(path); 32 | ScriptEngineManager sem = new ScriptEngineManager(); 33 | ScriptEngine engine = sem.getEngineByName("js"); 34 | engine.eval(fr); 35 | Invocable inv = (Invocable)engine; 36 | result = inv.invokeFunction("getEncryption", password,uin,verifycode).toString(); 37 | }catch(Exception e){ 38 | e.printStackTrace(); 39 | } 40 | return result; 41 | } 42 | 43 | /** 44 | * 加密g_tk 45 | *

Title: encryptg_k

46 | *

Description:

47 | * @param key 48 | * @return 49 | */ 50 | public static String encryptg_k(String key){ 51 | String result = ""; 52 | try{ 53 | String path = QzoneEncrypt.class.getClassLoader().getResource("entry.js").getPath(); 54 | FileReader fr = new FileReader(path); 55 | ScriptEngineManager sem = new ScriptEngineManager(); 56 | ScriptEngine engine = sem.getEngineByName("js"); 57 | engine.eval(fr); 58 | Invocable inv = (Invocable)engine; 59 | result = inv.invokeFunction("getACSRFToken",key).toString(); 60 | }catch(Exception e){ 61 | e.printStackTrace(); 62 | } 63 | return result; 64 | } 65 | 66 | 67 | } 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/enter/key/GetQQByProperties.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.enter.key; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | import java.util.Map.Entry; 8 | import java.util.Properties; 9 | import java.util.Set; 10 | 11 | import org.bianqi.enter.bean.QQBean; 12 | 13 | import qzone_enter.GetQQTest; 14 | /** 15 | * 从配置文件中获取QQ号和密码 16 | *

Title: GetQQByProperties

17 | *

Description:

18 | *

School: qiqihar university

19 | * @author BQ 20 | * @date 2017年7月15日下午1:56:05 21 | * @version 1.0 22 | */ 23 | public class GetQQByProperties { 24 | 25 | public static List getQQNumAndPwd() throws IOException{ 26 | Properties properties = new Properties(); 27 | InputStream resourceAsStream = GetQQTest.class.getClassLoader().getResourceAsStream("num.properties"); 28 | properties.load(resourceAsStream); 29 | List qqList = new ArrayList<>(); 30 | Set> entrySet = properties.entrySet(); 31 | for (Entry entry : entrySet) { 32 | QQBean bean = new QQBean(); 33 | bean.setNum((String) entry.getKey()); 34 | bean.setPwd((String) entry.getValue()); 35 | qqList.add(bean); 36 | } 37 | return qqList; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/enter/key/KeyWord.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.enter.key; 2 | 3 | public class KeyWord { 4 | //关键的数据输入口 5 | //你的QQ账号和密码 6 | public static String uin = "";// 账号 7 | public static String password = ""; // 密码 8 | // public static String uin = "";// 账号 9 | // public static String password = ""; // 密码 10 | //你要爬取的QQ好友的账号 11 | public static String friendQQ = ""; 12 | 13 | //===============下面的关键数据定义不要修改=================================== 14 | public static String checkStatus = ""; // login接口参数pt_vcode_v1,对应check接口的0,1状态 15 | public static String verifycode = ""; // login接口参数 16 | public static String verifysession = ""; // login接口参数 17 | public static String p = ""; // login接口参数 18 | public static String skeyString = ""; 19 | public static String ptcz = ""; 20 | public static String ptsigx = ""; 21 | public static String p_skey = ""; 22 | public static String pt4_token = ""; 23 | public static String skey = ""; 24 | public static String qzonetoken = ""; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/enter/login/InputNameAndPwd.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.enter.login; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.File; 5 | import java.io.FileNotFoundException; 6 | import java.io.FileOutputStream; 7 | import java.io.FileReader; 8 | import java.io.IOException; 9 | import java.util.Map; 10 | import java.util.Scanner; 11 | 12 | import org.bianqi.enter.code.VerifyCode; 13 | import org.bianqi.enter.encrypt.QzoneEncrypt; 14 | import org.bianqi.enter.key.KeyWord; 15 | import org.bianqi.enter.sig.SigInterface; 16 | import org.jsoup.Connection; 17 | import org.jsoup.Jsoup; 18 | import org.jsoup.Connection.Response; 19 | 20 | public class InputNameAndPwd { 21 | 22 | //账号 23 | public static void login() { 24 | try { 25 | // 检验登录接口 是否需要 验证码 26 | String checkResult = VerifyCode.check(KeyWord.uin); 27 | if ("0".equals(checkResult.charAt(14) + "")) { 28 | KeyWord.checkStatus = "0"; 29 | KeyWord.verifycode = checkResult.split(",")[1].replaceAll("\'", ""); 30 | KeyWord.verifysession = checkResult.split(",")[3].replaceAll("\'", ""); 31 | }else{ 32 | System.out.println("需要输入验证码登录!。"); 33 | KeyWord.checkStatus = "1"; 34 | String cap_cd = checkResult.split(",")[1].replaceAll("'", ""); 35 | String sig = SigInterface.getSig(KeyWord.uin, cap_cd); 36 | //获取并输入验证码 37 | VerifyCode.getVerifyCode(KeyWord.uin, sig); 38 | System.out.println("请输入验证码:"); 39 | Scanner scanf = new Scanner(System.in); 40 | String vcode = scanf.next(); //输入验证码 41 | scanf.close(); 42 | String body = VerifyCode.getVerifysession(KeyWord.uin, vcode, sig); 43 | KeyWord.verifysession = body.split(",")[2].replaceAll("sig:\"", "").replaceAll("\"", ""); 44 | KeyWord.verifycode = body.split(",")[1].replaceAll("randstr:\"", "").replaceAll("\"", ""); 45 | while(!body.contains("rcode:0")) { 46 | sig = SigInterface.refreshSig(KeyWord.uin, sig); 47 | VerifyCode.getVerifyCode(KeyWord.uin, sig); 48 | System.out.println("error,请重新输入验证码:"); 49 | vcode = scanf.next(); 50 | body = VerifyCode.getVerifysession(KeyWord.uin, vcode, sig); 51 | KeyWord.verifysession = body.split(",")[2].replaceAll("sig:\"", "").replaceAll("\"", ""); 52 | KeyWord.verifycode = body.split(",")[1].replaceAll("randstr:\"", "").replaceAll("\"", ""); 53 | } 54 | } 55 | KeyWord.p = QzoneEncrypt.encryptPassword(KeyWord.uin, KeyWord.password, KeyWord.verifycode); 56 | 57 | //===========================首次登陆获取相应的cookie================= 58 | String login = Login.login(KeyWord.uin, KeyWord.p, KeyWord.checkStatus, KeyWord.verifycode, KeyWord.verifysession); 59 | Map cookies = Login.cookies; 60 | KeyWord.skeyString = cookies.get("skey"); 61 | KeyWord.ptcz = cookies.get("ptcz"); 62 | KeyWord.ptsigx = login.substring(111, 239); 63 | // System.out.println(login.substring(111, 239)); 64 | //===========================================获取p_skey===================================== 65 | Connection check_sig = Jsoup.connect("https://ptlogin2.qzone.qq.com/check_sig?" 66 | + "pttype=1" 67 | + "&uin="+KeyWord.uin+"" 68 | + "&service=login" 69 | + "&nodirect=0" 70 | + "&ptsigx="+KeyWord.ptsigx 71 | + "&s_url=https%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone%26from%3Diqq" 72 | + "&f_url=&ptlang=2052" 73 | + "&ptredirect=100" 74 | + "&aid=549000912" 75 | + "&daid=5" 76 | + "&j_later=0" 77 | + "&low_login_hour=0" 78 | + "®master=0" 79 | + "&pt_login_type=1" 80 | + "&pt_aid=0" 81 | + "&pt_aaid=0" 82 | + "&pt_light=0" 83 | + "&pt_3rd_aid=0"); 84 | check_sig.header("Accept", "image/webp,image/*,*/*;q=0.8"); 85 | check_sig.header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 86 | check_sig.header("Connection", "keep-alive"); 87 | check_sig.header("cookie", "pgv_pvi=8028248064; " 88 | + "RK=vucf0uGrQV; " 89 | + "__Q_w_s__QZN_TodoMsgCnt=1;" 90 | + " __Q_w_s_hat_seed=1; " 91 | + "pac_uid=1_"+KeyWord.uin+"; " 92 | + "pgv_pvid=7070951083; "//746982400 93 | + "o_cookie="+KeyWord.uin+"; " 94 | + "randomSeed=457757;" 95 | + " cpu_performance_v8=3;" 96 | + " Loading=Yes; " 97 | + "QZ_FE_WEBP_SUPPORT=1;" 98 | + " _qz_referrer=i.qq.com;" 99 | + " _qpsvr_localtk=0.9215949376165553;" 100 | + " pgv_si=s9635414016;" 101 | + " pgv_info=ssid=s2050395600; " 102 | + "ptui_loginuin="+KeyWord.uin+";" 103 | + " pt2gguin=o"+KeyWord.uin+"; " 104 | + "uin=o"+KeyWord.uin+"; " 105 | + "skey="+KeyWord.skeyString+"; " 106 | + "ptisp=cm; " 107 | + "ptcz="+KeyWord.ptcz+""); 108 | check_sig.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 109 | check_sig.timeout(10000); 110 | Response execute2 = check_sig.execute(); 111 | Map cookies2 = execute2.cookies(); 112 | KeyWord.p_skey = cookies2.get("p_skey"); 113 | KeyWord.pt4_token = cookies2.get("pt4_token"); 114 | KeyWord.skey = cookies2.get("skey"); 115 | //==========================Qzone模拟登陆========================================// 116 | Connection connect = Jsoup.connect("https://user.qzone.qq.com/"+KeyWord.uin+""); 117 | connect.header("Accept", "image/webp,image/*,*/*;q=0.8"); 118 | connect.header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 119 | connect.header("Connection", "keep-alive"); 120 | connect.header("cookie","pgv_pvi=8028248064; " 121 | + "RK=vvcfluGbQX; " 122 | + "__Q_w_s__QZN_TodoMsgCnt=1;" 123 | + " __Q_w_s_hat_seed=1;" 124 | + " pac_uid=1_"+KeyWord.uin+";" 125 | + " randomSeed=457757;" 126 | + " _qpsvr_localtk=0.7002974565386917; " 127 | + "pgv_si=s9635414016; " 128 | + "pgv_info=ssid=s2050395600;" 129 | + " pgv_pvid=7070951083; " 130 | + "o_cookie="+KeyWord.uin+";" 131 | + " zzpaneluin=; " 132 | + "zzpanelkey=; " 133 | + "ptui_loginuin="+KeyWord.uin+";" 134 | + " ptisp=cm; " 135 | + "ptcz="+KeyWord.ptcz+";" 136 | + " pt2gguin=o"+KeyWord.uin+";" 137 | + " uin=o"+KeyWord.uin+";" 138 | + " skey="+KeyWord.skeyString+"; " 139 | + "p_uin=o"+KeyWord.uin+"; " 140 | + "p_skey="+KeyWord.p_skey+";" 141 | + " pt4_token="+KeyWord.pt4_token+"; " 142 | + "Loading=Yes; " 143 | + "qzspeedup=sdch;" 144 | + " qz_screen=1366x768; " 145 | + ""+KeyWord.uin+"_todaycount=5; " 146 | + ""+KeyWord.uin+"_totalcount=12422;" 147 | + " QZ_FE_WEBP_SUPPORT=1;" 148 | + " cpu_performance_v8=1"); 149 | connect.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 150 | connect.timeout(1000000000); 151 | Response execute = connect.execute(); 152 | String body1 = execute.body(); 153 | byte[] bytes = body1.getBytes(); 154 | FileOutputStream fileOutputStream = new FileOutputStream("data.txt"); 155 | fileOutputStream.write(bytes); 156 | fileOutputStream.close(); 157 | FileReader fr = new FileReader(new File("data.txt")); 158 | BufferedReader br = new BufferedReader(fr); 159 | String result = ""; 160 | String line = br.readLine(); 161 | while (line != null) { 162 | if (line.contains("g_qzonetoken")) { 163 | result = line; 164 | break; 165 | } else { 166 | line = br.readLine(); 167 | } 168 | } 169 | br.close(); 170 | try { 171 | Thread.sleep(30); 172 | } catch (InterruptedException e) { 173 | } 174 | KeyWord.qzonetoken = result.substring(47, 131); 175 | } catch (IOException e) { 176 | InputNameAndPwd.login(); 177 | } 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/enter/login/Login.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.enter.login; 2 | 3 | import java.io.IOException; 4 | import java.util.HashMap; 5 | import java.util.Map; 6 | import java.util.Map.Entry; 7 | import java.util.Set; 8 | 9 | import org.jsoup.Connection; 10 | import org.jsoup.Connection.Response; 11 | import org.jsoup.Jsoup; 12 | import org.jsoup.nodes.Document; 13 | import org.jsoup.select.Elements; 14 | 15 | public class Login { 16 | 17 | public static Map cookies = new HashMap<>(); 18 | 19 | public static String login(String uin, String p, String checkStatus, String verifycode, String verifysession) throws IOException { 20 | Connection ignoreContentType = Jsoup.connect("http://ptlogin2.qq.com/login?" + 21 | "u=" + uin + 22 | "&verifycode=" + verifycode + 23 | "&pt_vcode_v1=" + checkStatus + 24 | "&pt_verifysession_v1=" + verifysession + 25 | "&p="+p+ 26 | "&pt_randsalt=0" + 27 | "&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone" + 28 | "&ptredirect=0" + 29 | "&h=1" + 30 | "&t=1" + 31 | "&g=1" + 32 | "&from_ui=1" + 33 | "&ptlang=2052" + 34 | "&action=2-1-1447938345482" + 35 | "&js_ver=10140" + 36 | "&js_type=1" + 37 | "&login_sig=" + 38 | "&pt_uistyle=32" + 39 | "&aid=549000912" + 40 | "&daid=5&") 41 | .ignoreContentType(true); 42 | ignoreContentType.timeout(10000000); 43 | Response response = ignoreContentType.execute(); 44 | cookies.putAll(response.cookies()); 45 | return response.body(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/enter/sig/SigInterface.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.enter.sig; 2 | 3 | import java.io.IOException; 4 | import java.util.Map; 5 | import java.util.Map.Entry; 6 | import java.util.Set; 7 | 8 | import org.jsoup.Connection.Response; 9 | import org.jsoup.Jsoup; 10 | 11 | public class SigInterface { 12 | 13 | /** 14 | * 15 | *

Title: getSig

16 | *

Description:

17 | * @param uin 18 | * @param cap_cd 19 | * @return 20 | * @throws IOException 21 | */ 22 | public static String getSig(String uin, String cap_cd) throws IOException { 23 | Response sigResponse = Jsoup.connect("http://captcha.qq.com/cap_union_getsig_new?" + "clientype=2" + "&captype=" 24 | + "&protocol=http" + "&disturblevel=" + "&apptype=2" + "&noBorder=noborder" + "&showtype=embed" 25 | + "&rnd=181847" + "&aid=549000912" + "&uin=" + uin + "&cap_cd=" + cap_cd + // 由check接口响应获得 26 | "&rand=0.5029603082194563").execute(); 27 | String body = sigResponse.body(); 28 | String temp = body; 29 | String beginString = "{\"vsig\":\""; 30 | String sig = temp.substring(temp.indexOf(beginString) + beginString.length(), temp.indexOf("\",\"")); 31 | return sig; 32 | } 33 | 34 | /** 35 | * 36 | *

Title: refreshSig

37 | *

Description:

38 | * @param uin 39 | * @param oldSig 40 | * @throws IOException 41 | */ 42 | public static String refreshSig(String uin,String oldSig) throws IOException{ 43 | Response response = Jsoup.connect("http://captcha.qq.com/getQueSig?" + 44 | "aid=549000912" + 45 | "&uin=" + uin + 46 | "&captype=2" + 47 | "&sig=" + oldSig + 48 | "&0.6583711083512753") 49 | .execute(); 50 | String newSig = response.body().split(";")[2].split("\"")[1]; 51 | return newSig; 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/getdata/GetMsgBoard.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.getdata; 2 | 3 | import java.io.IOException; 4 | 5 | import org.bianqi.enter.encrypt.QzoneEncrypt; 6 | import org.bianqi.enter.key.KeyWord; 7 | import org.bianqi.enter.login.InputNameAndPwd; 8 | import org.jsoup.Connection; 9 | import org.jsoup.Jsoup; 10 | import org.jsoup.Connection.Response; 11 | 12 | public class GetMsgBoard { 13 | public static void getMsg(String QQNum) throws IOException{ 14 | //首先得登录哦~~~ 15 | InputNameAndPwd.login(); 16 | //======================================获取留言板JSON数据================================= 17 | Connection connect4 = Jsoup.connect("https://h5.qzone.qq.com/proxy/domain/m.qzone.qq.com/" 18 | + "cgi-bin/new/get_msgb?" 19 | + "uin=+"+KeyWord.uin+"&" 20 | + "hostUin=+"+QQNum+"&" 21 | + "start=0&" 22 | + "s=0.8193196364506001" 23 | + "&format=jsonp&" 24 | + "num=10&" 25 | + "inCharset=utf-8&" 26 | + "outCharset=utf-8&" 27 | + "g_tk="+QzoneEncrypt.encryptg_k(KeyWord.p_skey)+"&" 28 | + "qzonetoken="+KeyWord.qzonetoken); 29 | connect4.cookie("cookie", "pgv_si=s9635414016;" 30 | + " _qpsvr_localtk=0.9215949376165553; " 31 | + "pgv_pvid=7070951083;" 32 | + " pgv_info=ssid=s2050395600; " 33 | + "ptui_loginuin=+"+KeyWord.uin+";" 34 | + " ptisp=cm;" 35 | + " RK=vucf0uGrQV; " 36 | + "ptcz="+KeyWord.ptcz+"; " 37 | + "pt2gguin=o+"+KeyWord.uin+"; " 38 | + "uin=o+"+KeyWord.uin+"; " 39 | + "skey="+KeyWord.skey+";" 40 | + " p_uin=o+"+KeyWord.uin+";" 41 | + " p_skey="+KeyWord.p_skey+"; " 42 | + "pt4_token="+KeyWord.pt4_token+";" 43 | + " QZ_FE_WEBP_SUPPORT=1;" 44 | + "cpu_performance_v8=0;" 45 | + " __Q_w_s__QZN_TodoMsgCnt=1"); 46 | connect4.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 47 | connect4.header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 48 | connect4.header("Connection", "keep-alive"); 49 | connect4.ignoreContentType(true); 50 | Response execute5 = connect4.execute(); 51 | String body3 = execute5.body(); 52 | System.out.println(body3); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/getdata/GetQNum.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.getdata; 2 | 3 | import java.io.IOException; 4 | 5 | import org.bianqi.enter.encrypt.QzoneEncrypt; 6 | import org.bianqi.enter.key.KeyWord; 7 | import org.bianqi.enter.login.InputNameAndPwd; 8 | import org.jsoup.Connection; 9 | import org.jsoup.Jsoup; 10 | import org.jsoup.Connection.Response; 11 | 12 | public class GetQNum { 13 | 14 | public static void getQQNum() throws IOException{ 15 | //先登录哦~~ 16 | InputNameAndPwd.login(); 17 | //======================================获取所有好友的QQ号JSON数据================================= 18 | Connection connect4 = Jsoup.connect("https://h5.qzone.qq.com/proxy/domain/r.qzone.qq.com/" 19 | + "cgi-bin/tfriend/friend_ship_manager.cgi?" 20 | + "uin="+KeyWord.uin+"&" 21 | + "do=1&" 22 | + "rd=0.05828653278646945&" 23 | + "fupdate=1&" 24 | + "clean=1&" 25 | + "g_tk="+QzoneEncrypt.encryptg_k(KeyWord.p_skey)+"&" 26 | + "qzonetoken="+KeyWord.qzonetoken); 27 | connect4.cookie("cookie", "pgv_si=s9635414016;" 28 | + " RK=vvcfluGbQX; " 29 | + "pgv_pvid=8028248064;" 30 | + " __Q_w_s__QZN_TodoMsgCnt=1" 31 | + "pgv_si=s6404112384;" 32 | + " _qpsvr_localtk=0.7002974565386917; " 33 | + " pgv_info=ssid=s9053713533; " 34 | + "ptui_loginuin=+"+KeyWord.uin+";" 35 | + " ptisp=cm;" 36 | + "ptcz="+KeyWord.ptcz+"; " 37 | + "pt2gguin=o+"+KeyWord.uin+"; " 38 | + "uin=o+"+KeyWord.uin+"; " 39 | + "skey="+KeyWord.skey+";" 40 | + " p_uin=o+"+KeyWord.uin+";" 41 | + " p_skey="+KeyWord.p_skey+"; " 42 | + "pt4_token="+KeyWord.pt4_token+";" 43 | + " QZ_FE_WEBP_SUPPORT=1;" 44 | + "cpu_performance_v8=0;"); 45 | connect4.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 46 | connect4.header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 47 | connect4.header("Connection", "keep-alive"); 48 | connect4.ignoreContentType(true); 49 | Response execute5 = connect4.execute(); 50 | String body3 = execute5.body(); 51 | System.out.println(body3); 52 | } 53 | 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/org/bianqi/getdata/GetShuoShuoData.java: -------------------------------------------------------------------------------- 1 | package org.bianqi.getdata; 2 | 3 | import java.io.File; 4 | import java.io.FileOutputStream; 5 | import java.io.IOException; 6 | 7 | import org.bianqi.enter.encrypt.QzoneEncrypt; 8 | import org.bianqi.enter.key.KeyWord; 9 | import org.bianqi.enter.login.InputNameAndPwd; 10 | import org.jsoup.Connection; 11 | import org.jsoup.Connection.Response; 12 | import org.jsoup.Jsoup; 13 | 14 | public class GetShuoShuoData { 15 | public static void getShuoData(String QQNum) throws IOException{ 16 | //先登录哦~~ 17 | //======================================获取说说JSON数据================================= 18 | Connection connect2 = Jsoup.connect("https://h5.qzone.qq.com/proxy/domain/" 19 | + "taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?" 20 | + "uin="+QQNum+"&" 21 | + "ftype=0&sort=0&" 22 | + "pos=0&num=20&" 23 | + "replynum=100&" 24 | + "g_tk="+QzoneEncrypt.encryptg_k(KeyWord.p_skey)+"&" 25 | + "callback=_preloadCallback&" 26 | + "code_version=1&" 27 | + "format=jsonp&" 28 | + "need_private_comment=1&" 29 | + "qzonetoken="+KeyWord.qzonetoken); 30 | connect2.cookie("cookie", "pgv_si=s9635414016;" 31 | + " _qpsvr_localtk=0.9215949376165553; " 32 | + "pgv_pvid=7070951083;" 33 | + " pgv_info=ssid=s2050395600; " 34 | + "ptui_loginuin="+KeyWord.uin+";" 35 | + " ptisp=cm;" 36 | + " RK=vucf0uGrQV; " 37 | + "ptcz="+KeyWord.ptcz+"; " 38 | + "pt2gguin=o"+KeyWord.uin+"; " 39 | + "uin=o+"+KeyWord.uin+"; " 40 | + "skey="+KeyWord.skey+";" 41 | + " p_uin=o+"+KeyWord.uin+";" 42 | + " p_skey="+KeyWord.p_skey+"; " 43 | + "pt4_token="+KeyWord.pt4_token+";" 44 | + " QZ_FE_WEBP_SUPPORT=1; " 45 | + "cpu_performance_v8=0;" 46 | + " __Q_w_s__QZN_TodoMsgCnt=1"); 47 | connect2.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 48 | connect2.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 49 | connect2.header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 50 | connect2.header("Connection", "keep-alive"); 51 | connect2.timeout(500000000); 52 | Response execute3 = connect2.execute(); 53 | String body2 = execute3.body(); 54 | FileOutputStream fileOutputStream = new FileOutputStream(new File("E://out//"+QQNum+".dat")); 55 | byte[] bytes = body2.getBytes(); 56 | fileOutputStream.write(bytes); 57 | fileOutputStream.close(); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/resources/entry.js: -------------------------------------------------------------------------------- 1 | function getACSRFToken(str) { 2 | var hash = 5381; 3 | for (var i = 0, len = str.length;i < len;++i) { 4 | hash += (hash << 5) + str.charCodeAt(i); 5 | } 6 | return hash & 2147483647; 7 | }; -------------------------------------------------------------------------------- /src/main/resources/login.js: -------------------------------------------------------------------------------- 1 | var window = window || {}; 2 | var navigator = navigator|| {}; 3 | $ = window.$ || {}; 4 | 5 | $.RSA = function () { 6 | function g(z, t) { 7 | return new ar(z, t) 8 | } 9 | function ah(aA, aB) { 10 | var t = ''; 11 | var z = 0; 12 | while (z + aB < aA.length) { 13 | t += aA.substring(z, z + aB) + '\n'; 14 | z += aB 15 | } 16 | return t + aA.substring(z, aA.length) 17 | } 18 | function r(t) { 19 | if (t < 16) { 20 | return '0' + t.toString(16) 21 | } else { 22 | return t.toString(16) 23 | } 24 | } 25 | function af(aB, aE) { 26 | if (aE < aB.length + 11) { 27 | uv_alert('Message too long for RSA'); 28 | return null 29 | } 30 | var aD = new Array(); 31 | var aA = aB.length - 1; 32 | while (aA >= 0 && aE > 0) { 33 | var aC = aB.charCodeAt(aA--); 34 | aD[--aE] = aC 35 | } 36 | aD[--aE] = 0; 37 | var z = new ad(); 38 | var t = new Array(); 39 | while (aE > 2) { 40 | t[0] = 0; 41 | while (t[0] == 0) { 42 | z.nextBytes(t) 43 | } 44 | aD[--aE] = t[0] 45 | } 46 | aD[--aE] = 2; 47 | aD[--aE] = 0; 48 | return new ar(aD) 49 | } 50 | function L() { 51 | this.n = null; 52 | this.e = 0; 53 | this.d = null; 54 | this.p = null; 55 | this.q = null; 56 | this.dmp1 = null; 57 | this.dmq1 = null; 58 | this.coeff = null 59 | } 60 | function o(z, t) { 61 | if (z != null && t != null && z.length > 0 && t.length > 0) { 62 | this.n = g(z, 16); 63 | this.e = parseInt(t, 16) 64 | } else { 65 | uv_alert('Invalid RSA public key') 66 | } 67 | } 68 | function W(t) { 69 | return t.modPowInt(this.e, this.n) 70 | } 71 | function p(aA) { 72 | var t = af(aA, (this.n.bitLength() + 7) >> 3); 73 | if (t == null) { 74 | return null 75 | } 76 | var aB = this.doPublic(t); 77 | if (aB == null) { 78 | return null 79 | } 80 | var z = aB.toString(16); 81 | if ((z.length & 1) == 0) { 82 | return z 83 | } else { 84 | return '0' + z 85 | } 86 | } 87 | L.prototype.doPublic = W; 88 | L.prototype.setPublic = o; 89 | L.prototype.encrypt = p; 90 | var aw; 91 | var ai = 244837814094590; 92 | var Z = ((ai & 16777215) == 15715070); 93 | function ar(z, t, aA) { 94 | if (z != null) { 95 | if ('number' == typeof z) { 96 | this.fromNumber(z, t, aA) 97 | } else { 98 | if (t == null && 'string' != typeof z) { 99 | this.fromString(z, 256) 100 | } else { 101 | this.fromString(z, t) 102 | } 103 | } 104 | } 105 | } 106 | function h() { 107 | return new ar(null) 108 | } 109 | function b(aC, t, z, aB, aE, aD) { 110 | while (--aD >= 0) { 111 | var aA = t * this[aC++] + z[aB] + aE; 112 | aE = Math.floor(aA / 67108864); 113 | z[aB++] = aA & 67108863 114 | } 115 | return aE 116 | } 117 | function ay(aC, aH, aI, aB, aF, t) { 118 | var aE = aH & 32767, 119 | aG = aH >> 15; 120 | while (--t >= 0) { 121 | var aA = this[aC] & 32767; 122 | var aD = this[aC++] >> 15; 123 | var z = aG * aA + aD * aE; 124 | aA = aE * aA + ((z & 32767) << 15) + aI[aB] + (aF & 1073741823); 125 | aF = (aA >>> 30) + (z >>> 15) + aG * aD + (aF >>> 30); 126 | aI[aB++] = aA & 1073741823 127 | } 128 | return aF 129 | } 130 | function ax(aC, aH, aI, aB, aF, t) { 131 | var aE = aH & 16383, 132 | aG = aH >> 14; 133 | while (--t >= 0) { 134 | var aA = this[aC] & 16383; 135 | var aD = this[aC++] >> 14; 136 | var z = aG * aA + aD * aE; 137 | aA = aE * aA + ((z & 16383) << 14) + aI[aB] + aF; 138 | aF = (aA >> 28) + (z >> 14) + aG * aD; 139 | aI[aB++] = aA & 268435455 140 | } 141 | return aF 142 | } 143 | if (Z && (navigator.appName == 'Microsoft Internet Explorer')) { 144 | ar.prototype.am = ay; 145 | aw = 30 146 | } else { 147 | if (Z && (navigator.appName != 'Netscape')) { 148 | ar.prototype.am = b; 149 | aw = 26 150 | } else { 151 | ar.prototype.am = ax; 152 | aw = 28 153 | } 154 | } 155 | ar.prototype.DB = aw; 156 | ar.prototype.DM = ((1 << aw) - 1); 157 | ar.prototype.DV = (1 << aw); 158 | var aa = 52; 159 | ar.prototype.FV = Math.pow(2, aa); 160 | ar.prototype.F1 = aa - aw; 161 | ar.prototype.F2 = 2 * aw - aa; 162 | var ae = '0123456789abcdefghijklmnopqrstuvwxyz'; 163 | var ag = new Array(); 164 | var ap, 165 | v; 166 | ap = '0'.charCodeAt(0); 167 | for (v = 0; v <= 9; ++v) { 168 | ag[ap++] = v 169 | } 170 | ap = 'a'.charCodeAt(0); 171 | for (v = 10; v < 36; ++v) { 172 | ag[ap++] = v 173 | } 174 | ap = 'A'.charCodeAt(0); 175 | for (v = 10; v < 36; ++v) { 176 | ag[ap++] = v 177 | } 178 | function az(t) { 179 | return ae.charAt(t) 180 | } 181 | function A(z, t) { 182 | var aA = ag[z.charCodeAt(t)]; 183 | return (aA == null) ? - 1 : aA 184 | } 185 | function Y(z) { 186 | for (var t = this.t - 1; t >= 0; --t) { 187 | z[t] = this[t] 188 | } 189 | z.t = this.t; 190 | z.s = this.s 191 | } 192 | function n(t) { 193 | this.t = 1; 194 | this.s = (t < 0) ? - 1 : 0; 195 | if (t > 0) { 196 | this[0] = t 197 | } else { 198 | if (t < - 1) { 199 | this[0] = t + DV 200 | } else { 201 | this.t = 0 202 | } 203 | } 204 | } 205 | function c(t) { 206 | var z = h(); 207 | z.fromInt(t); 208 | return z 209 | } 210 | function w(aE, z) { 211 | var aB; 212 | if (z == 16) { 213 | aB = 4 214 | } else { 215 | if (z == 8) { 216 | aB = 3 217 | } else { 218 | if (z == 256) { 219 | aB = 8 220 | } else { 221 | if (z == 2) { 222 | aB = 1 223 | } else { 224 | if (z == 32) { 225 | aB = 5 226 | } else { 227 | if (z == 4) { 228 | aB = 2 229 | } else { 230 | this.fromRadix(aE, z); 231 | return 232 | } 233 | } 234 | } 235 | } 236 | } 237 | } 238 | this.t = 0; 239 | this.s = 0; 240 | var aD = aE.length, 241 | aA = false, 242 | aC = 0; 243 | while (--aD >= 0) { 244 | var t = (aB == 8) ? aE[aD] & 255 : A(aE, aD); 245 | if (t < 0) { 246 | if (aE.charAt(aD) == '-') { 247 | aA = true 248 | } 249 | continue 250 | } 251 | aA = false; 252 | if (aC == 0) { 253 | this[this.t++] = t 254 | } else { 255 | if (aC + aB > this.DB) { 256 | this[this.t - 1] |= (t & ((1 << (this.DB - aC)) - 1)) << aC; 257 | this[this.t++] = (t >> (this.DB - aC)) 258 | } else { 259 | this[this.t - 1] |= t << aC 260 | } 261 | } 262 | aC += aB; 263 | if (aC >= this.DB) { 264 | aC -= this.DB 265 | } 266 | } 267 | if (aB == 8 && (aE[0] & 128) != 0) { 268 | this.s = - 1; 269 | if (aC > 0) { 270 | this[this.t - 1] |= ((1 << (this.DB - aC)) - 1) << aC 271 | } 272 | } 273 | this.clamp(); 274 | if (aA) { 275 | ar.ZERO.subTo(this, this) 276 | } 277 | } 278 | function O() { 279 | var t = this.s & this.DM; 280 | while (this.t > 0 && this[this.t - 1] == t) { 281 | --this.t 282 | } 283 | } 284 | function q(z) { 285 | if (this.s < 0) { 286 | return '-' + this.negate().toString(z) 287 | } 288 | var aA; 289 | if (z == 16) { 290 | aA = 4 291 | } else { 292 | if (z == 8) { 293 | aA = 3 294 | } else { 295 | if (z == 2) { 296 | aA = 1 297 | } else { 298 | if (z == 32) { 299 | aA = 5 300 | } else { 301 | if (z == 4) { 302 | aA = 2 303 | } else { 304 | return this.toRadix(z) 305 | } 306 | } 307 | } 308 | } 309 | } 310 | var aC = (1 << aA) - 1, 311 | aF, 312 | t = false, 313 | aD = '', 314 | aB = this.t; 315 | var aE = this.DB - (aB * this.DB) % aA; 316 | if (aB-- > 0) { 317 | if (aE < this.DB && (aF = this[aB] >> aE) > 0) { 318 | t = true; 319 | aD = az(aF) 320 | } 321 | while (aB >= 0) { 322 | if (aE < aA) { 323 | aF = (this[aB] & ((1 << aE) - 1)) << (aA - aE); 324 | aF |= this[--aB] >> (aE += this.DB - aA) 325 | } else { 326 | aF = (this[aB] >> (aE -= aA)) & aC; 327 | if (aE <= 0) { 328 | aE += this.DB; 329 | --aB 330 | } 331 | } 332 | if (aF > 0) { 333 | t = true 334 | } 335 | if (t) { 336 | aD += az(aF) 337 | } 338 | } 339 | } 340 | return t ? aD : '0' 341 | } 342 | function R() { 343 | var t = h(); 344 | ar.ZERO.subTo(this, t); 345 | return t 346 | } 347 | function al() { 348 | return (this.s < 0) ? this.negate() : this 349 | } 350 | function G(t) { 351 | var aA = this.s - t.s; 352 | if (aA != 0) { 353 | return aA 354 | } 355 | var z = this.t; 356 | aA = z - t.t; 357 | if (aA != 0) { 358 | return aA 359 | } 360 | while (--z >= 0) { 361 | if ((aA = this[z] - t[z]) != 0) { 362 | return aA 363 | } 364 | } 365 | return 0 366 | } 367 | function j(z) { 368 | var aB = 1, 369 | aA; 370 | if ((aA = z >>> 16) != 0) { 371 | z = aA; 372 | aB += 16 373 | } 374 | if ((aA = z >> 8) != 0) { 375 | z = aA; 376 | aB += 8 377 | } 378 | if ((aA = z >> 4) != 0) { 379 | z = aA; 380 | aB += 4 381 | } 382 | if ((aA = z >> 2) != 0) { 383 | z = aA; 384 | aB += 2 385 | } 386 | if ((aA = z >> 1) != 0) { 387 | z = aA; 388 | aB += 1 389 | } 390 | return aB 391 | } 392 | function u() { 393 | if (this.t <= 0) { 394 | return 0 395 | } 396 | return this.DB * (this.t - 1) + j(this[this.t - 1] ^ (this.s & this.DM)) 397 | } 398 | function aq(aA, z) { 399 | var t; 400 | for (t = this.t - 1; t >= 0; --t) { 401 | z[t + aA] = this[t] 402 | } 403 | for (t = aA - 1; t >= 0; --t) { 404 | z[t] = 0 405 | } 406 | z.t = this.t + aA; 407 | z.s = this.s 408 | } 409 | function X(aA, z) { 410 | for (var t = aA; t < this.t; ++t) { 411 | z[t - aA] = this[t] 412 | } 413 | z.t = Math.max(this.t - aA, 0); 414 | z.s = this.s 415 | } 416 | function s(aF, aB) { 417 | var z = aF % this.DB; 418 | var t = this.DB - z; 419 | var aD = (1 << t) - 1; 420 | var aC = Math.floor(aF / this.DB), 421 | aE = (this.s << z) & this.DM, 422 | aA; 423 | for (aA = this.t - 1; aA >= 0; --aA) { 424 | aB[aA + aC + 1] = (this[aA] >> t) | aE; 425 | aE = (this[aA] & aD) << z 426 | } 427 | for (aA = aC - 1; aA >= 0; --aA) { 428 | aB[aA] = 0 429 | } 430 | aB[aC] = aE; 431 | aB.t = this.t + aC + 1; 432 | aB.s = this.s; 433 | aB.clamp() 434 | } 435 | function l(aE, aB) { 436 | aB.s = this.s; 437 | var aC = Math.floor(aE / this.DB); 438 | if (aC >= this.t) { 439 | aB.t = 0; 440 | return 441 | } 442 | var z = aE % this.DB; 443 | var t = this.DB - z; 444 | var aD = (1 << z) - 1; 445 | aB[0] = this[aC] >> z; 446 | for (var aA = aC + 1; aA < this.t; ++aA) { 447 | aB[aA - aC - 1] |= (this[aA] & aD) << t; 448 | aB[aA - aC] = this[aA] >> z 449 | } 450 | if (z > 0) { 451 | aB[this.t - aC - 1] |= (this.s & aD) << t 452 | } 453 | aB.t = this.t - aC; 454 | aB.clamp() 455 | } 456 | function ab(z, aB) { 457 | var aA = 0, 458 | aC = 0, 459 | t = Math.min(z.t, this.t); 460 | while (aA < t) { 461 | aC += this[aA] - z[aA]; 462 | aB[aA++] = aC & this.DM; 463 | aC >>= this.DB 464 | } 465 | if (z.t < this.t) { 466 | aC -= z.s; 467 | while (aA < this.t) { 468 | aC += this[aA]; 469 | aB[aA++] = aC & this.DM; 470 | aC >>= this.DB 471 | } 472 | aC += this.s 473 | } else { 474 | aC += this.s; 475 | while (aA < z.t) { 476 | aC -= z[aA]; 477 | aB[aA++] = aC & this.DM; 478 | aC >>= this.DB 479 | } 480 | aC -= z.s 481 | } 482 | aB.s = (aC < 0) ? - 1 : 0; 483 | if (aC < - 1) { 484 | aB[aA++] = this.DV + aC 485 | } else { 486 | if (aC > 0) { 487 | aB[aA++] = aC 488 | } 489 | } 490 | aB.t = aA; 491 | aB.clamp() 492 | } 493 | function D(z, aB) { 494 | var t = this.abs(), 495 | aC = z.abs(); 496 | var aA = t.t; 497 | aB.t = aA + aC.t; 498 | while (--aA >= 0) { 499 | aB[aA] = 0 500 | } 501 | for (aA = 0; aA < aC.t; ++aA) { 502 | aB[aA + t.t] = t.am(0, aC[aA], aB, aA, 0, t.t) 503 | } 504 | aB.s = 0; 505 | aB.clamp(); 506 | if (this.s != z.s) { 507 | ar.ZERO.subTo(aB, aB) 508 | } 509 | } 510 | function Q(aA) { 511 | var t = this.abs(); 512 | var z = aA.t = 2 * t.t; 513 | while (--z >= 0) { 514 | aA[z] = 0 515 | } 516 | for (z = 0; z < t.t - 1; ++z) { 517 | var aB = t.am(z, t[z], aA, 2 * z, 0, 1); 518 | if ((aA[z + t.t] += t.am(z + 1, 2 * t[z], aA, 2 * z + 1, aB, t.t - z - 1)) >= t.DV) { 519 | aA[z + t.t] -= t.DV; 520 | aA[z + t.t + 1] = 1 521 | } 522 | } 523 | if (aA.t > 0) { 524 | aA[aA.t - 1] += t.am(z, t[z], aA, 2 * z, 0, 1) 525 | } 526 | aA.s = 0; 527 | aA.clamp() 528 | } 529 | function E(aI, aF, aE) { 530 | var aO = aI.abs(); 531 | if (aO.t <= 0) { 532 | return 533 | } 534 | var aG = this.abs(); 535 | if (aG.t < aO.t) { 536 | if (aF != null) { 537 | aF.fromInt(0) 538 | } 539 | if (aE != null) { 540 | this.copyTo(aE) 541 | } 542 | return 543 | } 544 | if (aE == null) { 545 | aE = h() 546 | } 547 | var aC = h(), 548 | z = this.s, 549 | aH = aI.s; 550 | var aN = this.DB - j(aO[aO.t - 1]); 551 | if (aN > 0) { 552 | aO.lShiftTo(aN, aC); 553 | aG.lShiftTo(aN, aE) 554 | } else { 555 | aO.copyTo(aC); 556 | aG.copyTo(aE) 557 | } 558 | var aK = aC.t; 559 | var aA = aC[aK - 1]; 560 | if (aA == 0) { 561 | return 562 | } 563 | var aJ = aA * (1 << this.F1) + ((aK > 1) ? aC[aK - 2] >> this.F2 : 0); 564 | var aR = this.FV / aJ, 565 | aQ = (1 << this.F1) / aJ, 566 | aP = 1 << this.F2; 567 | var aM = aE.t, 568 | aL = aM - aK, 569 | aD = (aF == null) ? h() : aF; 570 | aC.dlShiftTo(aL, aD); 571 | if (aE.compareTo(aD) >= 0) { 572 | aE[aE.t++] = 1; 573 | aE.subTo(aD, aE) 574 | } 575 | ar.ONE.dlShiftTo(aK, aD); 576 | aD.subTo(aC, aC); 577 | while (aC.t < aK) { 578 | aC[aC.t++] = 0 579 | } 580 | while (--aL >= 0) { 581 | var aB = (aE[--aM] == aA) ? this.DM : Math.floor(aE[aM] * aR + (aE[aM - 1] + aP) * aQ); 582 | if ((aE[aM] += aC.am(0, aB, aE, aL, 0, aK)) < aB) { 583 | aC.dlShiftTo(aL, aD); 584 | aE.subTo(aD, aE); 585 | while (aE[aM] < --aB) { 586 | aE.subTo(aD, aE) 587 | } 588 | } 589 | } 590 | if (aF != null) { 591 | aE.drShiftTo(aK, aF); 592 | if (z != aH) { 593 | ar.ZERO.subTo(aF, aF) 594 | } 595 | } 596 | aE.t = aK; 597 | aE.clamp(); 598 | if (aN > 0) { 599 | aE.rShiftTo(aN, aE) 600 | } 601 | if (z < 0) { 602 | ar.ZERO.subTo(aE, aE) 603 | } 604 | } 605 | function N(t) { 606 | var z = h(); 607 | this.abs().divRemTo(t, null, z); 608 | if (this.s < 0 && z.compareTo(ar.ZERO) > 0) { 609 | t.subTo(z, z) 610 | } 611 | return z 612 | } 613 | function K(t) { 614 | this.m = t 615 | } 616 | function V(t) { 617 | if (t.s < 0 || t.compareTo(this.m) >= 0) { 618 | return t.mod(this.m) 619 | } else { 620 | return t 621 | } 622 | } 623 | function ak(t) { 624 | return t 625 | } 626 | function J(t) { 627 | t.divRemTo(this.m, null, t) 628 | } 629 | function H(t, aA, z) { 630 | t.multiplyTo(aA, z); 631 | this.reduce(z) 632 | } 633 | function au(t, z) { 634 | t.squareTo(z); 635 | this.reduce(z) 636 | } 637 | K.prototype.convert = V; 638 | K.prototype.revert = ak; 639 | K.prototype.reduce = J; 640 | K.prototype.mulTo = H; 641 | K.prototype.sqrTo = au; 642 | function B() { 643 | if (this.t < 1) { 644 | return 0 645 | } 646 | var t = this[0]; 647 | if ((t & 1) == 0) { 648 | return 0 649 | } 650 | var z = t & 3; 651 | z = (z * (2 - (t & 15) * z)) & 15; 652 | z = (z * (2 - (t & 255) * z)) & 255; 653 | z = (z * (2 - (((t & 65535) * z) & 65535))) & 65535; 654 | z = (z * (2 - t * z % this.DV)) % this.DV; 655 | return (z > 0) ? this.DV - z : - z 656 | } 657 | function f(t) { 658 | this.m = t; 659 | this.mp = t.invDigit(); 660 | this.mpl = this.mp & 32767; 661 | this.mph = this.mp >> 15; 662 | this.um = (1 << (t.DB - 15)) - 1; 663 | this.mt2 = 2 * t.t 664 | } 665 | function aj(t) { 666 | var z = h(); 667 | t.abs().dlShiftTo(this.m.t, z); 668 | z.divRemTo(this.m, null, z); 669 | if (t.s < 0 && z.compareTo(ar.ZERO) > 0) { 670 | this.m.subTo(z, z) 671 | } 672 | return z 673 | } 674 | function at(t) { 675 | var z = h(); 676 | t.copyTo(z); 677 | this.reduce(z); 678 | return z 679 | } 680 | function P(t) { 681 | while (t.t <= this.mt2) { 682 | t[t.t++] = 0 683 | } 684 | for (var aA = 0; aA < this.m.t; ++aA) { 685 | var z = t[aA] & 32767; 686 | var aB = (z * this.mpl + (((z * this.mph + (t[aA] >> 15) * this.mpl) & this.um) << 15)) & t.DM; 687 | z = aA + this.m.t; 688 | t[z] += this.m.am(0, aB, t, aA, 0, this.m.t); 689 | while (t[z] >= t.DV) { 690 | t[z] -= t.DV; 691 | t[++z]++ 692 | } 693 | } 694 | t.clamp(); 695 | t.drShiftTo(this.m.t, t); 696 | if (t.compareTo(this.m) >= 0) { 697 | t.subTo(this.m, t) 698 | } 699 | } 700 | function am(t, z) { 701 | t.squareTo(z); 702 | this.reduce(z) 703 | } 704 | function y(t, aA, z) { 705 | t.multiplyTo(aA, z); 706 | this.reduce(z) 707 | } 708 | f.prototype.convert = aj; 709 | f.prototype.revert = at; 710 | f.prototype.reduce = P; 711 | f.prototype.mulTo = y; 712 | f.prototype.sqrTo = am; 713 | function i() { 714 | return ((this.t > 0) ? (this[0] & 1) : this.s) == 0 715 | } 716 | function x(aF, aG) { 717 | if (aF > 4294967295 || aF < 1) { 718 | return ar.ONE 719 | } 720 | var aE = h(), 721 | aA = h(), 722 | aD = aG.convert(this), 723 | aC = j(aF) - 1; 724 | aD.copyTo(aE); 725 | while (--aC >= 0) { 726 | aG.sqrTo(aE, aA); 727 | if ((aF & (1 << aC)) > 0) { 728 | aG.mulTo(aA, aD, aE) 729 | } else { 730 | var aB = aE; 731 | aE = aA; 732 | aA = aB 733 | } 734 | } 735 | return aG.revert(aE) 736 | } 737 | function an(aA, t) { 738 | var aB; 739 | if (aA < 256 || t.isEven()) { 740 | aB = new K(t) 741 | } else { 742 | aB = new f(t) 743 | } 744 | return this.exp(aA, aB) 745 | } 746 | ar.prototype.copyTo = Y; 747 | ar.prototype.fromInt = n; 748 | ar.prototype.fromString = w; 749 | ar.prototype.clamp = O; 750 | ar.prototype.dlShiftTo = aq; 751 | ar.prototype.drShiftTo = X; 752 | ar.prototype.lShiftTo = s; 753 | ar.prototype.rShiftTo = l; 754 | ar.prototype.subTo = ab; 755 | ar.prototype.multiplyTo = D; 756 | ar.prototype.squareTo = Q; 757 | ar.prototype.divRemTo = E; 758 | ar.prototype.invDigit = B; 759 | ar.prototype.isEven = i; 760 | ar.prototype.exp = x; 761 | ar.prototype.toString = q; 762 | ar.prototype.negate = R; 763 | ar.prototype.abs = al; 764 | ar.prototype.compareTo = G; 765 | ar.prototype.bitLength = u; 766 | ar.prototype.mod = N; 767 | ar.prototype.modPowInt = an; 768 | ar.ZERO = c(0); 769 | ar.ONE = c(1); 770 | var m; 771 | var U; 772 | var ac; 773 | function d(t) { 774 | U[ac++] ^= t & 255; 775 | U[ac++] ^= (t >> 8) & 255; 776 | U[ac++] ^= (t >> 16) & 255; 777 | U[ac++] ^= (t >> 24) & 255; 778 | if (ac >= M) { 779 | ac -= M 780 | } 781 | } 782 | function T() { 783 | d(new Date().getTime()) 784 | } 785 | if (U == null) { 786 | U = new Array(); 787 | ac = 0; 788 | var I; 789 | if (navigator.appName == 'Netscape' && navigator.appVersion < '5' && window.crypto && window.crypto.random) { 790 | var F = window.crypto.random(32); 791 | for (I = 0; I < F.length; ++I) { 792 | U[ac++] = F.charCodeAt(I) & 255 793 | } 794 | } 795 | while (ac < M) { 796 | I = Math.floor(65536 * Math.random()); 797 | U[ac++] = I >>> 8; 798 | U[ac++] = I & 255 799 | } 800 | ac = 0; 801 | T() 802 | } 803 | function C() { 804 | if (m == null) { 805 | T(); 806 | m = ao(); 807 | m.init(U); 808 | for (ac = 0; ac < U.length; ++ac) { 809 | U[ac] = 0 810 | } 811 | ac = 0 812 | } 813 | return m.next() 814 | } 815 | function av(z) { 816 | var t; 817 | for (t = 0; t < z.length; ++t) { 818 | z[t] = C() 819 | } 820 | } 821 | function ad() { 822 | } 823 | ad.prototype.nextBytes = av; 824 | function k() { 825 | this.i = 0; 826 | this.j = 0; 827 | this.S = new Array() 828 | } 829 | function e(aC) { 830 | var aB, 831 | z, 832 | aA; 833 | for (aB = 0; aB < 256; ++aB) { 834 | this.S[aB] = aB 835 | } 836 | z = 0; 837 | for (aB = 0; aB < 256; ++aB) { 838 | z = (z + this.S[aB] + aC[aB % aC.length]) & 255; 839 | aA = this.S[aB]; 840 | this.S[aB] = this.S[z]; 841 | this.S[z] = aA 842 | } 843 | this.i = 0; 844 | this.j = 0 845 | } 846 | function a() { 847 | var z; 848 | this.i = (this.i + 1) & 255; 849 | this.j = (this.j + this.S[this.i]) & 255; 850 | z = this.S[this.i]; 851 | this.S[this.i] = this.S[this.j]; 852 | this.S[this.j] = z; 853 | return this.S[(z + this.S[this.i]) & 255] 854 | } 855 | k.prototype.init = e; 856 | k.prototype.next = a; 857 | function ao() { 858 | return new k() 859 | } 860 | var M = 256; 861 | function S(aB, aA, z) { 862 | aA = 'F20CE00BAE5361F8FA3AE9CEFA495362FF7DA1BA628F64A347F0A8C012BF0B254A30CD92ABFFE7A6EE0DC424CB6166F8819EFA5BCCB20EDFB4AD02E412CCF579B1CA711D55B8B0B3AEB60153D5E0693A2A86F3167D7847A0CB8B00004716A9095D9BADC977CBB804DBDCBA6029A9710869A453F27DFDDF83C016D928B3CBF4C7'; 863 | z = '3'; 864 | var t = new L(); 865 | t.setPublic(aA, z); 866 | return t.encrypt(aB) 867 | } 868 | return { 869 | rsa_encrypt: S 870 | } 871 | }(); 872 | 873 | var q= window ||{}; 874 | (function (q) { 875 | var r = '', 876 | a = 0, 877 | g = [ 878 | ], 879 | w = [ 880 | ], 881 | x = 0, 882 | t = 0, 883 | l = [ 884 | ], 885 | s = [ 886 | ], 887 | m = true; 888 | function e() { 889 | return Math.round(Math.random() * 4294967295) 890 | } 891 | function i(B, C, y) { 892 | if (!y || y > 4) { 893 | y = 4 894 | } 895 | var z = 0; 896 | for (var A = C; A < C + y; A++) { 897 | z <<= 8; 898 | z |= B[A] 899 | } 900 | return (z & 4294967295) >>> 0 901 | } 902 | function b(z, A, y) { 903 | z[A + 3] = (y >> 0) & 255; 904 | z[A + 2] = (y >> 8) & 255; 905 | z[A + 1] = (y >> 16) & 255; 906 | z[A + 0] = (y >> 24) & 255 907 | } 908 | function v(B) { 909 | if (!B) { 910 | return '' 911 | } 912 | var y = ''; 913 | for (var z = 0; z < B.length; z++) { 914 | var A = Number(B[z]).toString(16); 915 | if (A.length == 1) { 916 | A = '0' + A 917 | } 918 | y += A 919 | } 920 | return y 921 | } 922 | function u(z) { 923 | var A = ''; 924 | for (var y = 0; y < z.length; y += 2) { 925 | A += String.fromCharCode(parseInt(z.substr(y, 2), 16)) 926 | } 927 | return A 928 | } 929 | function c(A) { 930 | if (!A) { 931 | return '' 932 | } 933 | var z = [ 934 | ]; 935 | for (var y = 0; y < A.length; y++) { 936 | z[y] = A.charCodeAt(y) 937 | } 938 | return v(z) 939 | } 940 | function h(A) { 941 | g = new Array(8); 942 | w = new Array(8); 943 | x = t = 0; 944 | m = true; 945 | a = 0; 946 | var y = A.length; 947 | var B = 0; 948 | a = (y + 10) % 8; 949 | if (a != 0) { 950 | a = 8 - a 951 | } 952 | l = new Array(y + a + 10); 953 | g[0] = ((e() & 248) | a) & 255; 954 | for (var z = 1; z <= a; z++) { 955 | g[z] = e() & 255 956 | } 957 | a++; 958 | for (var z = 0; z < 8; z++) { 959 | w[z] = 0 960 | } 961 | B = 1; 962 | while (B <= 2) { 963 | if (a < 8) { 964 | g[a++] = e() & 255; 965 | B++ 966 | } 967 | if (a == 8) { 968 | o() 969 | } 970 | } 971 | var z = 0; 972 | while (y > 0) { 973 | if (a < 8) { 974 | g[a++] = A[z++]; 975 | y-- 976 | } 977 | if (a == 8) { 978 | o() 979 | } 980 | } 981 | B = 1; 982 | while (B <= 7) { 983 | if (a < 8) { 984 | g[a++] = 0; 985 | B++ 986 | } 987 | if (a == 8) { 988 | o() 989 | } 990 | } 991 | return l 992 | } 993 | function p(C) { 994 | var B = 0; 995 | var z = new Array(8); 996 | var y = C.length; 997 | s = C; 998 | if (y % 8 != 0 || y < 16) { 999 | return null 1000 | } 1001 | w = k(C); 1002 | a = w[0] & 7; 1003 | B = y - a - 10; 1004 | if (B < 0) { 1005 | return null 1006 | } 1007 | for (var A = 0; A < z.length; A++) { 1008 | z[A] = 0 1009 | } 1010 | l = new Array(B); 1011 | t = 0; 1012 | x = 8; 1013 | a++; 1014 | var D = 1; 1015 | while (D <= 2) { 1016 | if (a < 8) { 1017 | a++; 1018 | D++ 1019 | } 1020 | if (a == 8) { 1021 | z = C; 1022 | if (!f()) { 1023 | return null 1024 | } 1025 | } 1026 | } 1027 | var A = 0; 1028 | while (B != 0) { 1029 | if (a < 8) { 1030 | l[A] = (z[t + a] ^ w[a]) & 255; 1031 | A++; 1032 | B--; 1033 | a++ 1034 | } 1035 | if (a == 8) { 1036 | z = C; 1037 | t = x - 8; 1038 | if (!f()) { 1039 | return null 1040 | } 1041 | } 1042 | } 1043 | for (D = 1; D < 8; D++) { 1044 | if (a < 8) { 1045 | if ((z[t + a] ^ w[a]) != 0) { 1046 | return null 1047 | } 1048 | a++ 1049 | } 1050 | if (a == 8) { 1051 | z = C; 1052 | t = x; 1053 | if (!f()) { 1054 | return null 1055 | } 1056 | } 1057 | } 1058 | return l 1059 | } 1060 | function o() { 1061 | for (var y = 0; y < 8; y++) { 1062 | if (m) { 1063 | g[y] ^= w[y] 1064 | } else { 1065 | g[y] ^= l[t + y] 1066 | } 1067 | } 1068 | var z = j(g); 1069 | for (var y = 0; y < 8; y++) { 1070 | l[x + y] = z[y] ^ w[y]; 1071 | w[y] = g[y] 1072 | } 1073 | t = x; 1074 | x += 8; 1075 | a = 0; 1076 | m = false 1077 | } 1078 | function j(A) { 1079 | var B = 16; 1080 | var G = i(A, 0, 4); 1081 | var F = i(A, 4, 4); 1082 | var I = i(r, 0, 4); 1083 | var H = i(r, 4, 4); 1084 | var E = i(r, 8, 4); 1085 | var D = i(r, 12, 4); 1086 | var C = 0; 1087 | var J = 2654435769 >>> 0; 1088 | while (B-- > 0) { 1089 | C += J; 1090 | C = (C & 4294967295) >>> 0; 1091 | G += ((F << 4) + I) ^ (F + C) ^ ((F >>> 5) + H); 1092 | G = (G & 4294967295) >>> 0; 1093 | F += ((G << 4) + E) ^ (G + C) ^ ((G >>> 5) + D); 1094 | F = (F & 4294967295) >>> 0 1095 | } 1096 | var K = new Array(8); 1097 | b(K, 0, G); 1098 | b(K, 4, F); 1099 | return K 1100 | } 1101 | function k(A) { 1102 | var B = 16; 1103 | var G = i(A, 0, 4); 1104 | var F = i(A, 4, 4); 1105 | var I = i(r, 0, 4); 1106 | var H = i(r, 4, 4); 1107 | var E = i(r, 8, 4); 1108 | var D = i(r, 12, 4); 1109 | var C = 3816266640 >>> 0; 1110 | var J = 2654435769 >>> 0; 1111 | while (B-- > 0) { 1112 | F -= ((G << 4) + E) ^ (G + C) ^ ((G >>> 5) + D); 1113 | F = (F & 4294967295) >>> 0; 1114 | G -= ((F << 4) + I) ^ (F + C) ^ ((F >>> 5) + H); 1115 | G = (G & 4294967295) >>> 0; 1116 | C -= J; 1117 | C = (C & 4294967295) >>> 0 1118 | } 1119 | var K = new Array(8); 1120 | b(K, 0, G); 1121 | b(K, 4, F); 1122 | return K 1123 | } 1124 | function f() { 1125 | var y = s.length; 1126 | for (var z = 0; z < 8; z++) { 1127 | w[z] ^= s[x + z] 1128 | } 1129 | w = k(w); 1130 | x += 8; 1131 | a = 0; 1132 | return true 1133 | } 1134 | function n(C, B) { 1135 | var A = [ 1136 | ]; 1137 | if (B) { 1138 | for (var z = 0; z < C.length; z++) { 1139 | A[z] = C.charCodeAt(z) & 255 1140 | } 1141 | } else { 1142 | var y = 0; 1143 | for (var z = 0; z < C.length; z += 2) { 1144 | A[y++] = parseInt(C.substr(z, 2), 16) 1145 | } 1146 | } 1147 | return A 1148 | } 1149 | q.TEA = { 1150 | encrypt: function (B, A) { 1151 | var z = n(B, A); 1152 | var y = h(z); 1153 | return v(y) 1154 | }, 1155 | enAsBase64: function (D, C) { 1156 | var B = n(D, C); 1157 | var A = h(B); 1158 | var y = ''; 1159 | for (var z = 0; z < A.length; z++) { 1160 | y += String.fromCharCode(A[z]) 1161 | } 1162 | return d.encode(y) 1163 | }, 1164 | decrypt: function (A) { 1165 | var z = n(A, false); 1166 | var y = p(z); 1167 | return v(y) 1168 | }, 1169 | initkey: function (y, z) { 1170 | r = n(y, z) 1171 | }, 1172 | bytesToStr: u, 1173 | strToBytes: c, 1174 | bytesInStr: v, 1175 | dataFromStr: n 1176 | }; 1177 | var d = { 1178 | }; 1179 | d.PADCHAR = '='; 1180 | d.ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 1181 | d.getbyte = function (A, z) { 1182 | var y = A.charCodeAt(z); 1183 | if (y > 255) { 1184 | throw 'INVALID_CHARACTER_ERR: DOM Exception 5' 1185 | } 1186 | return y 1187 | }; 1188 | d.encode = function (C) { 1189 | if (arguments.length != 1) { 1190 | throw 'SyntaxError: Not enough arguments' 1191 | } 1192 | var z = d.PADCHAR; 1193 | var E = d.ALPHA; 1194 | var D = d.getbyte; 1195 | var B, 1196 | F; 1197 | var y = [ 1198 | ]; 1199 | C = '' + C; 1200 | var A = C.length - C.length % 3; 1201 | if (C.length == 0) { 1202 | return C 1203 | } 1204 | for (B = 0; B < A; B += 3) { 1205 | F = (D(C, B) << 16) | (D(C, B + 1) << 8) | D(C, B + 2); 1206 | y.push(E.charAt(F >> 18)); 1207 | y.push(E.charAt((F >> 12) & 63)); 1208 | y.push(E.charAt((F >> 6) & 63)); 1209 | y.push(E.charAt(F & 63)) 1210 | } 1211 | switch (C.length - A) { 1212 | case 1: 1213 | F = D(C, B) << 16; 1214 | y.push(E.charAt(F >> 18) + E.charAt((F >> 12) & 63) + z + z); 1215 | break; 1216 | case 2: 1217 | F = (D(C, B) << 16) | (D(C, B + 1) << 8); 1218 | y.push(E.charAt(F >> 18) + E.charAt((F >> 12) & 63) + E.charAt((F >> 6) & 63) + z); 1219 | break 1220 | } 1221 | return y.join('') 1222 | }; 1223 | 1224 | }) (window); 1225 | 1226 | 1227 | var hexcase = 1; 1228 | var b64pad = ''; 1229 | var chrsz = 8; 1230 | var mode = 32; 1231 | function md5(s) { 1232 | return hex_md5(s) 1233 | } 1234 | function hex_md5(s) { 1235 | return binl2hex(core_md5(str2binl(s), s.length * chrsz)) 1236 | } 1237 | function str_md5(s) { 1238 | return binl2str(core_md5(str2binl(s), s.length * chrsz)) 1239 | } 1240 | function hex_hmac_md5(key, data) { 1241 | return binl2hex(core_hmac_md5(key, data)) 1242 | } 1243 | function b64_hmac_md5(key, data) { 1244 | return binl2b64(core_hmac_md5(key, data)) 1245 | } 1246 | function str_hmac_md5(key, data) { 1247 | return binl2str(core_hmac_md5(key, data)) 1248 | } 1249 | function core_md5(x, len) { 1250 | x[len >> 5] |= 128 << ((len) % 32); 1251 | x[(((len + 64) >>> 9) << 4) + 14] = len; 1252 | var a = 1732584193; 1253 | var b = - 271733879; 1254 | var c = - 1732584194; 1255 | var d = 271733878; 1256 | for (var i = 0; i < x.length; i += 16) { 1257 | var olda = a; 1258 | var oldb = b; 1259 | var oldc = c; 1260 | var oldd = d; 1261 | a = md5_ff(a, b, c, d, x[i + 0], 7, - 680876936); 1262 | d = md5_ff(d, a, b, c, x[i + 1], 12, - 389564586); 1263 | c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); 1264 | b = md5_ff(b, c, d, a, x[i + 3], 22, - 1044525330); 1265 | a = md5_ff(a, b, c, d, x[i + 4], 7, - 176418897); 1266 | d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); 1267 | c = md5_ff(c, d, a, b, x[i + 6], 17, - 1473231341); 1268 | b = md5_ff(b, c, d, a, x[i + 7], 22, - 45705983); 1269 | a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); 1270 | d = md5_ff(d, a, b, c, x[i + 9], 12, - 1958414417); 1271 | c = md5_ff(c, d, a, b, x[i + 10], 17, - 42063); 1272 | b = md5_ff(b, c, d, a, x[i + 11], 22, - 1990404162); 1273 | a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); 1274 | d = md5_ff(d, a, b, c, x[i + 13], 12, - 40341101); 1275 | c = md5_ff(c, d, a, b, x[i + 14], 17, - 1502002290); 1276 | b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); 1277 | a = md5_gg(a, b, c, d, x[i + 1], 5, - 165796510); 1278 | d = md5_gg(d, a, b, c, x[i + 6], 9, - 1069501632); 1279 | c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); 1280 | b = md5_gg(b, c, d, a, x[i + 0], 20, - 373897302); 1281 | a = md5_gg(a, b, c, d, x[i + 5], 5, - 701558691); 1282 | d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); 1283 | c = md5_gg(c, d, a, b, x[i + 15], 14, - 660478335); 1284 | b = md5_gg(b, c, d, a, x[i + 4], 20, - 405537848); 1285 | a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); 1286 | d = md5_gg(d, a, b, c, x[i + 14], 9, - 1019803690); 1287 | c = md5_gg(c, d, a, b, x[i + 3], 14, - 187363961); 1288 | b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); 1289 | a = md5_gg(a, b, c, d, x[i + 13], 5, - 1444681467); 1290 | d = md5_gg(d, a, b, c, x[i + 2], 9, - 51403784); 1291 | c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); 1292 | b = md5_gg(b, c, d, a, x[i + 12], 20, - 1926607734); 1293 | a = md5_hh(a, b, c, d, x[i + 5], 4, - 378558); 1294 | d = md5_hh(d, a, b, c, x[i + 8], 11, - 2022574463); 1295 | c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); 1296 | b = md5_hh(b, c, d, a, x[i + 14], 23, - 35309556); 1297 | a = md5_hh(a, b, c, d, x[i + 1], 4, - 1530992060); 1298 | d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); 1299 | c = md5_hh(c, d, a, b, x[i + 7], 16, - 155497632); 1300 | b = md5_hh(b, c, d, a, x[i + 10], 23, - 1094730640); 1301 | a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); 1302 | d = md5_hh(d, a, b, c, x[i + 0], 11, - 358537222); 1303 | c = md5_hh(c, d, a, b, x[i + 3], 16, - 722521979); 1304 | b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); 1305 | a = md5_hh(a, b, c, d, x[i + 9], 4, - 640364487); 1306 | d = md5_hh(d, a, b, c, x[i + 12], 11, - 421815835); 1307 | c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); 1308 | b = md5_hh(b, c, d, a, x[i + 2], 23, - 995338651); 1309 | a = md5_ii(a, b, c, d, x[i + 0], 6, - 198630844); 1310 | d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); 1311 | c = md5_ii(c, d, a, b, x[i + 14], 15, - 1416354905); 1312 | b = md5_ii(b, c, d, a, x[i + 5], 21, - 57434055); 1313 | a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); 1314 | d = md5_ii(d, a, b, c, x[i + 3], 10, - 1894986606); 1315 | c = md5_ii(c, d, a, b, x[i + 10], 15, - 1051523); 1316 | b = md5_ii(b, c, d, a, x[i + 1], 21, - 2054922799); 1317 | a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); 1318 | d = md5_ii(d, a, b, c, x[i + 15], 10, - 30611744); 1319 | c = md5_ii(c, d, a, b, x[i + 6], 15, - 1560198380); 1320 | b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); 1321 | a = md5_ii(a, b, c, d, x[i + 4], 6, - 145523070); 1322 | d = md5_ii(d, a, b, c, x[i + 11], 10, - 1120210379); 1323 | c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); 1324 | b = md5_ii(b, c, d, a, x[i + 9], 21, - 343485551); 1325 | a = safe_add(a, olda); 1326 | b = safe_add(b, oldb); 1327 | c = safe_add(c, oldc); 1328 | d = safe_add(d, oldd) 1329 | } 1330 | if (mode == 16) { 1331 | return Array(b, c) 1332 | } else { 1333 | return Array(a, b, c, d) 1334 | } 1335 | } 1336 | function md5_cmn(q, a, b, x, s, t) { 1337 | return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b) 1338 | } 1339 | function md5_ff(a, b, c, d, x, s, t) { 1340 | return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t) 1341 | } 1342 | function md5_gg(a, b, c, d, x, s, t) { 1343 | return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t) 1344 | } 1345 | function md5_hh(a, b, c, d, x, s, t) { 1346 | return md5_cmn(b ^ c ^ d, a, b, x, s, t) 1347 | } 1348 | function md5_ii(a, b, c, d, x, s, t) { 1349 | return md5_cmn(c ^ (b | (~d)), a, b, x, s, t) 1350 | } 1351 | function core_hmac_md5(key, data) { 1352 | var bkey = str2binl(key); 1353 | if (bkey.length > 16) { 1354 | bkey = core_md5(bkey, key.length * chrsz) 1355 | } 1356 | var ipad = Array(16), 1357 | opad = Array(16); 1358 | for (var i = 0; i < 16; i++) { 1359 | ipad[i] = bkey[i] ^ 909522486; 1360 | opad[i] = bkey[i] ^ 1549556828 1361 | } 1362 | var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); 1363 | return core_md5(opad.concat(hash), 512 + 128) 1364 | } 1365 | function safe_add(x, y) { 1366 | var lsw = (x & 65535) + (y & 65535); 1367 | var msw = (x >> 16) + (y >> 16) + (lsw >> 16); 1368 | return (msw << 16) | (lsw & 65535) 1369 | } 1370 | function bit_rol(num, cnt) { 1371 | return (num << cnt) | (num >>> (32 - cnt)) 1372 | } 1373 | function str2binl(str) { 1374 | var bin = Array(); 1375 | var mask = (1 << chrsz) - 1; 1376 | for (var i = 0; i < str.length * chrsz; i += chrsz) { 1377 | bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32) 1378 | } 1379 | return bin 1380 | } 1381 | function binl2str(bin) { 1382 | var str = ''; 1383 | var mask = (1 << chrsz) - 1; 1384 | for (var i = 0; i < bin.length * 32; i += chrsz) { 1385 | str += String.fromCharCode((bin[i >> 5] >>> (i % 32)) & mask) 1386 | } 1387 | return str 1388 | } 1389 | function binl2hex(binarray) { 1390 | var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef'; 1391 | var str = ''; 1392 | for (var i = 0; i < binarray.length * 4; i++) { 1393 | str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 15) + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 15) 1394 | } 1395 | return str 1396 | } 1397 | function binl2b64(binarray) { 1398 | var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 1399 | var str = ''; 1400 | for (var i = 0; i < binarray.length * 4; i += 3) { 1401 | var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 255) << 16) | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 255) << 8) | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 255); 1402 | for (var j = 0; j < 4; j++) { 1403 | if (i * 8 + j * 6 > binarray.length * 32) { 1404 | str += b64pad 1405 | } else { 1406 | str += tab.charAt((triplet >> 6 * (3 - j)) & 63) 1407 | } 1408 | } 1409 | } 1410 | return str 1411 | } 1412 | function hexchar2bin(str) { 1413 | var arr = [ 1414 | ]; 1415 | for (var i = 0; i < str.length; i = i + 2) { 1416 | arr.push('\\x' + str.substr(i, 2)) 1417 | } 1418 | arr = arr.join(''); 1419 | eval('var temp = \'' + arr + '\''); 1420 | return temp 1421 | } 1422 | function __monitor(mid, probability) { 1423 | if (Math.random() > (probability || 1)) { 1424 | return 1425 | } 1426 | 1427 | } 1428 | function getEncryption(password, salt, vcode) { 1429 | vcode = vcode || ''; 1430 | salt = uin2hex(salt); 1431 | password = password || ''; 1432 | var md5Pwd = md5(password), 1433 | h1 = hexchar2bin(md5Pwd), 1434 | s2 = md5(h1 + salt), 1435 | rsaH1 = $.RSA.rsa_encrypt(h1), 1436 | rsaH1Len = (rsaH1.length / 2).toString(16), 1437 | hexVcode = q.TEA.strToBytes(vcode.toUpperCase()), 1438 | vcodeLen = '000' + vcode.length.toString(16); 1439 | while (rsaH1Len.length < 4) { 1440 | rsaH1Len = '0' + rsaH1Len 1441 | } 1442 | q.TEA.initkey(s2); 1443 | var saltPwd = q.TEA.enAsBase64(rsaH1Len + rsaH1 + q.TEA.strToBytes(salt) + vcodeLen + hexVcode); 1444 | q.TEA.initkey(''); 1445 | __monitor(488358, 1); 1446 | return saltPwd.replace(/[\/\+=]/g, function (a) { 1447 | return { 1448 | '/': '-', 1449 | '+': '*', 1450 | '=': '_' 1451 | } 1452 | [ 1453 | a 1454 | ] 1455 | }) 1456 | } 1457 | function getRSAEncryption(password, vcode, isMd5) { 1458 | var str1 = isMd5 ? password : md5(password); 1459 | var str2 = str1 + vcode.toUpperCase(); 1460 | var str3 = $.RSA.rsa_encrypt(str2); 1461 | return str3 1462 | } 1463 | 1464 | function uin2hex(str) { 1465 | var maxLength = 16; 1466 | var hex = parseInt(str).toString(16); 1467 | var len = hex.length; 1468 | for (var i = len; i < maxLength; i++) { 1469 | hex = '0' + hex 1470 | } 1471 | var arr = [ 1472 | ]; 1473 | for (var j = 0; j < maxLength; j += 2) { 1474 | arr.push('\\x' + hex.substr(j, 2)) 1475 | } 1476 | var result = arr.join(''); 1477 | eval('result="' + result + '"'); 1478 | return result 1479 | } -------------------------------------------------------------------------------- /src/main/resources/num.properties: -------------------------------------------------------------------------------- 1 | #QQ\u8d26\u53f7\u548c\u5bc6\u7801 \u5199\u5165\u5230\u8fd9\u4e2a\u6587\u4ef6\u4e2d 2 | -------------------------------------------------------------------------------- /src/test/java/qzone_enter/GetMsgBord.java: -------------------------------------------------------------------------------- 1 | package qzone_enter; 2 | 3 | import java.io.IOException; 4 | 5 | import org.bianqi.enter.key.KeyWord; 6 | import org.bianqi.getdata.GetMsgBoard; 7 | import org.junit.Test; 8 | 9 | public class GetMsgBord { 10 | @Test 11 | public void test() throws IOException{ 12 | GetMsgBoard.getMsg(KeyWord.friendQQ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/test/java/qzone_enter/GetMyShuoShuo.java: -------------------------------------------------------------------------------- 1 | package qzone_enter; 2 | 3 | import java.io.IOException; 4 | import java.util.List; 5 | 6 | import org.bianqi.enter.bean.QQBean; 7 | import org.bianqi.enter.key.GetQQByProperties; 8 | import org.bianqi.enter.key.KeyWord; 9 | import org.bianqi.enter.login.InputNameAndPwd; 10 | import org.bianqi.getdata.GetShuoShuoData; 11 | 12 | public class GetMyShuoShuo { 13 | 14 | public static List listQQ = null; 15 | public static int k = 0; 16 | 17 | static { 18 | try { 19 | listQQ = GetQQByProperties.getQQNumAndPwd(); 20 | } catch (IOException e) { 21 | e.printStackTrace(); 22 | } 23 | } 24 | 25 | public static void getShuoshuoDemo(long i, long j) throws Exception { 26 | try { 27 | for (; i <= j; i++) { 28 | if (i % 25 == 0) { 29 | if (k == listQQ.size()) { 30 | k = 0; 31 | } 32 | KeyWord.uin = listQQ.get(k).getNum(); 33 | KeyWord.password = listQQ.get(k).getPwd(); 34 | System.out.println("切换到"+KeyWord.uin+"登录"); 35 | InputNameAndPwd.login(); 36 | k++; 37 | } 38 | GetShuoShuoData.getShuoData(Long.toString(i)); 39 | System.out.println(KeyWord.uin+"正在采集==============QQ用户" + i + "数据======================="); 40 | } 41 | } catch (Exception e) { 42 | e.printStackTrace(); 43 | GetMyShuoShuo.getShuoshuo(i, j); 44 | } 45 | } 46 | 47 | public static void getShuoshuo(long i, long j) throws Exception { 48 | try { 49 | for (; i <= j; i++) { 50 | if (i % 25 == 0) { 51 | if (k == listQQ.size()) { 52 | k = 0; 53 | } 54 | KeyWord.uin = listQQ.get(k).getNum(); 55 | KeyWord.password = listQQ.get(k).getPwd(); 56 | System.out.println("切换到"+KeyWord.uin+"登录"); 57 | InputNameAndPwd.login(); 58 | k++; 59 | } 60 | GetShuoShuoData.getShuoData(Long.toString(i)); 61 | System.out.println(KeyWord.uin+"正在采集==============QQ用户" + i + "数据======================="); 62 | } 63 | } catch (Exception e) { 64 | e.printStackTrace(); 65 | GetMyShuoShuo.getShuoshuoDemo(i, j); 66 | } 67 | } 68 | 69 | public static void main(String[] args) throws Exception { 70 | // 开始QQ号 结束QQ号 71 | long i = 193295; 72 | long j = 448102; 73 | getShuoshuo(i, j); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/test/java/qzone_enter/GetQNumTest.java: -------------------------------------------------------------------------------- 1 | package qzone_enter; 2 | 3 | import java.io.IOException; 4 | 5 | import org.bianqi.getdata.GetQNum; 6 | import org.junit.Test; 7 | 8 | public class GetQNumTest { 9 | @Test 10 | public void test() throws IOException{ 11 | GetQNum.getQQNum(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/test/java/qzone_enter/GetQQTest.java: -------------------------------------------------------------------------------- 1 | package qzone_enter; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | import java.util.List; 6 | import java.util.Map.Entry; 7 | import java.util.Properties; 8 | import java.util.Set; 9 | 10 | import org.bianqi.enter.bean.QQBean; 11 | import org.bianqi.enter.key.GetQQByProperties; 12 | import org.junit.Test; 13 | 14 | public class GetQQTest { 15 | 16 | @Test 17 | public void firstTest() throws IOException { 18 | Properties properties = new Properties(); 19 | InputStream resourceAsStream = GetQQTest.class.getClassLoader().getResourceAsStream("num.properties"); 20 | properties.load(resourceAsStream); 21 | Set> entrySet = properties.entrySet(); 22 | for (Entry entry : entrySet) { 23 | String username = (String) entry.getKey(); 24 | String password = (String) entry.getValue(); 25 | System.out.println(username + password); 26 | } 27 | } 28 | 29 | @Test 30 | public void testGetQQbyProperties() throws IOException{ 31 | List qqNumAndPwd = GetQQByProperties.getQQNumAndPwd(); 32 | for (QQBean qqBean : qqNumAndPwd) { 33 | System.out.println(qqBean.getNum()); 34 | System.out.println(qqBean.getPwd()); 35 | } 36 | System.out.println(qqNumAndPwd.get(6)); 37 | System.out.println(qqNumAndPwd.size()); 38 | } 39 | } 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/test/java/qzone_enter/LoginTest.java: -------------------------------------------------------------------------------- 1 | package qzone_enter; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.File; 5 | import java.io.FileOutputStream; 6 | import java.io.FileReader; 7 | import java.io.IOException; 8 | import java.util.Map; 9 | import java.util.Map.Entry; 10 | import java.util.Scanner; 11 | import java.util.Set; 12 | 13 | import org.bianqi.enter.code.VerifyCode; 14 | import org.bianqi.enter.encrypt.QzoneEncrypt; 15 | import org.bianqi.enter.login.Login; 16 | import org.bianqi.enter.sig.SigInterface; 17 | import org.jsoup.Connection; 18 | import org.jsoup.Connection.Response; 19 | import org.jsoup.Jsoup; 20 | import org.junit.Test; 21 | 22 | public class LoginTest { 23 | 24 | @Test 25 | public void login() throws IOException { 26 | //账号 27 | String uin = "1162223173"; 28 | //密码 29 | String password = ""; 30 | String checkStatus = ""; // login接口参数pt_vcode_v1,对应check接口的0,1状态 31 | String verifycode = ""; // login接口参数 32 | String verifysession = ""; // login接口参数 33 | String p = ""; // login接口参数 34 | // 检验登录接口 是否需要 验证码 35 | String checkResult = VerifyCode.check(uin); 36 | // System.out.println(checkResult); 37 | if ("0".equals(checkResult.charAt(14) + "")) { 38 | checkStatus = "0"; 39 | verifycode = checkResult.split(",")[1].replaceAll("\'", ""); 40 | verifysession = checkResult.split(",")[3].replaceAll("\'", ""); 41 | }else{ 42 | System.out.println("需要输入验证码登录!。"); 43 | checkStatus = "1"; 44 | String cap_cd = checkResult.split(",")[1].replaceAll("'", ""); 45 | String sig = SigInterface.getSig(uin, cap_cd); 46 | //获取并输入验证码 47 | VerifyCode.getVerifyCode(uin, sig); 48 | System.out.println("请输入验证码:"); 49 | Scanner scanf = new Scanner(System.in); 50 | String vcode = scanf.next(); //输入验证码 51 | scanf.close(); 52 | String body = VerifyCode.getVerifysession(uin, vcode, sig); 53 | verifysession = body.split(",")[2].replaceAll("sig:\"", "").replaceAll("\"", ""); 54 | verifycode = body.split(",")[1].replaceAll("randstr:\"", "").replaceAll("\"", ""); 55 | while(!body.contains("rcode:0")) { 56 | sig = SigInterface.refreshSig(uin, sig); 57 | VerifyCode.getVerifyCode(uin, sig); 58 | System.out.println("error,请重新输入验证码:"); 59 | vcode = scanf.next(); 60 | body = VerifyCode.getVerifysession(uin, vcode, sig); 61 | verifysession = body.split(",")[2].replaceAll("sig:\"", "").replaceAll("\"", ""); 62 | verifycode = body.split(",")[1].replaceAll("randstr:\"", "").replaceAll("\"", ""); 63 | } 64 | } 65 | p =QzoneEncrypt.encryptPassword(uin, password, verifycode); 66 | 67 | //===========================首次登陆获取相应的cookie================= 68 | String login = Login.login(uin, p, checkStatus, verifycode, verifysession); 69 | Map cookies = Login.cookies; 70 | String skeyString = cookies.get("skey"); 71 | String ptcz = cookies.get("ptcz"); 72 | String ptsigx = login.substring(111, 239); 73 | // System.out.println(login.substring(111, 239)); 74 | //===========================================获取p_skey===================================== 75 | Connection check_sig = Jsoup.connect("https://ptlogin2.qzone.qq.com/check_sig?" 76 | + "pttype=1" 77 | + "&uin=1162223173" 78 | + "&service=login" 79 | + "&nodirect=0" 80 | + "&ptsigx="+ptsigx 81 | + "&s_url=https%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone%26from%3Diqq" 82 | + "&f_url=&ptlang=2052" 83 | + "&ptredirect=100" 84 | + "&aid=549000912" 85 | + "&daid=5" 86 | + "&j_later=0" 87 | + "&low_login_hour=0" 88 | + "®master=0" 89 | + "&pt_login_type=1" 90 | + "&pt_aid=0" 91 | + "&pt_aaid=0" 92 | + "&pt_light=0" 93 | + "&pt_3rd_aid=0"); 94 | check_sig.header("Accept", "image/webp,image/*,*/*;q=0.8"); 95 | check_sig.header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 96 | check_sig.header("Connection", "keep-alive"); 97 | check_sig.header("cookie", "pgv_pvi=746982400; " 98 | + "RK=vucf0uGrQV; " 99 | + "__Q_w_s__QZN_TodoMsgCnt=1;" 100 | + " __Q_w_s_hat_seed=1; " 101 | + "pac_uid=1_1162223173; " 102 | + "pgv_pvid=7070951083; "//746982400 103 | + "o_cookie=1162223173; " 104 | + "randomSeed=457757;" 105 | + " cpu_performance_v8=3;" 106 | + " Loading=Yes; " 107 | + "QZ_FE_WEBP_SUPPORT=1;" 108 | + " _qz_referrer=i.qq.com;" 109 | + " _qpsvr_localtk=0.9215949376165553;" 110 | + " pgv_si=s9635414016;" 111 | + " pgv_info=ssid=s2050395600; " 112 | + "ptui_loginuin=1162223173;" 113 | + " pt2gguin=o1162223173; " 114 | + "uin=o1162223173; " 115 | + "skey="+skeyString+"; " 116 | + "ptisp=cm; " 117 | + "ptcz="+ptcz+""); 118 | check_sig.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 119 | Response execute2 = check_sig.execute(); 120 | Map cookies2 = execute2.cookies(); 121 | String p_skey = cookies2.get("p_skey"); 122 | String pt4_token = cookies2.get("pt4_token"); 123 | String skey = cookies2.get("skey"); 124 | //==========================Qzone模拟登陆========================================// 125 | Connection connect = Jsoup.connect("https://user.qzone.qq.com/1162223173"); 126 | connect.header("Accept", "image/webp,image/*,*/*;q=0.8"); 127 | connect.header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 128 | connect.header("Connection", "keep-alive"); 129 | 130 | 131 | connect.header("cookie","pgv_pvi=746982400; " 132 | + "RK=vucf0uGrQV; " 133 | + "__Q_w_s__QZN_TodoMsgCnt=1;" 134 | + " __Q_w_s_hat_seed=1;" 135 | + " pac_uid=1_1162223173;" 136 | + " randomSeed=457757;" 137 | + " _qpsvr_localtk=0.9215949376165553; " 138 | + "pgv_si=s9635414016; " 139 | + "pgv_info=ssid=s2050395600;" 140 | + " pgv_pvid=7070951083; " 141 | + "o_cookie=1162223173;" 142 | + " zzpaneluin=; " 143 | + "zzpanelkey=; " 144 | + "ptui_loginuin=1162223173;" 145 | + " ptisp=cm; " 146 | + "ptcz="+ptcz+";" 147 | + " pt2gguin=o1162223173;" 148 | + " uin=o1162223173;" 149 | + " skey="+skeyString+"; " 150 | + "p_uin=o1162223173; " 151 | + "p_skey="+p_skey+";" 152 | + " pt4_token="+pt4_token+"; " 153 | + "Loading=Yes; " 154 | + "qzspeedup=sdch;" 155 | + " qz_screen=1366x768; " 156 | + "1162223173_todaycount=5; " 157 | + "1162223173_totalcount=12422;" 158 | + " QZ_FE_WEBP_SUPPORT=1;" 159 | + " cpu_performance_v8=1"); 160 | connect.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 161 | Response execute = connect.execute(); 162 | String body1 = execute.body(); 163 | byte[] bytes = body1.getBytes(); 164 | FileOutputStream fileOutputStream = new FileOutputStream("data.txt"); 165 | fileOutputStream.write(bytes); 166 | fileOutputStream.close(); 167 | FileReader fr = new FileReader(new File("data.txt")); 168 | BufferedReader br = new BufferedReader(fr); 169 | String result = ""; 170 | String line = br.readLine(); 171 | while (line != null) { 172 | if (line.contains("g_qzonetoken")) { 173 | result = line; 174 | break; 175 | } else { 176 | line = br.readLine(); 177 | } 178 | } 179 | br.close(); 180 | String qzonetoken = result.substring(47, 131); 181 | //======================================获取说说JSON数据================================= 182 | Connection connect2 = Jsoup.connect("https://h5.qzone.qq.com/proxy/domain/" 183 | + "taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?" 184 | + "uin=379373299&" 185 | + "ftype=0&sort=0&" 186 | + "pos=0&num=20&" 187 | + "replynum=100&" 188 | + "g_tk="+QzoneEncrypt.encryptg_k(p_skey)+"&" 189 | + "callback=_preloadCallback&" 190 | + "code_version=1&" 191 | + "format=jsonp&" 192 | + "need_private_comment=1&" 193 | + "qzonetoken="+qzonetoken); 194 | connect2.cookie("cookie", "pgv_si=s9635414016;" 195 | + " _qpsvr_localtk=0.9215949376165553; " 196 | + "pgv_pvid=7070951083;" 197 | + " pgv_info=ssid=s2050395600; " 198 | + "ptui_loginuin=1162223173;" 199 | + " ptisp=cm;" 200 | + " RK=vucf0uGrQV; " 201 | + "ptcz="+ptcz+"; " 202 | + "pt2gguin=o1162223173; " 203 | + "uin=o1162223173; " 204 | + "skey="+skey+";" 205 | + " p_uin=o1162223173;" 206 | + " p_skey="+p_skey+"; " 207 | + "pt4_token="+pt4_token+";" 208 | + " QZ_FE_WEBP_SUPPORT=1; " 209 | + "cpu_performance_v8=0;" 210 | + " __Q_w_s__QZN_TodoMsgCnt=1"); 211 | connect2.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 212 | connect2.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 213 | connect2.header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 214 | connect2.header("Connection", "keep-alive"); 215 | connect2.header("referer", "https://user.qzone.qq.com/1162223173"); 216 | Response execute3 = connect2.execute(); 217 | String body2 = execute3.body(); 218 | System.out.println(body2); 219 | //======================================获取留言板JSON数据================================= 220 | Connection connect4 = Jsoup.connect("https://h5.qzone.qq.com/proxy/domain/m.qzone.qq.com/" 221 | + "cgi-bin/new/get_msgb?" 222 | + "uin=1162223173&" 223 | + "hostUin=571311673&" 224 | + "start=0&" 225 | + "s=0.8193196364506001" 226 | + "&format=jsonp&" 227 | + "num=10&" 228 | + "inCharset=utf-8&" 229 | + "outCharset=utf-8&" 230 | + "g_tk="+QzoneEncrypt.encryptg_k(p_skey)+"&" 231 | + "qzonetoken="+qzonetoken); 232 | connect4.cookie("cookie", "pgv_si=s9635414016;" 233 | + " _qpsvr_localtk=0.9215949376165553; " 234 | + "pgv_pvid=7070951083;" 235 | + " pgv_info=ssid=s2050395600; " 236 | + "ptui_loginuin=1162223173;" 237 | + " ptisp=cm;" 238 | + " RK=vucf0uGrQV; " 239 | + "ptcz="+ptcz+"; " 240 | + "pt2gguin=o1162223173; " 241 | + "uin=o1162223173; " 242 | + "skey="+skey+";" 243 | + " p_uin=o1162223173;" 244 | + " p_skey="+p_skey+"; " 245 | + "pt4_token="+pt4_token+";" 246 | + " QZ_FE_WEBP_SUPPORT=1;" 247 | + "cpu_performance_v8=0;" 248 | + " __Q_w_s__QZN_TodoMsgCnt=1"); 249 | connect4.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 250 | connect4.header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 251 | connect4.header("Connection", "keep-alive"); 252 | connect4.ignoreContentType(true); 253 | Response execute5 = connect4.execute(); 254 | String body3 = execute5.body(); 255 | System.out.println(body3); 256 | } 257 | } 258 | -------------------------------------------------------------------------------- /src/test/java/qzone_enter/NoInputLogin.java: -------------------------------------------------------------------------------- 1 | package qzone_enter; 2 | 3 | import java.io.FileOutputStream; 4 | import java.io.IOException; 5 | 6 | import org.jsoup.Connection; 7 | import org.jsoup.Jsoup; 8 | import org.jsoup.Connection.Response; 9 | import org.junit.Test; 10 | 11 | public class NoInputLogin { 12 | 13 | @Test 14 | public void test() throws IOException{ 15 | Connection connect = Jsoup.connect("https://user.qzone.qq.com/1162223173"); 16 | connect.header("Accept", "image/webp,image/*,*/*;q=0.8"); 17 | connect.header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 18 | connect.header("Connection", "keep-alive"); 19 | /** 20 | * pac_uid 必须的有 21 | * o_cookie 必须的有 22 | * randomSeed 是随机都可以的 23 | * _qpsvr_localtk 是随便给的 24 | * pgv_si 随便给的 25 | * pgv_info 随便 26 | * ptui_loginuin 随便 27 | * ptcz 随便给 =================上一次拿到 28 | * pt2gguin 必须不变 29 | * p_uin 不变 30 | * skey =========================上一次拿到 31 | * p_skey =======================关键是他 32 | * pt4_token 随便的 33 | */ 34 | connect.header("cookie","pgv_pvi=746982400; " 35 | + "RK=vucf0uGrQV;" 36 | + " __Q_w_s__QZN_TodoMsgCnt=1;" 37 | + " __Q_w_s_hat_seed=1; " 38 | + "pac_uid=1_1162223173;" 39 | + " randomSeed=457757;" 40 | + " _qpsvr_localtk=0.9215949376165553;" 41 | + " pgv_si=s9635414016;" 42 | + " pgv_info=ssid=s2050395600;" 43 | + " pgv_pvid=7070951083; " 44 | + "o_cookie=1162223173; " 45 | + "zzpaneluin=; " 46 | + "zzpanelkey=;" 47 | + " ptui_loginuin=1162223173;" 48 | + " ptisp=cm; " 49 | + "ptcz=c796210964ead3b4c1002579d0fbcb09d712193c41cec43ef5f0e921078ba483;" 50 | + " pt2gguin=o1162223173;" 51 | + " uin=o1162223173;" 52 | + " skey=@iLEaa3SCx; " 53 | + "p_uin=o1162223173;" 54 | + " p_skey=DWT6w*neLCFeAGIEG0P4KKHx-*G9PWwAbLx9yXwGENw_;" 55 | + " pt4_token=hlTfC-PtiWXUqcGouqlMp0wD-jLfTJVAKiUKw01Z3xA_;" 56 | + " Loading=Yes; " 57 | + "qzspeedup=sdch; " 58 | + "qz_screen=1366x768; " 59 | + "1162223173_todaycount=5; " 60 | + "1162223173_totalcount=12422;" 61 | + " QZ_FE_WEBP_SUPPORT=1;" 62 | + " cpu_performance_v8=1"); 63 | connect.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 64 | // connect.cookies(cookies); 65 | Response execute = connect.execute(); 66 | // String body = execute.body(); 67 | String charset = execute.charset(); 68 | System.out.println(charset); 69 | String body1 = execute.body(); 70 | System.out.println(body1); 71 | byte[] bytes = body1.getBytes(); 72 | FileOutputStream fileOutputStream = new FileOutputStream("data.txt"); 73 | fileOutputStream.write(bytes); 74 | fileOutputStream.close(); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/test/java/qzone_enter/TestEntryptg_k.java: -------------------------------------------------------------------------------- 1 | package qzone_enter; 2 | 3 | import org.bianqi.enter.encrypt.QzoneEncrypt; 4 | import org.junit.Test; 5 | 6 | public class TestEntryptg_k { 7 | 8 | @Test 9 | public void test(){ 10 | String encryptg_k = QzoneEncrypt.encryptg_k("TJhsNbsfQvvfjzGH6-r5VmeNd9WGVd29-EKmAncrXDY_"); 11 | System.out.println(encryptg_k); 12 | } 13 | } 14 | --------------------------------------------------------------------------------