>

Android模拟登录V2EX,Jsoup登录解析网页信息

- 编辑:正版管家婆马报彩图 -

Android模拟登录V2EX,Jsoup登录解析网页信息

今天深入分析网页的时候,境遇必得登陆后才可以访谈的主题素材,在英特网寻觅了部分材料,反正有人做出来了,可是是采用HttpClient+Jsoup来实现的,小编不知晓他们选拔什么版本的Jsoup,地址: 

新近在撸一个V2EX的客商端,官方API缺乏一些效能如登陆,发帖等,撸完官方API总以为少了怎么样,本篇作品首要透过模拟登入完成部分官方没提供API的作用

HttpClient模拟登入人人网,並且爬取日志内容(一), API,能够平素模拟登录,获取服务器再次回到的新闻。

注重登陆传输的数码

在网页上登陆帐号,通过chrome的调节和测量试验形式可以看出 ,我们传了4个数据给服务器,分别是帐号,密码,once,和next,once是用来证实是或不是人为操作的标识,POST时必需带上那几个字段,不然会感觉是非人为操作而被取缔访问。

图片 1

Paste_Image.png

知情了索要传什么参数后,退出登录,回到登入此前的页面,https://www.v2ex.com/signin, 大家需求POST的数量都须要在那些页面里捉取下来

图片 2

Paste_Image.png

自己那边是运用水木社区做德姆o,其中上面包车型地铁id和passwd分别是付诸form表单中客商名和密码的input的name

代码达成

1.增加央浼头
在chrome登录成功页面查看POST的伸手头,在OkHttp中相应进行安插。

        mClient = new OkHttpClient.Builder()
                .cookieJar(new CustomCookieJar(new CookieManager(mPersistentCookieStore, CookiePolicy.ACCEPT_ALL)))
                .readTimeout(12, TimeUnit.SECONDS)
                .addInterceptor(htmlInterceptor)
                .addInterceptor(loggingInterceptor)
                .build();

    private Interceptor htmlInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request newRequest = chain.request().newBuilder()
                    .addHeader("Origin", "https://www.v2ex.com")
                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
                    .build();
            return chain.proceed(newRequest);
        }
    };

2.定义登陆接口api
分级定义get和Post 二种,get取得帐号,密码,once的值,用于POST提交

    @GET("signin")      //登录
    Observable<String> login();

    @FormUrlEncoded
    @Headers("Referer: https://www.v2ex.com/signin")
    @POST("signin")
    Observable<String> postLogin(@FieldMap HashMap<String, String> hashMap);

3获取数据,发送登入须要

        Subscription subscription = LoginService.getInstance().auth().login()
                .map(new Func1<String, HashMap>() {
                    @Override
                    public HashMap call(String stringResponse) {
                        return JsoupUtil.parseUserNameAndPwd(stringResponse, username, password);
                    }
                }).flatMap(new Func1<HashMap, Observable<String>>() {
                    @Override
                    public Observable<String> call(HashMap requestMap) {
                        return LoginService.getInstance().auth().postLogin(requestMap);
                    }
                }).map(new Func1<String, LoginResult>() {
                    @Override
                    public LoginResult call(String response) {
                        String errorMsg = ApiErrorUtil.getErrorMsg(response);
                        if (errorMsg == null) {
                            return JsoupUtil.parseLoginResult(response);
                        } else {
                            LoginResult result = new LoginResult();
                            result.setMessage(errorMsg);
                            return result;
                        }
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);

这里运用了Jsoup来深入分析html能够很便利的取得须求的多少,没理解过的同校能够查看这里Jsoup开拓指南

登入成功后回到的html里面就有客户的数额了

图片 3

Paste_Image.png

 Map map = new HashMap();
 map.put("id", "****");
 map.put("passwd", "****");
 Response response = Jsoup.connect("http://m.newsmth.net/user/login")
     .data(map)
     .method(Method.POST)
     .timeout(20000)
     .execute();
 if (response.statusCode() == 200) {
  SmthApp.getInstance().setCookies(response.cookies());
 }

Cookie

当您做到已上手续依旧无法赢得个人音信,会自动跳转到登录页面,因为http央浼是无状态的,服务器并不知道你曾经报到了,这里就需求陈设Cookie,登入成功后,服务会回到二个Cookie(通行证),客商端需保存那个Cookie,再一次发送乞求时带上这一个Cookie,服务器就能够鉴定分别该客商,而且再次来到客商相关的音讯了。
在OKHttp3中配置库克ie持久化只需一句话

.cookieJar(new CustomCookieJar(new CookieManager(mPersistentCookieStore, CookiePolicy.ACCEPT_ALL)))

达成库克ie后就足以获得具备数据了,如客户关切节点等。

对cookie不打听的可以看这里 Cookie/Session机制详解
在OkHttp中如何落到实处Cookie的漫长化能够看这里OkHttp3之Cookies管理及长久化

如上完整的代码在此间 https://github.com/sooola/V2EX-Android ,PAJEROxJava &Retrofit 的V2EX第三方顾客端,项目在龟速更新中,有另外建议招待issues,开源不易,路过求start激励下(⊙ᗜ⊙)

其间Response里面就有我们须要的Cookie,获取的办法为response.cookies()再次回到类型是Map,上面是得到浏览器登入重回的Cookie内容,一样大家获得的Cookies也是这一个剧情。

Set-Cookie:main[UTMPUSERID]=***; path=/; domain=.newsmth.net
Set-Cookie:main[UTMPKEY]=97311264; path=/; domain=.newsmth.net
Set-Cookie:main[UTMPUSERID]=guest; path=/; domain=.newsmth.net
Set-Cookie:main[PASSWORD]=%2501g2VSVO%257D%2507%251DW%253B%2524K%2B%251C%2500a%2502%2501%257DF%2505X; path=/; domain=.newsmth.net
Set-Cookie:main[UTMPNUM]=9967; path=/; domain=.newsmth.net
Set-Cookie:main[UTMPKEY]=68252570; path=/; domain=.newsmth.net
Set-Cookie:main[UTMPNUM]=37535; path=/; domain=.newsmth.net

当深入分析须要登录的页面时,

 Document document = Jsoup.connect(url).
    timeout(20000).
    cookies(SmthApp.getInstance().getCookies())//这个就是上面获取的cookies
    .get();

如此就足以一成不改变登陆分析页面,必要留意的是其一是有时间限定的,当失效后再度伸手获取最新的Cookie。

...

本文由web前端发布,转载请注明来源:Android模拟登录V2EX,Jsoup登录解析网页信息