Android模擬登錄評(píng)論CSDN實(shí)現(xiàn)代碼
有時(shí)候作為非官方開發(fā)的APP集成了官方的所有信息,但是現(xiàn)在需要實(shí)現(xiàn)另一個(gè)功能那就是登錄發(fā)表評(píng)論到官方的網(wǎng)站,而非官方的APP并不知道官方網(wǎng)站是怎么實(shí)現(xiàn)登錄與評(píng)論的,而且越大型的網(wǎng)站,為了防止這樣的事情發(fā)生,增加了許許多多阻礙,不過我們這里可以給大家提供一個(gè)通用的方式,就是有點(diǎn)費(fèi)時(shí),不過按照此方法,基本所有的網(wǎng)站都不在話下。今天就拿CSDN做一下試驗(yàn)。
1.登錄CSDN
查看其源代碼看看其form表單:
其難點(diǎn)在post data數(shù)據(jù)中it的value與execution的value,其為隨機(jī)產(chǎn)生,這估計(jì)是CSDN防止惡意登錄設(shè)置的動(dòng)態(tài)標(biāo)識(shí),不過你可以在Android 中先獲取該值然后設(shè)置到需要提交的表單項(xiàng)中。
下面使用xutils與Jsoup獲取網(wǎng)頁屬性:
RequestParams params = new RequestParams("https://passport.csdn.net/account/login?ref=toolbar"); params.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"); x.http().get(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { Log.i("csdn", "onSuccess"); RequestParams params1=new RequestParams("https://passport.csdn.net/account/login?ref=toolbar"); params1.setHeader("Accept","text/html, application/xhtml+xml, */*"); params1.setHeader("Content-Type", "application/x-www-form-urlencoded"); params1.setHeader("DNT", "1"); params1.setHeader("Host","passport.csdn.net"); params1.setHeader("Accept-Language","zh-CN"); params1.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"); Document doc=Jsoup.parse(result); Element formEle=doc.getElementById("fm1"); Elements inputs=formEle.getElementsByTag("input"); for (Element input : inputs){ if(input.attr("name").equals("lt")){ params1.addQueryStringParameter("lt", input.attr("value")); }else if(input.attr("name").equals("execution")){ params1.addQueryStringParameter("execution", input.attr("value")); }else if(input.attr("name").equals("_eventId")){ params1.addQueryStringParameter("_eventId", input.attr("value")); } } params1.addQueryStringParameter("username", "你的帳號(hào)"); params1.addQueryStringParameter("password","你的密碼"); } @Override public void onError(Throwable ex, boolean isOnCallback) { Log.i("csdn", "onError"); } @Override public void onCancelled(CancelledException cex) { Log.i("csdn", "onCancelled"); } @Override public void onFinished() { Log.i("csdn", "onFinished"); } });
這樣我們不僅獲取了網(wǎng)頁的動(dòng)態(tài)標(biāo)識(shí),而且設(shè)置到即將提交表單的RequestParams當(dāng)中。
這樣我們重新生成了一個(gè)params1,這個(gè)時(shí)候所有表單信息都已經(jīng)設(shè)置到其中,下面就就模擬登錄了:
public void getLoginCSDN(final RequestParams params){ x.http().request(HttpMethod.POST, params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { Log.i("liyuanjinglyj", "onSuccess"); System.out.println(result.toString()); } @Override public void onError(Throwable ex, boolean isOnCallback) { ex.printStackTrace(); Log.i("liyuanjinglyj", "onError"); } @Override public void onCancelled(CancelledException cex) { Log.i("liyuanjinglyj", "onCancelled"); } @Override public void onFinished() { Log.i("liyuanjinglyj", "onFinished"); } });
調(diào)用getLoginCSDN將在日志中輸出如下信息:
2.評(píng)論CSDN博文
首先我們隨便打開一篇博文,將httpWatch也打開?,F(xiàn)在在評(píng)論中輸入信息,不要立即點(diǎn)擊提交,先開啟httpWatch。然后提交,然后關(guān)閉,我們會(huì)得到如下界面:
這里提交的表單數(shù)據(jù)為三個(gè),還有一個(gè)Query String:
這里為什么不打開HTML代碼看,那我們先看看HTML代碼:
能看出什么嗎?我唯一看出來的就是表單在div id=comment_form中,可是提交的表單項(xiàng)去哪里呢?答案就是CSDN寫在JS里面了。下面我們打開其處理comment_form的JS。
人家寫在這里,你不費(fèi)點(diǎn)時(shí)間還真找不到。如果你按照J(rèn)S里面的name提交表單數(shù)據(jù),那么你肯定得不到任何結(jié)果。返回0以失敗結(jié)束。
下面我們開始設(shè)置評(píng)論的相關(guān)數(shù)據(jù)到RequestParams中:
RequestParams requestParams = new RequestParams("http://blog.csdn.net/ljy1988123/comment/submit"); requestParams.setConnectTimeout(15000); requestParams.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"); requestParams.setHeader("Accept-Language", "zh-CN"); requestParams.setHeader("Host","blog.csdn.net"); requestParams.setHeader("Referer","http://blog.csdn.net/ljy1988123/article/details/50581207"); requestParams.setHeader("Accept", "*/*"); requestParams.setHeader("Content-Type", "application/x-www-form-urlencoded"); requestParams.setHeader("X-Requested-With", "XMLHttpRequest"); requestParams.setHeader("Connection", "Keep-Alive"); requestParams.setMultipart(true); requestParams.addQueryStringParameter("id", "50581207"); requestParams.addParameter("commentid", " "); requestParams.addParameter("content", " 太喜歡這篇博文了。。 98 "); requestParams.addParameter("replyId", " "); setHttpContent(requestParams);
當(dāng)然這里面的數(shù)據(jù)有的并不需要,為了測試我按照HttpWatch中給的設(shè)置的:
然后在調(diào)用post請求:
public void setHttpContent(RequestParams params){ x.http().post(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { Log.i("liyuanjinglyj", "onSuccess"); System.out.println(result.toString()); } @Override public void onError(Throwable ex, boolean isOnCallback) { ex.printStackTrace(); Log.i("liyuanjinglyj", "onError"); } @Override public void onCancelled(CancelledException cex) { Log.i("liyuanjinglyj", "onCancelled"); } @Override public void onFinished() { Log.i("liyuanjinglyj", "onFinished"); } }); }
將輸出如下日志信息:
其返回1代表成功,返回0代表失敗,唯一需要說明的是我設(shè)置的超時(shí)時(shí)間是15秒,為什么設(shè)置這么長時(shí)間,想必大家比我清楚,CSDN在網(wǎng)頁評(píng)論都需要這么長時(shí)間,何況手機(jī)端呢。
在看看網(wǎng)頁效果:
多的一個(gè)是測試中超時(shí)報(bào)錯(cuò)發(fā)表上去的。
這篇文章只是模擬的登錄與評(píng)論CSDN,其他網(wǎng)站與這差不多。
- Android實(shí)現(xiàn)朋友圈評(píng)論回復(fù)列表
- Android評(píng)論功能的實(shí)現(xiàn)過程
- Android 仿微信朋友圈點(diǎn)贊和評(píng)論彈出框功能
- Android實(shí)現(xiàn)評(píng)論欄隨Recyclerview滑動(dòng)左右移動(dòng)
- Android 仿今日頭條評(píng)論時(shí)鍵盤自動(dòng)彈出的效果(推薦)
- Android 仿抖音的評(píng)論列表的UI和效果的實(shí)現(xiàn)代碼
- Android中使用PopupWindow 仿微信點(diǎn)贊和評(píng)論彈出
- Android評(píng)論圖片可移動(dòng)順序選擇器(推薦)
- Android仿微信朋友圈點(diǎn)擊評(píng)論自動(dòng)定位到相關(guān)行功能
- Android如何實(shí)現(xiàn)社交應(yīng)用中的評(píng)論與回復(fù)功能詳解
相關(guān)文章
Android編程自定義Notification實(shí)例分析
這篇文章主要介紹了Android編程自定義Notification的用法,結(jié)合實(shí)例形式簡單分析了自定義Notification的具體功能與實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-12-12Android實(shí)現(xiàn)在ServiceManager中加入自定義服務(wù)的方法詳解
這篇文章主要介紹了Android實(shí)現(xiàn)在ServiceManager中加入自定義服務(wù)的方法,結(jié)合實(shí)例形式分析了Android開發(fā)中ServiceManager自定義服務(wù)的相關(guān)創(chuàng)建與使用方法,需要的朋友可以參考下2017-08-08Android多線程斷點(diǎn)續(xù)傳下載功能實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android多線程斷點(diǎn)續(xù)傳下載功能的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android Studio導(dǎo)入項(xiàng)目不支持的兩種解決方式
這篇文章主要介紹了Android Studio導(dǎo)入項(xiàng)目不支持的兩種解決方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Android開發(fā)之Gradle?進(jìn)階Tasks深入了解
這篇文章主要為大家介紹了Android開發(fā)之Gradle?進(jìn)階Tasks深入了解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08android10 隱藏SystemUI鎖屏下的多用戶圖標(biāo)的示例代碼
這篇文章主要介紹了android10 隱藏SystemUI鎖屏下的多用戶圖標(biāo),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12