android中获取网页cookie的工具方法

1.应用场景

我自己的应用场景是,做一个股票分时图控件demo,需要抓取同花顺网站上的分时图数据,但是这个分时图数据的链接做了cookie校验,直接用httpurlconnection访问,返回403。这个分时图数据的链接在浏览器上也是不能直接打开的,先要在浏览器上访问同花顺股票的其他网页链接,网页里面会加载一段js代码,js代码会设置cookie。这个工具类就是模仿浏览器,先加载普通网页,得到网页里js代码设置的cookie。


2.实现原理

由于我对http协议没那么熟悉,js代码更是完全不了解,所以想到了用android系统提供的WebView方式,先用WebView加载同花顺普通网页,在WebView设置的WebClient的回调中,通过系统API获取到cookie数据。


3.工具类源码

package com.rzc.util;

import android.app.Activity;
import android.text.TextUtils;
import android.webkit.CookieManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/**
 * Created by rzc on 17/11/7.
 */

public class CookieUtil {
    public static void getCookie(Activity activity, final String url,
                                 final OnCookieLoadedListener cookieLoadedListener) {
        final WebView webView = new WebView(activity);
        webView.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                if (cookieLoadedListener != null) {
                    CookieManager cookieManager = CookieManager.getInstance();
                    String cookie = cookieManager.getCookie(url);
                    if (!TextUtils.isEmpty(cookie)) {
                        webView.setWebViewClient(null);
                        cookieLoadedListener.onCookieLoaded(cookie);
                    }
                }
            }
        });
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl(url);
    }

    public interface OnCookieLoadedListener {
        void onCookieLoaded(String cookie);
    }
}

4.下面再贴出上面提到的获取同花顺股票分时图数据的代码

    //这里code是股票代码,比如工商银行的601398;cookie通过上面的工具方法得到,工具方法的url参数为"http://stockpage.10jqka.com.cn/" + code
    private static void doDownload(String code, String cookie) {
        String url = "http://d.10jqka.com.cn/v2/time/hs_" + code + "/last.js";
        HttpURLConnection connection = null;
        try {
            connection = (HttpURLConnection) new URL(url).openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(10 * 1000);
            connection.setReadTimeout(10 * 1000);
            //同花顺网站做了cookie跟referer的校验,referer是固定的,cookie会隔断时间就更新
            connection.setRequestProperty("cookie", cookie);
            connection.setRequestProperty("referer", "http://stockpage.10jqka.com.cn/HQ_v3.html");

            int responseCode = connection.getResponseCode();

            BufferedReader br = null;

            StringBuilder sb = new StringBuilder();

            if (responseCode == HttpURLConnection.HTTP_OK) {
                br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String line = null;
                while ((line = br.readLine()) != null) {
                    sb.append(line).append("\n");
                }

                br.close();
                System.out.println(br.toString());//这里就是获取到分时图数据
            } else {
                if (responseCode == HttpURLConnection.HTTP_FORBIDDEN) {
                    //同花顺服务器做了cookie校验,调用这个方法如果捕捉到Error,则用获取cookie的工具方法刷新得到最新的cookie再调用此方法重试
                    throw new Error("403");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.disconnect();
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }
    }





你可能感兴趣的:(android中获取网页cookie的工具方法)