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/" + codeprivate 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的工具方法相关推荐
- android获取颜色资源,Android中获取颜色的几种方法
Android中获取颜色的几种方法: 通过android封装好的Color类中的常量 public static final int BLACK = 0xFF000000; public static ...
- Android中获取网络图片的三种方法
android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况.对于这种情况,一般的方法就是耗时操作用 ...
- Android 中获取网络下载速率的方法
文章目录 相关方法如下: // 获取应用程序的 uid public static int getAppUid() {int uid = -1;// KmApplication是我的自定义Applic ...
- Android中获取屏幕物理尺寸的方法
第一种方法 //获取屏幕宽度 int screenWidth = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)). ...
- Android中获取流量相关数据的方法
获取流量的相关数据主要使用的是TrafficStats工具类.这里列举一下该类的主要方法. getTotalRxBytes:获取接收流量的总字节数. getTotalTxBytes:获取发送流量的总字 ...
- 【音视频安卓开发 (五)】Android中获取音视频原始数据的方法
一般取得原始数据的方法使用的camera setPreviewCallback
- android apk 的信息,Android中获取apk基本信息
一 PackageManager可以获得的所有包节点信息: 1,所有节点的基类:PackageItemInfo: 2,PackageInfo:package的全面信息,与AndroidManifest ...
- Android WebView获取网页中JavaScript弹框内容
Android WebView获取网页中JavaScript弹框内容 网页中弹窗的js代码为 <script type="text/javascript" language= ...
- android开发获取imei码,Android中获取IMEI码的方法
我们在开发项目的时候,通常要获取手机的IMEI码,这是开发的必备需求,接下来,爱站技术频道小编就告诉大家Android中获取IMEI码的方法,希望本文的介绍能提高大家的水平. 核心代码:Imei = ...
最新文章
- celery源码分析-Task的初始化与发送任务
- 基于Attention机制的轻量级网络架构以及代码实现
- Verilog 中 wire 和 reg 数据类型区别
- 第三周项目四-穷举法解决组合问题(1)
- 实战tcpdump看RST
- 成功解决This module was deprecated in version 0.18 in favor of the model_selection module into which all
- 离散制造业的数据采集之路
- 如何选择主机操作系统?
- asp.net中实现文件批量上传
- js导出excel单元格内换行符代码_前端和excel的那些事
- C语言源代码展示:常用转换函数实现原理
- 基于SpringBoot 2.3的WebService指南(包含案例)
- 想要在Mac 上运行 Windows 程序 不需要虚拟机也可以
- 《统计学基本概念和方法》读书笔记+读后感(1)
- jQuery调用WebService ( 同源调用)
- java 中的通讯之HTTP协议
- Spring bean销毁的过程
- CAD全称AutoCAD (全系列中文版软件+注册机下载) 2004-2020 安装视频教程
- Back键和Home键的屏蔽
- linux内核DCB子系统