自學安卓練習作品單詞APP(1)-安卓的hello word與有道字典防爬蟲破解

來源:互聯網
上載者:User
 1.前言

閑來無聊.手機每天又是都接觸的東西.程式什麼的最容易接觸到.想到有些人說前後端都做就是全棧的說法.哦,你看html5全棧.

要我說多接觸一些多有意思.天天寫後端.還不是業務層.又不是什麼高大上的演算法.前端有意思的東西才多.當然我是那種比較old的.不會ag.vue,react.只會jq.拿起一把梭子就是幹.哇.你看看這個前端的水果然深.

接下來說app要完成那些目標了.

1.查詞(這個太簡單了)

2.翻譯(調用有道的)

3.句式分析(本來在想英語是不是有什麼規律.後來一找有人做了.直接嵌入就行了.)

4.單詞匹配(就是根據一些亂七八糟的規則推薦一些相同的單詞)

5.爬蟲文章(暫訂)

要用到的相關技術與內容

1.sqlite本機資料庫,(存放單詞資料庫)

2.webView的使用

3.http請求類比

4.三方工具navicat,用來資料轉送msyql到sqlite,fiddler,用來抓包

5.要會安卓的hello word

2.開工1.下載android studio

運行hello word

android studio有個gradle build running時間特別長的問題很討厭一開始就第一次快.後來就卡死了.百度的方法也用了.不怎麼好使.後來清了清緩衝莫名其妙的好了.

 

2.真機調試

剛開始最困難的就是有些選項不知道在哪裡.一些常規的使用也不太會.真機這裡就是報裝置找不到.網上找的解決方案.那個按鈕也沒看到在哪裡.後來點下面2個地方會好

 

右邊那個是我自己摸索出來的.下面的是別人告訴我的

3.布局

新手嘛.我就拖控制項了.和winform差不多.textView拖得時候在中間.顯示的時候就到了最上面了.這個問別人了.把裡面的部分換成RelativeLayout.然後就正常了

 

 

 

4.擷取控制項,添加事件

 過程我都懂,代碼不會,用嘴編程

而且坑爹的是.這個東西我沒有百度到.其實這對於看視頻學習的來說完全不是什麼問題.我是直接上來硬幹.還好可以問別人.於是別人幫我解決了.findViewById.會了不難.難了不會.....是擷取控制項和添加事件.好了攔路虎解決後.別的應該就不是什麼問題了.我這樣想.

 

 5.擷取文字框的值.填充的TextView中

這裡無鴨梨,一開始我寫複雜了.不知道這個CharSuquence就是文字框的值.我之前是重新擷取了一遍.

6.研究SQLite

這個就簡單了.到這裡.網上教程一堆.想起一位朋友說的面向百度編程.百度看了下.有個抽象類別.繼承實現後就可以了.不過一開始想的問題是看到代碼.這個資料庫不會不能初始化吧.每次都需要建立.後來看到說是不存在才會建立.存在就不會了.才放心了.然後找到在原生位置.copy出來.不過這個資料庫的協助類.這個初始化對我來說用處不大.我的資料是希望提前儲存進去.這裡只是查詢就好了.不過這個SQLite的sql語句和mysql的不相容.有些關鍵字不一樣還有欄位類型.

這裡多叨叨兩句.百度的時候.看到有2個查詢的方法.一個就是sql語句.一個是參數化的查詢方法.把sql語句的這個位置的東西當做參數傳進去.好像記得有7個參數之多......給不會sql的人用的.這裡真的感覺多學點東西是有用的背景東西.安卓也會用到.其實後面前端的東西也會用到.想到一個成語觸類旁通.這個挺重要的.

