自学安卓练习作品单词APP(1)-安卓的hello word与有道字典防爬虫破解

 

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破解有道翻译反爬虫机制

 https://blog.csdn.net/nunchakushuang/article/details/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数据.做一下单词匹配规则.然后在抓一些英文的文章吧.可能是这些.不过说实话.安卓真的只是一个界面的承载,这后面的东西和安卓相关的真的感觉不会太多.

我就是后台不精通.我就是不只写接口.我就是样样都会.样样都不行. 

 

原文地址:https://www.cnblogs.com/lansehai/p/9500357.html