Android模擬登錄

作者:小邪

鏈接:https://zhuanlan.zhihu.com/p/23017942

來源:知乎

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

搞了幾年的Android開發(fā)落萎,第一次寫博客,這次就先分享一下用Android手機(jī)端如何模擬登陸知乎(首頁

1? 抓包

要想實現(xiàn)模擬登錄翩肌,那需要確定一下模擬登錄的網(wǎng)站的登錄邏輯是怎么樣模暗,并且要確定登錄的協(xié)議以及參數(shù)是什么樣的,因此首先要進(jìn)行對該網(wǎng)站進(jìn)行抓包念祭。目前市場上的抓包工具有很多HttpWacth,wireShake等,今天就不先介紹這些工具怎么用了碍侦,就先使用Chrome的開發(fā)者工具進(jìn)行抓包粱坤。首先用Chrome瀏覽器打開知乎網(wǎng)站(首頁),打開開發(fā)者工具,在更多工具中選擇開發(fā)者工具瓷产,選到Network選項站玄,如圖:


使用自己的知乎賬號,登陸知乎,如下圖:


通過抓包的過程中濒旦,我們可以看到株旷,知乎網(wǎng)點擊登錄后,是通過一個Post請求尔邓,那么單擊一下phone_num晾剖,可以看到,請求的URL梯嗽、Header以及參數(shù)齿尽,如下圖:


現(xiàn)在,URL灯节、Header以及參數(shù)都確定了循头,但是參數(shù)中的_xsrf绵估,我們不知道是什么參數(shù),那么查看一下知乎登陸頁面的源代碼卡骂,我們可以看到這么一行:


同時国裳,查看它的源代碼,我們還可以考慮到這個登錄全跨,可能存在驗證碼躏救,因此我們故意輸錯密碼,看看第二次登陸是否有驗證碼螟蒸,以及報什么錯誤盒使,在程序中好處理,抓包方式同上七嫌,在此就不在贅述少办,這個登陸有時候會有驗證碼,鏈接是:

https://www.zhihu.com/captcha.gif?type=login

現(xiàn)在前期抓包工作完成诵原,那么接下來就是如何實現(xiàn)

2 HttpClient+Jsoup實現(xiàn)

首先我們考慮到知乎的網(wǎng)站是HTTPS的英妓,那么我們要讓HttpClient支持HTTPS請求,我采用的是忽略證書的方式绍赛,具體實現(xiàn)方式蔓纠,大家也都能百度到,如果有不會的吗蚌,那么留言一下腿倚,我會整理一下自己的代碼上傳。

然后用Jsoup爬去知乎的頁面蚯妇,獲取_xsrf的值敷燎,并保存Cookie:

public String getZHPager(String url){try {HttpGet get = new HttpGet(url);HttpResponse response = client.execute(get);LogUtil.v("rescode", response.getStatusLine().getStatusCode()+""); cookie=((AbstractHttpClient)client).getCookieStore().getCookies().get(0).getValue();LogUtil.v("cookie", cookie);String str = EntityUtils.toString(response.getEntity(), "UTF-8");LogUtil.v("rescode", response.getStatusLine().getStatusCode()+"");LogUtil.v("re", str);return str;} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}

public String getHtmlStr(String str){? ? try{Document doc;doc = Jsoup.parse(str);? ? ? ? Elements links = doc.getElementsByTag("input");? ? ? ? for(Element e :links){? if(e.attr("name").toString().equals("_xsrf")){LogUtil.v("_xsrf",e.attr("value").toString());return e.attr("value").toString();? ? ? ? ? ? }? ? ? ? }? ? ? }catch(Exception e){? ? LogUtil.v("_xsrf", e.toString());? ? ? }? return null;}

接下來就是請求,

public String HttpPostData(String username,String password){//long cTime=System.currentTimeMillis();_xsrf = getHtmlStr(getStr(ZhConfig.MainUrl));//Log.v("lt", lt);//client.getParams().setParameter(arg0, arg1)List params = new LinkedList();params.add(new BasicNameValuePair("remember_me","true"));params.add(new BasicNameValuePair("password",password));params.add(new BasicNameValuePair("_eventId","submit"));params.add(new BasicNameValuePair("_xsrf",_xsrf));params.add(new BasicNameValuePair("phone_num",username));HttpPost post = new HttpPost(LoginUrl);try {post.setEntity(new UrlEncodedFormEntity(params, "utf-8"));post.addHeader("Connection", "Keep-Alive");post.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");post.addHeader("Host", "www.zhihu.com");post.addHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");post.addHeader("Referer", "https://www.zhihu.com/");? ? post.getParams().setParameter("http.protocol.allow-circular-redirects", true);//post.addHeader("Cookie","JSESSIONID="+cookie);post.addHeader("Origin", "https://www.zhihu.com");post.getParams().setParameter(? ? "http.protocol.cookie-policy",CookiePolicy.BROWSER_COMPATIBILITY);HttpResponse response = client.execute(post);HttpEntity entity = response.getEntity();InputStream stream = entity.getContent();ByteArrayOutputStream bos=new ByteArrayOutputStream();byte[] buffer=new byte[1024];int len = 0;while((len=stream.read(buffer))!=-1){bos.write(buffer,0,len);}//byte[] dataImage=bos.toByteArray();bos.close();stream.close();//String str = EntityUtils.toString(response.getEntity(), "UTF-8");String str = new String (bos.toByteArray(),"UTF-8");? ? ? ? ? ? ? ? ? ? ? ? Log.v("result",str+"");if(!str.contains("\\u767b\\u5f55\\u6210\\u529f")){return "1";}else{return cookie;}//long tTime=System.currentTimeMillis();//Log.v("TAG", tTime-cTime+"");} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClientProtocolException e) {// TODO Auto- generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "";}

其中“ \\u767b\\u5f55\\u6210\\u529f “這個”登陸成功“ 編碼箩言,寫這篇博客時硬贯,還沒有仔細(xì)看它的編碼是什么,大家可以具體看一下陨收,最后注意的一下就是有驗證碼登陸的時候饭豹,就是請求一下驗證碼圖片(如下),登錄時候添加一個參數(shù)params.add(new BasicNameValuePair("captcha", captcha)); 即可务漩。

public Bitmap getLoginYzm(){HttpGet get = new HttpGet(ZhConfig.YZMUrl);get.addHeader("Connection", "Keep-Alive");get.addHeader("Content-Type", "application/x-www-form-urlencoded");get.addHeader("Host", "www.zhihu.com");get.addHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");get.addHeader("Referer", "https://www.zhihu.com/");HttpResponse res;try {res = client.execute(get);HttpEntity entity = res.getEntity();? ? ? ? InputStream in =entity.getContent();? ? ? ? ? ByteArrayOutputStream bos=new ByteArrayOutputStream();? ? ? ? ? byte[] buffer=new byte[1024];? ? ? ? ? int len = 0;? ? ? ? ? while((len=in.read(buffer))!=-1){? ? ? ? ? ? ? bos.write(buffer,0,len);? ? ? ? ? }? ? ? ? ? byte[] dataImage=bos.toByteArray();? ? ? ? ? bos.close();? ? ? ? ? in.close();? ? ? ? ? Bitmap bitmap =BitmapFactory.decodeByteArray(dataImage, 0, dataImage.length);? ? ? ? return bitmap;} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拄衰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菲饼,更是在濱河造成了極大的恐慌肾砂,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宏悦,死亡現(xiàn)場離奇詭異镐确,居然都是意外死亡包吝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門源葫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诗越,“玉大人,你說我怎么就攤上這事息堂∪履” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵荣堰,是天一觀的道長床未。 經(jīng)常有香客問我,道長振坚,這世上最難降的妖魔是什么薇搁? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮渡八,結(jié)果婚禮上啃洋,老公的妹妹穿的比我還像新娘。我一直安慰自己屎鳍,他們只是感情好宏娄,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逮壁,像睡著了一般孵坚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上貌踏,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天十饥,我揣著相機(jī)與錄音,去河邊找鬼祖乳。 笑死,一個胖子當(dāng)著我的面吹牛秉氧,可吹牛的內(nèi)容都是我干的眷昆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼汁咏,長吁一口氣:“原來是場噩夢啊……” “哼亚斋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起攘滩,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帅刊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漂问,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赖瞒,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡女揭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栏饮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吧兔。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袍嬉,靈堂內(nèi)的尸體忽然破棺而出境蔼,到底是詐尸還是另有隱情,我是刑警寧澤伺通,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布箍土,位于F島的核電站,受9級特大地震影響罐监,放射性物質(zhì)發(fā)生泄漏吴藻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一笑诅、第九天 我趴在偏房一處隱蔽的房頂上張望调缨。 院中可真熱鬧,春花似錦吆你、人聲如沸弦叶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伤哺。三九已至,卻和暖如春者祖,著一層夾襖步出監(jiān)牢的瞬間立莉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工七问, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蜓耻,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓械巡,卻偏偏與公主長得像刹淌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讥耗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 最近在擼一個V2EX的客戶端有勾,官方API缺少一些功能如登錄,發(fā)帖等古程,擼完官方API總覺得少了什么蔼卡,本篇文章主要通過...
    挨踢小能手閱讀 2,538評論 0 4
  • 這篇主要來講下近期做的一個項目-客戶端爬取網(wǎng)頁數(shù)據(jù),用以向客戶個性化推薦產(chǎn)品挣磨。那么怎么在Android客戶端上將瀏...
    Venus_明閱讀 3,445評論 4 49
  • 1 XML解析No29 【 XML:可拓展標(biāo)記語言雇逞,語言和HTML類似荤懂,也是一種標(biāo)記語言。 特點:標(biāo)記是自定義...
    征程_Journey閱讀 1,656評論 0 9
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法喝峦,類相關(guān)的語法势誊,內(nèi)部類的語法,繼承相關(guān)的語法谣蠢,異常的語法粟耻,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 嗨你們好。 我曾經(jīng)相信很多道理,也去思考。道理和雞湯不一樣逊桦,道理好像更是一種為自己量身打造的保護(hù)罩。 直到有一天册烈,...
    昔日如花妖女閱讀 430評論 0 1