當前位置:
首頁 > 知識 > 從零開始學會做一個簡單的APP

從零開始學會做一個簡單的APP

從零開始學會做一個簡單的APP

本人是礦大學信息安全的大三狗,混了兩年日子之後幡然醒悟決定做些自己早就想做的事情,學校的聯通寬頻是按時長收費的,但是每次查詢已用時長和所扣費用步驟都十分的繁瑣,大二的時候都想著要自己做一個APP來幫助大家減少這些繁瑣的步驟,終於拖了半年多才開始做。從只有一點Java基礎到最後做出來可用的APP只用了一個星期的時間,以下是乾貨內容。(其實我就是想來求紅包的!如果能拿到紅包那就是我學計算機掙來的第一桶金了!)

首先我們先看一下正常的查詢步驟,第一步,登陸網上營業廳,還要輸入繁瑣的寬頻賬戶,的確是比較麻煩。

第二步以及以後,反正就是點點點,就不講解了。

(載入比較慢不好意思,一月份因為沒有用所以沒有數據,就拿去年12月的代替吧。)

然後我要怎麼做呢,首先我知道應該用網路爬蟲,我就百度怎麼用Java寫一個爬蟲,然後知道了伺服器傳輸數據都是用的post和get方法,然後在瀏覽器裡面使用合適的工具來將想要的包抓取一下,我學習使用的是火狐瀏覽器的插件firebug,真的是非常好用的工具推薦給大家。

至於在實際動手寫的過程中走過許多許多彎路,最後真正實現了以後才發現其實是很簡單。以下開始講電腦上Java的具體實現。

先講一下最基本的原理,我們用一個httpclient包中的httpclient幫我們處理cookies,cookies就是一個網站的通用登錄憑證,一次登錄憑藉cookie訪問其他頁面不用再次登錄。我們首先在登錄界面登錄,再訪問查詢的頁面,應該就能得到想要的數據,這是基本思想。

首先我們先觀察登陸的時候是怎麼給伺服器發送數據的。

其中幾個參數意義不明,我換其他賬號用相同的參數get過去是一樣的,所以我們構造一個url傳送給伺服器進行驗證即可。

以下是Java代碼中構造的一段代碼(Android中自帶的org.apache包中好像沒有這個構造函數了,所以還是直接寫一個url上去比較方便。)

/*

登陸

生成uri用get方法傳遞過去即可

/

URI uri=new URIBuilder()

.setScheme("https")

.setHost("uac.{}.com")

.setPath("/portal/Service/MallLogin")

.setParameter("callback","jQuery172041659009541749461450622603532")

.setParameter("redirectURL","http%3A%2F%2Fwww.{}.com")

.setParameter("password", "xxxxxx")//密碼

.setParameter("pwdType","01")

.setParameter("productType","04")

.setParameter("redirectType","01")

.setParameter("areaCode","350")

.setParameter("arrcity","%E5%BE%90%E5%B7%9E")

.build();//生成想要的URL

HttpGet htg0=new HttpGet(uri);

接下來我們再看我們想要的數據是怎麼來的。

很明顯是通過一系列的post方法從伺服器的response中以json的形式返回的。其中flowfee就是費用,totalflow時長。

這裡有一個問題難住了很久,百度了好久最後才實驗出來一個解決方法,那就是我直接模擬這個post包向伺服器的地址post數據並沒有獲得想要的返回,而是提示500錯誤,最後的解決辦法是這樣的。從上圖可以看到我們psot過去的還有很多不明意義的東西,我點開都看了看完全不知道是幹嘛的,但是事實就是我們把前面那幾條不明意義的數據向伺服器post過去後就可以正常返回我們想要的數據了。至於應該怎麼解析json之類的小問題百度一下就好啦。

在本文最後會附上電腦的Java源碼,記得要導入幾個jar包才可以運行。

接下來就是神一般的三天安卓速成大法了,我在網上找了幾本Android開發教程,從目錄里找我需要用到的章節,只學需要用到的地方,所以才能只用了三天就寫出來這個安卓程序。實際上也很簡單,只有一個Activity,布局上直接拖得控制項也沒做什麼設計。真正的難點是多線程的使用。因為在Android中需要處理網路任務的時候不能再主線程中處理,主線程只能進行UI的處理。所以在如何使用handler這方面百度了很多很多例子,最終成功的實現了多線程的編寫。除了最主要的抓取數據的程序外,剩下就是一些記住密碼啊,從系統中讀取當前日期之類的小地方的細節,最終寫出來了這個APP並且先給同學試用了一下,最終上傳到百度雲通過貼吧和空間稍微推廣一下希望能夠幫到更多的同學。

其實做完之後自己的感想就是,現在網路上資源十分豐富,也有各種前輩寫的各種blog能夠給你提供詳細的講解和實例,你真正需要挑戰的是自己的耐性。能不能夠靜下心來決心去做好這件事,然後在試錯的道路上堅持下來一直走到你最終找到了正確的道路的那一刻。

我一開始不知道httpclient,試圖自己處理cookies,下載安卓的開發軟體和環境也是個挑戰,後來Android開發的時候導入jar包也出了很多問題(最後用的本身SDK帶的org.apache包),調試的時候不知道斷點怎麼用的,多線程試圖模仿著寫了3個都沒能用,還有好多亂七八糟的問題,但是現在都想不起來了,只是記得當時自己哪怕很煩,哪怕半夜斷網我開著流量下sdk,我都沒有放棄,可能總共花了5,60個小時做這個事,其中估摸著除了十個小時是在做正確的事,其他時候都是在做無用功,但是我還是做出來了。

這是我上大學以來做出的最有成就感的事情了,完全獨立的解決(好吧,Android調試我問了問做過開發的同學)一個問題,真的很有成就感。這個算是教程也算是心得的東西早就想寫了,但是自己又犯了拖延症一直到放假都沒有寫出來,這次看到慕課的這個送紅包的活動真的很有動力就認真的過來講一講,發出來望各位大學迷茫的it狗們共勉。

附:import java.net.URI;

import java.util.ArrayList;

import java.util.List;

public class HelloWorld {

public static void main(String[] args) throws Exception{

// TODO Auto-generated method stub

CloseableHttpClient httpclient = HttpClients.createDefault();

/** *登陸 *生成uri用get方法傳遞過去即可 */ URI uri=new URIBuilder() .setScheme("https") .setHost("uac.{}.com") .setPath("/portal/Service/MallLogin") .setParameter("callback","jQuery17204165900954174946_1450622603532") .setParameter("redirectURL","http%3A%2F%2Fwww.{}.com") .setParameter("userName", "051602198839")//用戶名 .setParameter("password", "xxxxxx")//密碼 .setParameter("pwdType","01") .setParameter("productType","04") .setParameter("redirectType","01") .setParameter("areaCode","350") .setParameter("arrcity","%E5%BE%90%E5%B7%9E") .setParameter("_","1450622609168") .build();//生成想要的URL HttpGet htg0=new HttpGet(uri); HttpResponse response0 = httpclient.execute(htg0); System.out.println(htg0.getURI()); System.out.println(response0.getStatusLine()); String confirm = EntityUtils.toString(response0.getEntity(), "utf-8"); if (confirm.contains("resultCode:"0000"")) System.out.println("登陸成功"); /* * 依次向伺服器post * 前面這些貌似必須先請求響應,會自動生成cookie * 均為不帶post實體內容的 */ HttpPost postU=new HttpPost(); List postUri=new ArrayList(); postUri.add("); postUri.add("); postUri.add("); postUri.add("); postUri.add("); postUri.add("); for(String post:postUri) { URI poU=new URIBuilder(post).build(); postU.setURI(poU); response0=httpclient.execute(postU); System.out.println(response0.getStatusLine()); System.out.println("執行完成"); String result0=EntityUtils.toString(response0.getEntity(), "utf-8"); System.out.println(result0); } System.out.println("準備完成"); /* * 最後post能夠得到想要數據的那條 */ HttpPost htp=new HttpPost("

}

}

附2(Android源碼):package com.example.sunyang.myapplication;


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java吧 的精彩文章:

JAVA 對象引用,以及對象賦值
一張圖揭秘Java自學和培訓的區別
對初學者學java的九大建議
Java基礎:Java super關鍵字

TAG:java吧 |

您可能感興趣

從零開始學編程——猜猜我有幾個BTC
廉價版 iPhone X 或許才是蘋果下一個十年的開始
NBA的這個球星,從打球開始就一直結仇,是史上仇人最多的一個!
做一個高情商的女人,從學會說話開始
iPhoneX,全新的開始,不一樣的開始
第一部數碼寶貝就數這幾個最終BOSS待遇最差 從成熟期開始就一直挨揍
XBACK可能都有一個假耳朵,那些年一開始你聽錯的張藝興的歌詞
GUCCI,CK,Versace等奢侈品牌都開始「玩」狗了,貧窮限制了我的想像?
從零開始學習AI,每周2次直播!
驍龍Win10 PC補完最後一環!微軟開始接受APP提交
C+從零開始怎麼學?
每一個小編都是從零開始
「一個人的開始」
春天的最美Look,從一件時髦的針織衫開始
從 CARMINA 開始,聊聊女生的第一雙手工鞋怎麼選?
春天的最美Look,從一件時髦的針織衫開始~
OPPO和vivo開始顫抖吧!小米MIX2終於降價出擊了
VISVIM 開始賣「床」|BAPE X DAME 4未發售先漲價
一個結束 一個開始
「我從小就開始買SUPREME,因為真的很酷!」專訪吳赫,這次他不再是那個只會說「嗯」的光頭