前几天用httpclient写了中华英才的模拟登陆,
今天又用同样的方法写了知乎的模拟登陆。本来所有的代码都可以复用,但是因为之前的那个类设计的不够好,
导致代码复用出现不少问题,于是干脆Repeat Myself了,把代码直接copy了过来复用。
但是依然没有成功,后来debug才发现原来是知乎的一个特殊的cookie导致的,该cookie的name是z_c0,它的值很奇特,
值中居然包含等号“=”,直接导致我的 updateCookie
函数在更新cookie时出现了问题,因为在其内部,
这个函数是通过分割等号获取cookie内部的各个键值的。
于是我用了split
的另一个重载方法split(String regex, int limit),
并将第二个参数传为2(即分割只进行一次,只分割成两个子串即可),便可以成功登录了。
回过头来想想,其实最初的提取cookie值的方法就不对,不应该直接用等号分割,因为等号太常见了,
很可能后面的值中也有,所以最佳的解决方法就是split
的重载方法split(String regex, int limit)
。
更新
重写了前面的博客中提到的java模拟登陆的HttpUtils类,按照如上所说的方式更新了cookie的获取机制,
使得该类可以更加通用的用来登陆网站,起码目前的中华英才和知乎都是测试通过了,都可以登录。
好了,Talk is cheap, 看代码吧。
先来工具类 HttpUtils
然后是测试类HttpTest
由于我已经用Jsoup解析了知乎的网页,所以两行输出应该分别是
{"is_login":true,.....//后面省略,但是会包含你的用户名
知乎用户名
blog comments powered by