转 使用Java实现登陆WebQQ(带源码)

使用Java中的URL 和 HttpURLConnection 就可以实现模拟网页登陆!
分析登陆的协议,可以使用HttpWatcher,蛮好用的! 
目前就两种网页请求方式 
Get和Post 
我们可以自己先写好这两个方法,以便之后调用 
这个就是Get请求方式了,参数就是URL地址 

Java代码   收藏代码
  1. public static String get(String url) {  
  2.   
  3.     System.out.println("get>>>" + url);  
  4.     URL serverUrl;  
  5.     HttpURLConnection conn;  
  6.     StringBuffer res = new StringBuffer();  
  7.     try {  
  8.         serverUrl = new URL(url);  
  9.         conn = (HttpURLConnection) serverUrl.openConnection();  
  10.         conn.setRequestMethod("GET");// "POST" ,"GET"  
  11.         conn.addRequestProperty("Cookie", cookie);  
  12.         conn.addRequestProperty("Accept-Charset""UTF-8;");// GB2312,  
  13.         conn.addRequestProperty("User-Agent",  
  14.                 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Firefox/3.6.8");  
  15.         conn.connect();  
  16.   
  17.         if (conn.getHeaderFields().get("Set-Cookie") != null) {  
  18.             for (String s : conn.getHeaderFields().get("Set-Cookie")) {  
  19.                 cookie += s;  
  20.             }  
  21.         }  
  22.         InputStream ins = conn.getInputStream();  
  23.   
  24.         String charset = "UTF-8";  
  25.         InputStreamReader inr = new InputStreamReader(ins, charset);  
  26.         BufferedReader bfr = new BufferedReader(inr);  
  27.   
  28.         String line = "";  
  29.   
  30.         do {  
  31.             res.append(line);  
  32.             line = bfr.readLine();  
  33.             // System.out.println(line);  
  34.         } while (line != null);  
  35.   
  36.         System.out.println("Value>>" + res);  
  37.   
  38.     } catch (MalformedURLException e) {  
  39.         // TODO Auto-generated catch block  
  40.         e.printStackTrace();  
  41.     } catch (IOException e) {  
  42.   
  43.     }  
  44.     return res.toString();  
  45. }  


1.登陆前,我们需要判断此次登陆是否需要手动输入验证码。 
地址(GET):http://ptlogin2.qq.com/check?uin=********(QQ号码)&appid=1003903(固定)&r=0.2664082343145449(随机18位  简单的说   0.后面+随机16位数) 

返回值有两种 
第一种: 
ptui_checkVC('1','8a6143167c8ca486696cf01c3ea088d658b913d64b11289b') 
这种情况下,我们需要获得验证码图片并手动输入验证码。 
此时我们可以将图片保存下来,然后使用SWING显示并输入,就可以得到验证码了。 
第二种: 
“ptui_checkVC('0','!OMD'); 
这种情况下,!OMD就是我们需要的验证码了。 

2.第一次登陆 
得到验证码之后就可以进行第一次登陆,为什么是第一次?你试验下就知道了,当你此次登陆成功后,发现登陆的QQ并没有提示掉线或者别处登陆的,这是因为我们还需要后续的第二次登陆。 
http://ptlogin2.qq.com/login?u=*******(QQ号)&p=793E7DF74F8D87021F79A69F0DBF8287(md5(md5(密码)+验证码))&verifycode=!OMD(验证码)&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%2Fweb.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&mibao_css=m_webqq
呵呵~verifycode我们第一步就得到了。QQ号我们也知道。就是参数p啦~ 
就是使用密码和验证码经过加密得到的啦。 
想研究加密过程的同学可以百度下,很多的! 
此段加密算法是在一个js脚本里,我们可以下下来这个脚本,然后直接调用。 

Java代码   收藏代码
  1. public static String mdP(String p, String code){    
  2.         Object t = null ;  
  3.         try {    
  4.             ScriptEngineManager m = new ScriptEngineManager();    
  5.             ScriptEngine se = m.getEngineByName("javascript");    
  6.             se.eval(new FileReader(new File("comm.js")));    
  7.             t = se.eval("md5(md5_3(\""+p+"\")+\""+code.toUpperCase()+"\");");    
  8.             return t.toString();    
  9.         }catch (Exception e) {    
  10.             e.printStackTrace();    
  11.         }     
  12.         return t.toString();    
  13.     }   


第一登陆后,TX会返回Cookie,我们需要保持,在之后的第二次登陆中使用。 

3.第二次登陆 
需要使用Post方法:http://d.web2.qq.com/channel/login2 
POST数据: 
r=%7B%22status%22%3A%22online%22%2C%22ptwebqq%22%3A%22” + ptwebqq + “%22%2C%22passwd_sig%22%3A%22%22%2C%22clientid%22%3A%22” + clientid + “%22%2C%22psessionid%22%3Anull%7D&clientid=” + clientid + “&psessionid=null 
ptwebqq 就是我们在第一次登陆后获得的Cookie里的值,clientid是随机的的值,可以直接使用抓取到的值。 
登陆成功后,会返回数据 
{"retcode":0,"result":{"uin":********(QQ号码),"cip":3071582136,"index":1078,"port":53985,"status":"hidden","vfwebqq":"5ab2ce0743496ffa257aa4119f35e44324171aa08d3e14a4c506b7e392ca80b73e34551cef71a248","psessionid":"8368046764001e636f6e6e7365727665725f7765627171403137322e32372e3138312e3835000062450000079e03620524ef666d0000000a406e4e53734a517a33556d000000285ab2ce0743496ffa257aa4119f35e44324171aa08d3e14a4c506b7e392ca80b73e34551cef71a248"}}

vfwebqq和psessionid在之后和获取好友,群信息,以及发送消息都要使用。 

目前做到发送消息,不过老是返回{"retcode":122,"errmsg":"wrong web client3"} 
Post数据也没有问题,不知道到底是为啥~ 
目前写的类也有点乱,打算使用HttpClient重新写~ 

附上源代码,谁要是解决了发消息的问题 
给我说声啊~

 

你可能感兴趣的:(java,qq,swing,百度,FP)