您的位置:首页 > 移动开发 > Android开发

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

2017-11-07 15:41 405 查看
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();
}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: