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();
                }

            }
        }
    }





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章