Android的HttpClient調用,衝突的解決辦法

只適用部分狀況java

題外話node

 

攻關百度自動發貼做推廣失敗,但登陸已拿下。全扔有點浪費。android

 

在登陸的基礎上寫了個百度的自動簽到系統,功能已實現([java,android,nodejs,.net]+nodejs)算法

 

用nodejs是我沒摸清楚百度的RSA加密算法,試了不少都失敗,索性就直接把百度的RSA加密過程提取出來,移到nodejs了(都是JS)。apache

 

成功後又想了想,能夠把.net實現遷移到JAVA,寫個安卓百度簽到的APP的應用,練練手複習安卓。json

 

遷到JAVA的過程很是順利,可是到Android就進了幾個坑。api

.NET 獲取token代碼 ,用微軟給的HttpWebRequest和 Newtonsoft.Json DLLcookie

 1  public string GetToken(CookieContainer cookies) {
 2             string token = "";
 3             DateTime dt = DateTime.Now;
 4             string tt = TimeUtils.ConvertDateTimeInt(dt).ToString() + "000";
 5             //這一步獲取一定失敗,更主要是爲了獲取百度的一些其餘信息。
 6             token = NetHelper.HttpGet("https://passport.baidu.com/v2/api/?getapi&tpl=tb&apiver=v3&tt=" + tt + "&class=login&logintype=dialogLogin", ref cookies);
 7             //這一步會獲取成功。
 8             token = NetHelper.HttpGet("https://passport.baidu.com/v2/api/?getapi&tpl=tb&apiver=v3&tt=" + tt + "&class=login&logintype=dialogLogin", ref cookies);
 9             JObject jo1 = (JObject)JsonConvert.DeserializeObject(token);
10             string tokenstring = jo1["data"]["token"].ToString();
11             return tokenstring;
12         }

封裝的Http APIapp

  public static string HttpGet(string Url, ref CookieContainer cookie)
        {
            string strResult =string.Empty;
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                //request.Referer = "http://www.wangpiao.com/movie/25149/?showulcinfo=1";
                request.Headers.Set("Pragma", "no-cache");
                request.CookieContainer = cookie;
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream streamReceive = response.GetResponseStream();
                Encoding encoding = Encoding.GetEncoding("UTF-8");
                StreamReader streamReader = new StreamReader(streamReceive, encoding);
                strResult = streamReader.ReadToEnd();
                cookie.Add(response.Cookies);
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.ToString()+"出錯");
            }
            return strResult;
        }

 

遷到JAVA引用Apache httpclient4.3.5,和GSON JSON解析包。jsonp

 private static String GetTimeString(){
        Date now = new Date(); 
     return now.getTime()+"";
    }
     public  void GetToken()throws Exception {
         CloseableHttpClient httpclient = HttpClients.custom()
                    .setDefaultCookieStore(cookies)
                    .build();       
           String tt=GetTimeString();
           try {
               
               HttpGet httpget = new HttpGet("https://passport.baidu.com/v2/api/?getapi&tpl=tb&apiver=v3&tt=" + tt + "&class=login&logintype=dialogLogin");
             CloseableHttpResponse response1 = httpclient.execute(httpget);
             try {
                 response1 = httpclient.execute(httpget);
                 ByteArrayInputStream bis = new ByteArrayInputStream(EntityUtils.toByteArray(response1.getEntity()));  
                 String ss=convertStreamToString(bis).replace("/n", "");
                 JsonParser jsonparer = new JsonParser();//初始化解析json格式的對象
                 token = jsonparer.parse(ss).getAsJsonObject().get("data").getAsJsonObject().get("token").getAsString();
             } finally {
                 response1.close();
             }
           }finally {
              httpclient.close();
         }
     } 
public static String convertStreamToString(InputStream is) {   
           BufferedReader reader = new BufferedReader(new InputStreamReader(is));   
                StringBuilder sb = new StringBuilder();   
                String line = null;   
                try {   
                    while ((line = reader.readLine()) != null) {   
                        sb.append(line + "/n");   
                    }   
                } catch (IOException e) {   
                    e.printStackTrace();   
                } finally {   
                    try {   
                        is.close();   
                    } catch (IOException e) {   

                        e.printStackTrace();   
                    }   
                }   
                return sb.toString();   
            }   

OK,JAVA+NODEJS也已實現。

 

就差一步了,JAVA到android不是很容易嘛,結果這一步坑了我兩個小時

 

首先 編譯不過

以後 運行出錯

根本緣由都是由於android自帶了個httpclient的包。和引用的httpclient4.3.5衝突。

詢問得知幾種方法

一:有就讓用anroid的(這不是費話麼,用android的能解決我幹嗎要引,android(版本 19)的自帶的包不支持cookie,開發要用的)

二:有說拿httpclient4.3.5源碼改包名重打包編譯的,折騰

三:有說扒個開源實現的(開源中國已扒),自已實現的一個精簡的request包,自實現cookie,代碼差距太太,幾乎要重寫,也折騰。

四:這是自已無心翻來的,搜了一個回答說4.3.3不衝突,順道看了看http://hc.apache.org/downloads.cgi,衝突不衝突,我還不知道,不過眼前一亮,發現了這個

HttpClient for Android 4.3.5 (GA)

這就是主角了,滿心歡喜的引了,幾翻處理完,OK,編譯過了,執行,仍是報錯

不過這包是直接給的源碼,追下去,找到辦法了,異常堆棧的大概印象。

Args.NotNull:item may not be null

RegisterBuilder.register  Arg.notNull

HttpClientBuilder register("https",sslSocketFactory)

sslSocketFactory 這玩意爲null了。

builder裏有sslSocketFactory 的新建實例操做,追下去,發現不進。

緣由是systemProperties默認的值爲false。

搜systemProperties 發現一個方法會設置該值,調用,這下總算是OK了。

對比下

JAVA調用

CloseableHttpClient httpclient = HttpClients.custom()
                    .setDefaultCookieStore(cookies)
                    .build();       

Android修改成

 CloseableHttpClient httpclient = HttpClients.custom().useSystemProperties()
                    .setDefaultCookieStore(cookies)
                    .build();       

這下一切OK了

對了,Android還要記得設INTERNET權限

android app百度貼吧簽到核心功能已實現。

相關文章
相關標籤/搜索