当前位置: 首页 > news >正文

那些年的Webview开发经验记录

获取网站视频真实链接

直接上工具类

直接调用即可,这个工具类会返回加载的网页中所有的链接,至于对链接怎么处理就是你们自己的事了, 亲测至今我所遇到的所有视频,它都可以捕获到其链接


import android.app.Activity;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.view.ViewGroup;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.SslErrorHandler;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;import java.util.Timer;
import java.util.TimerTask;/*** Created by Administrator on 2018/3/22.*/public class ParseWebUrlHelper {private static ParseWebUrlHelper parseWebUrlHelper;private String webUrl;private Activity mAct;private WebView webView;private int timeOut = 20 * 1000;private OnParseWebUrlListener onParseListener;public static ParseWebUrlHelper getInstance() {if (parseWebUrlHelper == null) parseWebUrlHelper = new ParseWebUrlHelper();return parseWebUrlHelper;}public ParseWebUrlHelper init(Activity act, String url) {this.mAct = act;this.webUrl = url;ViewGroup mainView = (ViewGroup) mAct.findViewById(android.R.id.content);this.webView = new WebView(mAct);this.webView.setLayoutParams(new LinearLayout.LayoutParams(1, 1));mainView.addView(this.webView);initWebSettings();return this;}private void initWebSettings() {WebView mWebView = this.webView;mWebView.clearFocus();WebSettings mWebSettings = mWebView.getSettings();mWebSettings.setJavaScriptEnabled(true);mWebSettings.setDefaultTextEncodingName("utf-8");mWebSettings.setCacheMode(WebSettings.LOAD_DEFAULT);mWebSettings.setPluginState(WebSettings.PluginState.ON);mWebSettings.setDisplayZoomControls(false);mWebSettings.setUseWideViewPort(true);mWebSettings.setAllowFileAccess(true);mWebSettings.setAllowContentAccess(true);mWebSettings.setSupportZoom(true);mWebSettings.setAllowContentAccess(true);mWebSettings.setLoadWithOverviewMode(true);mWebSettings.setBuiltInZoomControls(true);// 隐藏缩放按钮mWebSettings.setUseWideViewPort(true);// 可任意比例缩放mWebSettings.setLoadWithOverviewMode(true);// setUseWideViewPort方法设置webview推荐使用的窗口。setLoadWithOverviewMode方法是设置webview加载的页面的模式。mWebSettings.setSavePassword(true);mWebSettings.setSaveFormData(true);// 保存表单数据mWebSettings.setJavaScriptEnabled(true);mWebSettings.setTextZoom(100);mWebSettings.setDomStorageEnabled(true);mWebSettings.setSupportMultipleWindows(true);// 新加//我就是没有这一行,死活不出来。MD,硬是没有人写这一句!if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {mWebSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {mWebSettings.setMediaPlaybackRequiresUserGesture(true);}if (Build.VERSION.SDK_INT >= 16) {mWebSettings.setAllowFileAccessFromFileURLs(true);mWebSettings.setAllowUniversalAccessFromFileURLs(true);}mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);mWebSettings.setLoadsImagesAutomatically(true);mWebSettings.setAppCacheEnabled(true);mWebSettings.setAppCachePath(mAct.getCacheDir().getAbsolutePath());mWebSettings.setDatabaseEnabled(true);mWebSettings.setGeolocationDatabasePath(mAct.getDir("database", 0).getPath());mWebSettings.setGeolocationEnabled(true);CookieManager instance = CookieManager.getInstance();if (Build.VERSION.SDK_INT < 21) {CookieSyncManager.createInstance(mAct.getApplicationContext());}instance.setAcceptCookie(true);if (Build.VERSION.SDK_INT >= 21) {instance.setAcceptThirdPartyCookies(mWebView, true);}mWebView.setWebViewClient(new MyWebViewClient());enabledCookie(webView);//启用cookie}public ParseWebUrlHelper setLoadUrl(String url){this.webUrl=url;return this;}public ParseWebUrlHelper startParse(){webView.loadUrl(this.webUrl);return this;}/*启用cookie*/private void enabledCookie(WebView web) {CookieManager instance = CookieManager.getInstance();if (Build.VERSION.SDK_INT < 21) {CookieSyncManager.createInstance(mAct);}instance.setAcceptCookie(true);if (Build.VERSION.SDK_INT >= 21) {instance.setAcceptThirdPartyCookies(web, true);}}public ParseWebUrlHelper setOnParseListener(OnParseWebUrlListener onParseListener) {this.onParseListener = onParseListener;return this;}private class MyWebViewClient extends WebViewClient {@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {if(request.getUrl().toString().startsWith("intent")||request.getUrl().toString().startsWith("youku")){return true;}else{return super.shouldOverrideUrlLoading(view, request);}}@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {if(url.startsWith("intent")||url.startsWith("youku")){return true;}else{return super.shouldOverrideUrlLoading(view, url);}}/*解决ssl证书问题*/@Overridepublic void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {handler.proceed();}@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, String url) {onParseListener.onFindUrl(url);return super.shouldInterceptRequest(view, url);}@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {String url = request.getUrl().toString();onParseListener.onFindUrl(url);}return super.shouldInterceptRequest(view, request);}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {// TODO: Implement this methodsuper.onPageStarted(view, url, favicon);startConut();//加载超时处理}}/*解决webview加载超时问题*/private void startConut(){final Timer timer=new Timer();TimerTask timerTask=new TimerTask(){@Overridepublic void run(){onParseListener.onError("解析视频超时,请检查网速或网络是否出现问题...");timer.cancel();timer.purge();}};timer.schedule(timerTask,timeOut,1);}public interface OnParseWebUrlListener {void onFindUrl(String url);void onError(String errorMsg);}
}

调用

//初始化
this.parseWebUrlHelper=ParseWebUrlHelper.getInstance().init(this.mAct,"");
//解析网页中视频
parseWebUrlHelper.setOnParseListener(new ParseWebUrlHelper.OnParseWebUrlListener() {@Overridepublic void onFindUrl(String url) {Log.d("webUrl",url);//*****处理代码}@Overridepublic void onError(String errorMsg) {//****出错监听}

问题

Q:webview某些视频加载不出来问题
A:http://blog.csdn.net/u013148839/article/details/65448474
Q:webview拦截请求
A:https://segmentfault.com/a/1190000006805635
Q:webview由于证书问题导致不能正常加载网页问题:
A:http://blog.csdn.net/sd19871122/article/details/54632199

他人总结

1.http://www.cnblogs.com/lee0oo0/p/4026774.html

获取webview完整源码[包括iframe源码]

主要问题

动态加载

iframe嵌套

0.window也算一个frame
1.得到frame
2.判断frame的url是否已被查找
3.判断frame是否是同域名
4.同域名直接正常查找
5.不同域名直接单独加载frame的url,当成一个新的页面处理
6.一直查找直到发现一个video标签

iframe链接单独打开被检测到问题

次要问题

去除Chrome反调试

无限断点反调试

参考:https://blog.csdn.net/zzgzzg00/article/details/79504827

完结

编程这种事真是太容易跑偏了,我明明最根本的目的就是为了获取网站视频链接的,然后发现有些网站的源码获取不全,然后目的就悄然变成了去获取源码,然后折腾了几天依然没解决这个获取源码的问题,然后猛然记起以前研究过相同的问题,并且还写了一篇获取视频链接的文章,这才是真正的造轮子吧,明明已经研究过一次了,相同的问题明明已经遇到过一次了,为何这次又掉坑里了?而且掉坑里几天了,居然没意识过来,唉,笨啊,真实不长记性啊,到了最后才发现我获取源码的目的就是为了获取视频链接,说来还是我以前写的这篇文章发挥了作用:Web逆向之通过Android中WebView获取网站视频真实链接

参考

1.攻破iframe围城
2.Python爬虫关于多层嵌套iframe的解决
3.爬虫获取:解决动态加载数据和frame框架问题
4.java爬虫进阶 —— ip池使用,iframe嵌套,异步访问破解

相关文章:

那些年的Webview开发经验记录

获取网站视频真实链接 直接上工具类 直接调用即可&#xff0c;这个工具类会返回加载的网页中所有的链接&#xff0c;至于对链接怎么处理就是你们自己的事了&#xff0c; 亲测至今我所遇到的所有视频&#xff0c;它都可以捕获到其链接 import android.app.Activity; import an…...

ssh-keygen详解

ssh-keygen命令参数详解 -b BITS指定密钥长度。 -e读取私有或公共 OpenSSH 密钥文件并以 -m 选项指定的格式之一将密钥打印到标准输出。 -C添加注释。 -f FILENAME指定用来保存密钥的文件名。 -i以 -m 选项指定的格式读取未加密的私钥&#xff08;或公钥&#xff09;文件&…...

自动方向识别式 LSF型电平转换芯片

大家好&#xff0c;这里是大话硬件。 今天这篇文章想分享一下电平转换芯片相关的内容。 其实在之前的文章分享过一篇关于电平转换芯片的相关内容&#xff0c;具体可以看链接《高速电路逻辑电平转换设计》。当时这篇文章也是分析的电平转换芯片&#xff0c;不过那时候更多的是…...

轻量的工作流引擎:告别低效,创造新高!

伴随着日益激烈的市场竞争&#xff0c;作为新时代的企业&#xff0c;如何在众多同质化竞争中脱颖而出&#xff0c;占有更多的市场份额&#xff0c;实现更大发展&#xff1f;此时此刻就需要拥有不同寻常的头脑&#xff0c;寻找不平常的路径&#xff0c;轻量的工作流引擎是低代码…...

Linux-mysql安装

1. 获取rpm wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm 2. 安装rpm rpm -ivh mysql57-community-release-el7-9.noarch.rpm 3. 确认依赖文件 cd /etc/yum.repos.d ls 查看该文件夹下是否已存在如下两个文件 4. import mysql 的公钥到RPM…...

山东布谷科技直播平台搭建游戏开发技术分享:数据存储的重要意义

在市场上的热门的直播平台中&#xff0c;有很多小程序为用户提供各种各样的功能&#xff0c;这其中就有很多游戏小程序&#xff0c;当今社会独生子女众多&#xff0c;很多作为独生子女的用户都会去选择一个能够社交互动的APP来填补内心的空虚&#xff0c;而直播平台的实时互动的…...

MyBatisPlus的介绍

本资料仅用于学习和讨论&#xff0c;如有侵权请反馈 https://mp .baomidou. com/ MyBatis-Plus 1.1 为什么网站叫做苞米逗是国人开发的 1.2 点击快速开发 1.3 点击快速开始 1.4 Mybatis的特性 2、快速的把数据层的标准开发给做完&#xff1a; 2.1上来就来标准开发了&#xf…...

麻省理工学院利用水泥和炭黑制造出超级电容器

麻省理工学院的研究人员展示了一种使用低成本水泥和炭黑的制造的超级电容器&#xff0c;这一发明可能会彻底颠覆可再生能源的存储。 ​为了解决太阳能、风能和潮汐能等间歇性和非周期性电源的普及问题&#xff0c;实用并且廉价的电力储存技术一直是重要的环节。MIT的研究人员最…...

【Spring Cloud Alibaba】Linux安装RocketMQ以及RocketMQ Dashboard可视化工具

环境准备&#xff1a;Linux安装Java环境&#xff08;OracleJDK&#xff09; 在当今分布式架构的开发中&#xff0c;消息队列成为了一种常见的解决方案。RocketMQ是阿里巴巴开源的分布式消息中间件&#xff0c;具有高吞吐量、高可用性和强大的扩展性&#xff0c;因此在构建大规模…...

【杂谈】电脑城的消失:时代变迁中的一段峡谷

导语&#xff1a;在过去很长一段时间里&#xff0c;想要购买电子设备都逃不开一个叫“电脑城”的地方&#xff0c;那里鱼龙混杂良莠不齐&#xff0c;是令许多人记忆深刻分外难忘之处。但是随着时代发展电商兴起&#xff0c;采用传统线下销售的电脑城却逐渐衰退甚至面临消失&…...

Webpack怎么使用?

Webpack 使用 前几篇文章中已经介绍了如何初始化包管理器 package.json 这里不再重复介绍&#xff0c;如有需要请查看 搭建工程化项目。 安装 :::warning 注意 请确保你已经安装了 yarn&#xff0c;如有需要请查看 搭建工程化开发环境。 ::: 通过命令 yarn add webpack web…...

异步编排CompletableFuture

文章目录 一.简介二.并行加载1.为何需要并行加载2.并行加载的实现方式 三.CompletableFuture使用与原理1.背景和定义2.常用方法3.CompletableFuture的使用3.CompletableFuture原理4.实践总结 一.简介 CompletableFuture由Java 8提供&#xff0c;是实现异步化的工具类&#xff…...

linux_常用命令

一、日常使用命令/常用快捷键命令 开关机命令 1、shutdown –h now&#xff1a;立刻进行关机 2、shutdown –r now&#xff1a;现在重新启动计算机 3、reboot&#xff1a;现在重新启动计算机 4、su -&#xff1a;切换用户&#xff1b;passwd&#xff1a;修改用户密码 5、logou…...

Mac OS键盘常用快捷键

图形按键⌘Command 键⌃Control 键⌥Option 键⇧Shift 键⇪Caps Lockfn功能键 常用快捷键剪切、拷贝和粘贴 您可以在大多数 app 中使用这些快捷键来剪切、拷贝或粘贴选中的项目。其中包括文本、图片、音乐等等。您甚至可以在 Finder 中拷贝和粘贴文件&#xff0c;来将文件拷贝到…...

【腾讯云 Cloud Studio 实战训练营】通过云IDE构建Web3项目

​ iOS开发上架主页 在强者的眼中&#xff0c;没有最好&#xff0c;只有更好。 移动开发领域优质创作者&#xff0c;阿里云专家博主 文章目录 背景一、 前言二、 Cloud Studio 主要功能和应用场景三、Cloud Studio 实验前期准备3.1. 打开官网3.2. 注册 Cloud Studio&#xff1a…...

湖南麒麟系统非正常关机导致VNC启动失败原因分析

1、故障描述 掉电后&#xff0c;启动vncserver无法启动&#xff0c;或启动后连接vncserver黑屏 2、影响范围 非正常关机流程的机器 3、故障处理过程 第一次开机后vncserver服务无法正常启动&#xff0c;使用restart手动也无法拉起。按照现场人员提醒使用reboot命令重启机器…...

机器学习---监督学习和非监督学习

根据训练期间接受的监督数量和监督类型&#xff0c;可以将机器学习分为以下四种类型&#xff1a;监督学习、非监督学习、半监督学习和强化学习。 监督学习 在监督学习中&#xff0c;提供给算法的包含所需解决方案的训练数据&#xff0c;成为标签或标记。 简单地说&#xff0c;…...

【OS】请问,一个需要运行内存10GB的游戏,可以运行在32位物理内存为64GB的电脑上吗?

答案&#xff1a; 可以 解释 操作系统虽然是32位&#xff0c;限制了电脑的虚拟内存最大值为 4GB。如果&#xff0c;电脑开启了虚拟内存&#xff0c;则该款10GB运存的游戏是不可能开启的。期望开启这款游戏的做法是&#xff0c;在这个物理内存为64GB的电脑上关闭虚拟内存机制&…...

C语言 冒泡排序

目录 一、原理 二、代码演示 三、代码优化 一、原理 假设&#xff1a; int arr[] { 9,8,7,6,5,4,3,2,1,0 }; 将 arr 内的元素进行升序排列&#xff0c;得到一个新的数组 int arr[] { 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;…...

docker相关命令总结(停止、重启、重加载配置文件)

常用命令 # 配置 Docker 守护进程的行为和参数 vi /etc/docker/daemon.json# 停止docker服务 sudo systemctl stop docker# 启动 Docker 服务&#xff1a; sudo systemctl start docker# 重新加载systemd守护程序的配置文件&#xff0c;不会重启服务&#xff08;配置文件&…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...