HttpClient 模擬登錄手機版新浪微博


手機版微博單點登錄的URL為:http://3g.sina.com.cn/prog/wapsite/sso/login.php

 

我們先來看一下這個網頁源代碼:

<html>
 <head></head>
 <body>
  <wml> 
   <card title="手機新浪網-新浪通行證"> 
    <p> 登錄|<a href="register.php?backURL=http%3A%2F%2Fsina.cn&amp;backTitle=%CA%D6%BB%FA%D0%C2%C0%CB%CD%F8&amp;vt=1">注冊</a>|<a href="resetpwd.php?backURL=http%3A%2F%2Fsina.cn&amp;backTitle=%CA%D6%BB%FA%D0%C2%C0%CB%CD%F8&amp;vt=1">忘記密碼</a><br /> 手機號/電子郵箱/會員帳號:<br /><input type="text" name="mobile" size="11" value="" /> <br /> 密碼:(<a href="login.php?backURL=http%3A%2F%2Fsina.cn&amp;backTitle=%CA%D6%BB%FA%D0%C2%C0%CB%CD%F8&amp;vt=1&amp;pt=1">使用明文密碼</a>)<br /> <input type="password" name="password" size="10" value="" /><br /> 記住登錄狀態,需支持並打開手機的cookie功能。<br /> <select name="remember"> <option value="on"></option> <option value="off"></option> </select><br /> 
     <anchor>
      登錄 
      <go href="login_submit.php?rand=1554212401&amp;backURL=http%3A%2F%2Fsina.cn&amp;backTitle=%CA%D6%BB%FA%D0%C2%C0%CB%CD%F8&amp;vt=1" accept-charset="UTF-8" method="post"> 
       <postfield name="mobile" value="$(mobile)" /> 
       <postfield name="password_2199" value="$(password)" /> 
       <postfield name="vk" value="2199_6637_1567626412" /> 
       <postfield name="remember" value="$(remember)" /> 
       <postfield name="backURL" value="http%3A%2F%2Fsina.cn" /> 
       <postfield name="backTitle" value="手機新浪網" /> 
       <postfield name="submit" value="1" /> 
      </go> 
     </anchor> 
   </card> 
  </wml>
 </body>
</html>

我們要做的就是獲取服務器需要的數據,然后用HttpClient模擬瀏覽器提交。

有幾點需要說明一下:

go標簽內的href是我們第二次請求的地址,通過這個地址來獲取cookie。

用戶密碼那個field的name屬性是隨機變化的,需要先獲取它然后提交。

下面是整個源代碼。

思路:先獲取表單的值,然后用POST方法提交。注意添加RequestHeader信息,否則會被服務器拒絕(403)。

/**
     * 獲取手機版微博的cookies
     * @param username
     *             微博用戶名
     * @param password
     *             微博密碼
     * @return    Cookie[]
     */
    public Cookie[] getMCookies(String username, String password){
        Cookie[] cookies = null;
        HttpClient client;
        PostMethod post = null;
        try{
            Document doc = Jsoup.connect("http://3g.sina.com.cn/prog/wapsite/sso/login.php").get();
            Elements elements = doc.getElementsByTag("postfield");
        
            String randUrl = doc.getElementsByTag("go").first().attr("href");        
            String pwName = elements.get(1).attr("name");
            String vkValue = elements.get(2).attr("value");
            String backURL = elements.get(4).attr("value");
            String backTitle = elements.get(5).attr("value");
            
            String url = "http://3g.sina.com.cn/prog/wapsite/sso/"+randUrl;
    
            post = new PostMethod(url);
            
            post.setRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1");
            post.setRequestHeader("Referer", "http://weibo.com/");
            post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            
            post.setParameter("mobile", username);
            post.setParameter(pwName,password);
            post.setParameter("vk", vkValue);
            post.setParameter("remember", "on");
            post.setParameter("backURL", backURL);
            post.setParameter("backTitle", backTitle);
            post.setParameter("submit", "1");            
            
            client = new HttpClient();            
            client.executeMethod(post);
            cookies = client.getState().getCookies();
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            post.abort();
        }
            
        return cookies; 
    }

如果用戶名密碼正確的話,應該就可以獲得cookie了。

接下來如果想要訪問某些網頁只需要帶上cookie就行了。

由於新浪的網頁可能會變化,所以不保證此方法一直能用,不過大體思路應該是不會變的。

 

下一篇介紹如何模擬登錄Web版新浪微博。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM