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