网站首页 > 教程分享 正文
某种程度上说,这个工具写得并不成功,适用性较差,不过过程中遇到的许多问题还是比较有探讨价值的,所以分享出来以供参考和交流。
【需求说明】
关于直播视频的下载,网上可以搜到一些,比如用Fiddler脚本抓包ts保存到本地再合并,但这些方式对小白而言太难了,所以就想着写个傻瓜化的工具。程序的界面设计如下。
界面比较简单,左侧可以设置“直播地址、下载目录、保存频率”以及“请求头user-agent”;右侧是直播视频展示区(iframe标签)。
【踩坑01】
此处以百度为例,当试图在iframe中打开百度页面时,报了个错:“Refused to display [URL] in a frame because it set 'X-Frame-Options' to 'sameorigin'.”
X-Frame-Options 响应头是用来给浏览器指示允许一个页面可否在 <frame>、<iframe>、<embed> 或者 <object> 中展现的标记。
可选值 | 作用 |
DENY | 该页面不允许在frame中展示 |
SAMEORIGIN | 该页面可以在相同域名页面的frame中展示 |
ALLOW-FROM | 该页面可以在指定来源的frame中展示 |
ALLOWALL | 该页面允许全部来源域名的frame展示 |
根据这个标识的特点,修改思路便有了:当网络请求响应头返回时对其中的该标识的值进行修改,修改后再嵌套就可规避该错误。相关代码如下
let filters = {urls: ['*://*/*']}
session.defaultSession.webRequest.onHeadersReceived(filters, (details, callback) => {
details.responseHeaders['X-Frame-Options'] = 'AllowAll'
callback({cancel: false, responseHeaders: details.responseHeaders})
})
【踩坑02】
此处以抖音直播为例,当使用iframe打开时,报了错“Refused to frame 'https://live.douyin.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors live.ixigua.com live.ixigua.com www.ixigua.com activity.douyin.com creator.douyin.com".”
这是因为响应头中设置了内容安全策略,该标识限制了iframe嵌套需要遵循的规则。
Content-Security-Policy字段有若干指令,可以设置指定的策略允许的源。其值的格式为: [指令] <source> ...; [指令] <source> ...;...
指令 | 限制范围 |
frame-ancestors | <frame>,<iframe>,<object>,<embed>或<applet> |
worker-src | Worker SharedWorker ServiceWorker |
script-src | <script> |
… | … |
这个标识和之前的标识类似,修改思路:当网络请求响应头返回时对其中的该标识的值进行修改,修改后再嵌套就可规避该错误。相关代码如下
details.responseHeaders['content-security-policy'] = ''
【踩坑03】
有的网站只允许在微信环境中进行访问,这个分情况,如果只是微信的user-agent校验可以通过修改请求头&本地标识来解决;如果是页面代码逻辑控制的,便没太好的办法(修改原始js数据会破坏业务逻辑,也超出了本程序傻瓜化的初衷)。
修改请求头的user-agent代码:
session.defaultSession.webRequest.onBeforeSendHeaders(filters, (details, callback) => {
details.requestHeaders['User-Agent'] = [微信user-agent]
callback({cancel: false, requestHeaders: details.requestHeaders})
})
修改程序的navigator.userAgent代码:
mainWindow.loadURL('app://./index.html', {
userAgent: [微信user-agent]
})
【踩坑04】
通过Electron拦截网络请求时,在数据返回的各个阶段都无法拿到响应数据的responseBody,更尴尬的是,其它的数据都有,唯独没有body体。网上搜了很久,资料很少,没有找到有效的办法。
所以,退而求其次,当接口响应数据返回以后,用fetch再请求一次资源(还好有浏览器缓存,所以基本上也还凑合)。
相关代码:
this.tsIndex = 0
let filters = {urls: ['*://*/*']}
session.defaultSession.webRequest.onCompleted(filters, (details) => {
let baseUrl = details.url.split('?')[0]
if (/\.ts$/.test(baseUrl) && !this.downloadDict[baseUrl]) {
let index = this.tsIndex
this.tsIndex++
this.downloadDict[baseUrl] = 1
console.log(index, details.url)
fetch(details.url, {method: 'get', responseType: 'arraybuffer'}).then(res => {
return res.arrayBuffer()
}).then((ab) => {
this.dataList[index] = ab
})
}
})
【功能测试】
测试平台:芒果TV、百度直播、抖音直播
测试结果:芒果TV可以正常抓取;百度直播抓取到的视频数据不能播放;抖音直播抓取不到数据。
猜你喜欢
- 2024-09-11 VSCode快速入门(快捷键,个性化配置,实用插件)
- 2024-09-11 如何下载理财投资工具及安装「Moneydance mac」
- 2024-09-11 利用一行代码下载网页视频(怎么用代码下载网页视频)
- 2024-09-11 DecSoft HTML Compiler 2022(html编译工具)v2023.9(x64)特别版
- 2024-09-11 视频下载|利用浏览器插件或视频嗅探工具、网站页面
- 2024-09-11 Mathematica 12.3中文版软件下载及安装教程
- 2024-09-11 linux wget 命令小白教学,做一个有技术范的下载狂魔
- 2024-09-11 Python爬虫实战:利用scrapy,短短50行代码下载整站短视频
- 2024-09-11 solidworks2022软件下载与安装教程
- 2024-09-11 Adobe Character Animator 2018 安装教程(附安装包下载)
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)