7.SQLite資料初始化

 找到SQLlite的位置在data目錄下面.自己的包名下面.copy出來後把mysql裡面的單詞資料copy進去.這個單詞的資料來源是之前沒事的時候弄的.本來以為寫了篇文章的.找了下.沒想到沒有.這個資料來源的格式有點問題.顯示的不是中文.是Unicode.記得當時解析這個東西還弄了半天.要準確的把裡面的Unicode東西拿到.然後進行轉換.當時用正則取的.然後就是資料轉送了.這個sql語句不相容.如果是用sql檔案的話.也不能執行.好在navicat有個同步功能.可以完成.不過也有點小bug.sql估計使用單引號括起來的.然後如果欄位裡面有單引號就會報錯.這裡同步的時候.關掉事務.忽略錯誤.有10幾個好像有問題.不過應該用不到.懶得用手處理了.傳輸的時間特別的長.用了快3個小時.然後SQLite的檔案到了78MB.占空間還不小.有資料庫後.剩下的就和後台差不多了.查詢資料庫.

8.WebView研究

安卓的的這個東西小坑還不少.弄個的原因是因為找到了一個句式分析的網站.本來想介面接入的.不過他們那個介面太原始了.返回的html程式碼片段.沒法用....還是直接嵌入網站算了.

第一個小坑是loadUrl跳轉瀏覽器.百度了一下.嘗試了幾個就解決了.反正就是設定一堆參數就是了.要不js什麼的也不能用.js也是後面的一個坑

第二個是頁面load後是白屏.不顯示.這個還真沒找到.後來看到什麼授權.我猜估計是https的原因.我一開始是訪問的百度.有https.算了.我接入的也沒有這個東西.換了一個就出來了.

第三個網上的跳瀏覽器是點選連結.我的是一load就跳.這裡應該是重新導向的原因.相等於跳轉了.又讓我想到了融會貫通.這個是前端或者帶點後的知識.頁面重新導向.

第四個不是小坑就是正常的技術研究吧.執行js.首先讓輸入框擷取焦點他會清空提示文字.這個很簡單.他本來就有onclik事件.直接調用就是了.剩下的就是把傳來的內容寫入到頁面中.這裡需要一些前端的知識.

第五個是個小坑.就是執行js的時候要在頁面載入完後去執行.網上找了頁面載入完事件.有個WebViewClient裡面的事件.說是只會執行一次.有bug就沒有用.不過這onProgressChanged也有bug.就是會多次被調用.而且還是百分百會執行三遍.也沒找到解決辦法.後來加了個標記變數.執行過後.就不在執行了.

第六個使用者登入資訊問題.WebView內建使用者資訊儲存.不用做類比登入了.自己手動登入一次.完事.

 

  

9.網路請求和UI介面更新,網路許可權

 這裡應該是前面說的.不過沒想起來.就是主線程裡面不能進行網路請求.子線程不能進行介面操作.百度.這裡也比較簡單.不過感覺就是代碼有點淩亂.3個關鍵字.Thread,Handler,Runnable.照貓畫虎就行了.這裡和winform差不多.不過winform裡面沒有安卓這麼嚴格.安卓不這麼做直接報錯.對了還有一個許可權的問題.就是網路許可權.這個也需要配置一下

 

10.jar包引入

httpHelper需要用到一個 apache的包.用過maven.gradle這個使用上倒是感覺問題不大.不過不知道哪裡抽風.死活引不進來.好在安卓對本地jar包的引用.可是比java Web對於本地jar包引用.友好太多了.java web得弄個私服.要不就是添加本地倉庫.普通引用.打包各種問題.安卓直接丟進libs就好了.這個和.net差不多很方便.這個gradle坑先不管了.代碼能跑就行.條條大道通羅馬.這條不行.換一條

 

11.activity研究

 這個百度內容也挺多的.主要就是如何建立.然後怎麼顯示還有參數的傳遞.也挺順利的.沒啥坑

12.有道介面研究

 重點來了.這個小妖精有點磨人.截止我寫這篇文章的時候.還沒有調通.不過我相信我有辦法能調通它.

一開始我想簡單了.以為就是一個普通的介面.結果返回errorCode:50.百度了一下.有人研究過了.也有文章.不過裡面的方法沒好使.我在重新梳理一遍吧.這個是百度到的文章.作者也是對這個挺清楚的.不過評論說照著文章已經不能用了.我看了下源碼.好像那個鹽值確實已經換了.出現問題不可怕.知道問題原因就行.我用手機調總是不行.所以第一步先不用手機調用.先自己類比吧.

