轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/Chay_Chan/article/details/75319452
由來(lái)篇
當(dāng)初的夢(mèng)想
一直都想嘗試開(kāi)發(fā)自己還沒(méi)接觸過(guò)的某類(lèi)APP刃麸,以前剛?cè)腴T(mén)的時(shí)候些膨,就有一個(gè)夢(mèng)想:開(kāi)發(fā)社交類(lèi)、地圖類(lèi)犹撒、新聞?lì)悺⒅Ц毒砺亍㈦娚填?lèi)孽尽、直播類(lèi)、游戲類(lèi)這些APP毁葱。社交類(lèi)的大二的時(shí)候已經(jīng)開(kāi)發(fā)過(guò)一款即時(shí)通訊的APP垫言,用的是網(wǎng)易云信的SDK;地圖倾剿、支付筷频、電商也接觸過(guò)了;游戲的話(huà)做過(guò)一個(gè)植物大戰(zhàn)僵尸的demo,算是Cocos2D的入門(mén);新聞和直播之前公司還沒(méi)有接到過(guò)這些項(xiàng)目的開(kāi)發(fā)凛捏,所以一直沒(méi)機(jī)會(huì)接觸担忧,所以一直很想把當(dāng)初的夢(mèng)想實(shí)現(xiàn),做完新聞?lì)惡椭辈ヮ?lèi)的APP坯癣。
今日七月份告別了母校涵妥,正式畢業(yè)了,同時(shí)也辭職了坡锡,大二時(shí)和同學(xué)們一起創(chuàng)建公司接項(xiàng)目做蓬网,現(xiàn)在已經(jīng)一年了,想著出去闖一闖鹉勒,所以辭去了工作帆锋,這個(gè)項(xiàng)目是6月份多的時(shí)候動(dòng)工的,那時(shí)候下班就擠出時(shí)間寫(xiě)代碼禽额,用的是目前的流行框架锯厢,RxJava + Retrofit + MVP,本來(lái)在七月份上旬就接近完成自己定下的那些功能脯倒,只是期間遇到一些問(wèn)題实辑。
遇到的問(wèn)題
問(wèn)題一:今日頭條封閉了老接口,原先是參考大神 wey ye做過(guò)的今日頭條藻丢,根據(jù)他以前抓包知道的接口來(lái)獲取新聞列表剪撬,后臺(tái)接口都獲取不到數(shù)據(jù)了,所以只好想辦法解決悠反,之前雖然有使用過(guò)fidder抓包残黑,可是用得不是很熟悉,遇到一些https加密過(guò)的數(shù)據(jù)包就束手無(wú)策斋否,后來(lái)了解到fidder可以解https的數(shù)據(jù)包梨水,今日頭條的新聞數(shù)據(jù)獲取問(wèn)題就迎刃而解了;
問(wèn)題二:新聞數(shù)據(jù)的規(guī)律茵臭,新聞列表的item布局有好多種疫诽,在沒(méi)有接口文檔的前提下,需要根據(jù)返回的json數(shù)據(jù)進(jìn)行分析旦委,找出規(guī)律奇徒,知道根據(jù)哪個(gè)字段來(lái)判斷屬于哪個(gè)布局,這個(gè)也是相當(dāng)耗時(shí)間社证。
問(wèn)題三:視頻解析逼龟,原先參考的項(xiàng)目中,用到的解析視頻方法追葡,這個(gè)時(shí)候也莫名失效了腺律,所以只好自己去尋找新的解析視頻的方法奕短,找到不少的方法,有的是讀取新聞詳情頁(yè)的html頁(yè)面匀钧,通過(guò)正則匹配出對(duì)應(yīng)視頻的地址翎碑,還有其他的一些方法,但是覺(jué)得還是不合心意之斯,知道找到了一個(gè)解析今日頭條視頻地址的網(wǎng)站日杈,通過(guò)傳入詳情頁(yè)的網(wǎng)址就能夠獲取到對(duì)應(yīng)視頻的地址,所以開(kāi)始抓包獲取那個(gè)接口佑刷,視頻解析的問(wèn)題迎刃而解莉擒。
時(shí)運(yùn)不齊,命途多舛
可是問(wèn)題總是接踵而來(lái)瘫絮,本想著今天可以高高興興地寫(xiě)博客涨冀,分享自己寫(xiě)的這個(gè)開(kāi)源項(xiàng)目,彼此交流下麦萤,誰(shuí)知早上播放視頻的時(shí)候鹿鳖,視頻地址又解析出錯(cuò)了,此時(shí)壮莹,我的內(nèi)心是崩潰的翅帜。調(diào)試以后才知道原來(lái)那個(gè)解析視頻的接口,作者對(duì)接口的訪問(wèn)做了驗(yàn)證命满,估計(jì)是為了防止別人直接調(diào)用他的接口涝滴,一定要通過(guò)他的網(wǎng)站來(lái)訪問(wèn),分析了他的js代碼后周荐,發(fā)現(xiàn)他接口新增了兩個(gè)參數(shù)狭莱,參數(shù)名沒(méi)有什么意義僵娃,是"r"和"s","r"是一段隨機(jī)產(chǎn)生的數(shù)字概作,"s"則是根據(jù) 視頻地址 + "@" + r拼接后,進(jìn)行一系列的處理默怨,與運(yùn)算讯榕、左移、右移愚屁,然后生成的對(duì)應(yīng)的一端數(shù)字,后臺(tái)應(yīng)該也是根據(jù)這個(gè)算法進(jìn)行驗(yàn)證霎槐,驗(yàn)證r和s是否有效梦谜。
知道作者新增了驗(yàn)證后丘跌,也知道了其加密的js代碼袭景,本想將加密的js函數(shù)轉(zhuǎn)換成java代碼寫(xiě)的方法闭树,可最后發(fā)現(xiàn)太過(guò)復(fù)雜,所以放棄了這個(gè)念頭报辱,找到了java可以讀取js腳本与殃,不過(guò)在android中用不了,沒(méi)有對(duì)應(yīng)的ScriptEngine類(lèi)碍现,只好通過(guò)WebView加載本地的js腳本進(jìn)行解析
幅疼,實(shí)現(xiàn)java代碼與js互調(diào)昼接,然后獲取js產(chǎn)生的加密后的哪兩個(gè)參數(shù)"r"和"s"的值。
完工
目前已經(jīng)完成之前頂下的那些功能辩棒,比如新聞的多item布局展示(新聞列表)、視頻列表钻弄、新聞詳情者吁、視頻詳情、點(diǎn)擊頁(yè)簽下拉刷新复凳、查看評(píng)論列表等。非常高興可以做自己喜歡做的項(xiàng)目对途,并非為了工作而做在髓棋,純粹為了接觸一些新的事物,嘗試做自己沒(méi)有開(kāi)發(fā)過(guò)的APP膳犹,最近也在找新的工作签则,雖然已經(jīng)面試了幾個(gè)工作,但最后還是由于薪資不符合自己的要求以及公司的發(fā)展前景豺旬,從而拒絕了,覺(jué)得找工作不應(yīng)該求急哈垢,應(yīng)該一直找,找到自己心中心儀的工作举塔,這樣工作的時(shí)候才會(huì)愉快求泰,事半功倍。
介紹
精仿今日頭條芽丹,數(shù)據(jù)是抓取今日頭條App的數(shù)據(jù)卜朗。使用RxJava + Retrofit + MVP開(kāi)發(fā)的開(kāi)源項(xiàng)目,僅供學(xué)習(xí)用途蚊俺。
項(xiàng)目github地址:https://github.com/chaychan/TouTiao
感謝大神 wey ye逛万,項(xiàng)目中參考到他做過(guò)的仿今日頭條項(xiàng)目
Apk下載地址
演示截圖
首頁(yè)
視頻
微頭條
我的
gif圖
新聞列表得封、視頻列表
[圖片上傳失敗...(image-ea2f64-1516154216596)]
非視頻新聞詳情頁(yè)面
[圖片上傳失敗...(image-ce19af-1516154216596)]
查看和保存圖片
[圖片上傳失敗...(image-fbbcb1-1516154216596)]
視頻播放指郁、視頻詳情頁(yè)面
[圖片上傳失敗...(image-512b47-1516154216596)]
使用到的第三方庫(kù)
- okhttp
- Retrofit
- RxJava
- ButterKnife
- Gson
- BottomBarLayout(輕量級(jí)底部導(dǎo)航欄)
- BaseRecyclerViewAdapterHelper(ReclerView萬(wàn)能適配器)
- StateView(用于幾種狀態(tài)布局的切換)
- JieCaoVideoPlayer(視頻播放)
- BGARefreshLayout-Android(下拉刷新)
- Eyes(修改狀態(tài)欄顏色)
- ColorTrackTabLayout
- EventBus
- KLog(log管理)
現(xiàn)有功能
1.獲取各種頻道的新聞列表,包括視頻和非視頻新聞坡氯;
2.查看新聞詳情,包括視頻和非視頻新聞的詳情;
3.查看新聞評(píng)論列表悯恍;
4.新聞數(shù)據(jù)本地存儲(chǔ)伙狐,已經(jīng)獲取到的新聞數(shù)據(jù)保存在本地?cái)?shù)據(jù)庫(kù)中瞬欧,上拉加載更多時(shí)可查看歷史新聞罢防;
5.底部頁(yè)簽點(diǎn)擊下拉刷新;
6.視頻列表播放中的視頻不可見(jiàn)時(shí)停止播放。
7.查看和保存圖片野建。(8.23更新)
技術(shù)要點(diǎn)
1.新聞數(shù)據(jù)的抓取和分析,使用fidder抓取恬叹,具體使用可參考下面的網(wǎng)址:
http://www.tuicool.com/articles/BJjQZf
2.新聞列表多種Item布局的展示,使用的是BaseRecyclerViewAdapterHelper唯鸭,ReclerView萬(wàn)能適配器硅确,多布局使用可參考下面的網(wǎng)址:
https://github.com/CymChad/BaseRecyclerViewAdapterHelper/issues/968
3.視頻源地址的解析,原先參照大神 wey ye的解析已經(jīng)失效停做,目前是通過(guò)今日頭條視頻解析這個(gè)網(wǎng)址解析的大莫,傳入新聞詳情頁(yè)地址只厘,獲取到對(duì)應(yīng)視頻下載地址的json數(shù)據(jù)。
聲明
這個(gè)屬于個(gè)人開(kāi)發(fā)作品羔味,僅做學(xué)習(xí)交流使用,如用到實(shí)際項(xiàng)目還需多考慮其他因素如并發(fā)等忘蟹,請(qǐng)多多斟酌搁凸。諸位勿傳播于非技術(shù)人員,拒絕用于商業(yè)用途褥芒,數(shù)據(jù)均屬于非正常渠道獲取嫡良,原作公司擁有所有權(quán)利献酗。