Android類比登入評論CSDN

來源:互聯網
上載者:User

Android類比登入評論CSDN

有時候作為非官方開發的APP整合了官方的所有資訊,但是現在需要實現另一個功能那就是登入發表評論到官方的網站,而非官方的APP並不知道官方網站是怎麼實現登入與評論的,而且越大型的網站,為了防止這樣的事情發生,增加了許許多多阻礙,不過我們這裡可以給大家提供一個通用的方式,就是有點費時,不過按照此方法,基本所有的網站都不在話下。今天就拿CSDN做一下實驗。

1.登入CSDN

我們開啟CSDN登入頁面https://passport.csdn.net/account/login?ref=toolbar

查看其原始碼看看其form表單:

 

其痛點在post data資料中it的value與execution的value,其為隨機產生,這估計是CSDN防止惡意登入設定的動態標識,不過你可以在Android 中先擷取該值然後設定到需要提交的表單項中。

下面使用xutils與Jsoup擷取網頁屬性:

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() {    @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", "你的帳號");        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");    }});

這樣我們不僅擷取了網頁的動態標識,而且設定到即將提交表單的RequestParams當中。

這樣我們重建了一個params1,這個時候所有表單資訊都已經設定到其中,下面就就類比登入了:

public void getLoginCSDN(final RequestParams params){    x.http().request(HttpMethod.POST, params, new Callback.CommonCallback() {        @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");        }    });

調用getLoginCSDN將在日誌中輸出如下資訊:

一個userInfo,data中全部都是個人資訊,一個userInfo非常重要。

2.評論博文

首先我們隨便開啟一篇博文,將httpWatch也開啟。現在在評論中輸入資訊,不要立即點擊提交,先開啟httpWatch。然後提交,然後關閉,我們會得到如下介面:

這裡提交的表單資料為三個,還有一個Query String:

這裡為什麼不開啟HTML代碼看,那我們先看看HTML代碼:

能看出什麼嗎?我唯一看出來的就是表單在div id=comment_form中,可是提交的表單項去哪裡呢?答案就是CSDN寫在JS裡面了。下面我們開啟其處理comment_form的JS。

人家寫在這裡,你不費點時間還真找不到。如果你按照JS裡面的name提交表單資料,那麼你肯定得不到任何結果。返回0以失敗結束。

下面我們開始設定評論的相關資料到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);

當然這裡面的資料有的並不需要,為了測試我按照HttpWatch中給的設定的:

然後在調用post請求:

public void setHttpContent(RequestParams params){    x.http().post(params, new Callback.CommonCallback() {        @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代表失敗,唯一需要說明的是我設定的逾時時間是15秒,為什麼設定這麼長時間,想必大家比我清楚,CSDN在網頁評論都需要這麼長時間,何況手機端呢。

在看看網頁效果:

多的一個是測試中逾時報錯發表上去的。

這篇文章只是類比的登入與評論,其他網站與這差不多。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.