用Python破解有道翻譯反爬蟲機制

 75294947

這裡要用一下fiddler了.這可抓包可類比.小神器一枚.其實在抓手機包的時候.我已經發現了一點問題.就是參數可能傳錯了.這裡面的等號已經被轉義了.我找的那個httpHelper對參數的處理有點問題.正確的應該是a=b&這樣之類的.

通過上面的文章知道這個介面是在本地加驗證資訊的.因為裡面有時間.所以我的第一步猜想是這個驗證資訊會不會有到期時間.我用相同的header頭髮起了.好幾次資訊.並沒有錯誤.看來是沒有驗證時間.只是用時間戳記當驗證資訊了.

那其實這裡的salt是可以固定的.我們不需要每次去產生新的.然後就是根據文章裡面的去找這個鹽值了.首先下載js.然後像文章說的去格式化.儲存成js.用idea開啟.這個可以協助分析文法結構.否則光靠搜尋有些東西不太好找.

我們根據瀏覽器的請求資訊.直接搜尋typoResult搜尋.這個就一個關鍵字.直接就找到了.這裡的壓縮混淆.其實攔路的作用沒有特別的大.然後看sign簽名.裡面有個D.這個就是放鹽值的變數.如果光靠搜尋.你知道是D但是這個字母太多了.你也不好搜尋.放在idea.用ctrl加左鍵.直接就跳過去了.

ok關鍵資訊都拿到了.接下來就是類比了.

類比部分就是找不同唄.首先先弄個正確的請求.就是瀏覽器發起的那個.通過body的大小.其實也可以直接去看.這個就是正確的.錯誤的是16.然後和手機發起的去比對.手機的少一些.經過嘗試後.其中在header中有2個重要的資訊一個是cookie和Referer這裡沒有的話.就會返回error.當然前提是body的參數要正確.這個用網頁請求的那個行了.前面說過.裡面的時間不會到期.可以一直用.其實http的這些header的檢測都不是特別的可靠.都是可以偽造的.接下來讓手機的發起的請求和瀏覽器一樣就行了.把這兩個參數補上.

看了看代碼.在這個位置設定資訊.於是加了個map用來傳入header資訊.額.....寫完後才發現我說的那個必要資訊上面就有..... 

一運行.結果就好了........好了.我還在想會不會還有些別的坑.結果就好了...我把那個body被轉義的地方改了下.鹽值之前就替換好了.

也不知道這個作者是怎麼想的.要對body轉義.要轉也是我在外面轉吧.你在裡面一轉.等號也被你弄沒了......

 

 

 13.結語

說實話那個有道的那個.我還說要花點時間呢.沒想到下一步就是成功了.

通過這個hello word的安卓程式.發現安卓的內容不是特別的多.和其它語言也有相通的地方.UI和網路請求.做過winform的會眼熟.sql資料和安卓後面的代碼做過java的肯定眼熟.至於控制項的屬性.這個做過前端和winform都可以猜事件.httpHelper.這個後台語言都會遇到這個.c#.java.還有有道最後返回的資料JSON幾乎就是通用的文本傳輸協議了.所以也不是什麼大問題.然後這其中的主線就是HTTP協議 這個才是融會貫通的主線.裡面的requestHeader,requestBody.這個是重點.還有Cookie.要說類比請求.一定繞不過去就是這個.cookie的domain,那個網域名稱下面的.path.該網域名稱下面那個路徑要用.一般用/ .表示所有的路徑都用.還有就是到期時間了.剩下幾個header屬性.需要注意Content-Type.表示我傳的資料格式是什麼.大家可以觀察普通的post請求和上傳檔案的時候.這個是不一樣的.還有Accept表示我想什麼樣的資料.不過一般不用理會.spring mvc在某些情況下會有bug.

這個app剩下就是查詢SQLite資料.做一下單詞匹配規則.然後在抓一些英文的文章吧.可能是這些.不過說實話.安卓真的只是一個介面的承載,這後面的東西和安卓相關的真的感覺不會太多.

 

 

我就是後台不精通.我就是不唯寫介面.我就是樣樣都會.樣樣都不行. 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.