利于puppeteer获取网络资源的直链
背景
比如我想使用curl 或者 页面按钮点击直接下载个网盘资源,那就会出现问题。
因为目前各大网盘给的分享链接都是一个页面,而且大部分还都做了防盗机制,你无法简单的获取真实下载连接!
但是我们可以利用puppeteer来做到!
蓝奏云
lanzou-helper.js
import { sleep } from './index.js';
import puppeteer from "puppeteer";
/**
* 获取蓝奏云真实下载地址
* @param lanzouShareUrl 蓝奏云分享页地址
* @param fileName 蓝奏云分享的文件名(如果不传入filename 意味着是下载分享的是单个文件, 而不是文件夹)
* @returns downUrl 真实下载地址
*/
export const getLanzouDownUrl = async (lanzouShareUrl, fileName) => {
// 启动一个浏览器
const browser = await puppeteer.launch({
headless: 'new',
args: ['--no-sandbox'],
// executablePath: "C:/Users/boringsoft/AppData/Local/Google/Chrome/Application/chrome.exe",
});
// 在浏览器上下文中,创建一个Page对象
const page = await browser.newPage();
let getDownPageUrl = lanzouShareUrl;
if (fileName) {
// Page对象加载一个网址
await page.goto(lanzouShareUrl);
getDownPageUrl = await page.evaluate(({ fileName }) => {
const list = document.querySelectorAll(".minPx-top");
let downPageUrl = "";
for (const it of list) {
const filename = it.querySelector(".filename").innerHTML;
if (filename.indexOf(fileName) > -1) {
downPageUrl = it.href;
break;
}
}
return downPageUrl;
}, { fileName });
}
// Page对象加载一个网址
await page.goto(getDownPageUrl);
const iframeUrl = await page.evaluate(() => {
const ifm = document.querySelector(".n_downlink");
return ifm.src
});
await page.goto(iframeUrl);
await sleep(500);
const downUrl = await page.evaluate(() => {
const aDiv = document.querySelector(".load");
const aButton = aDiv.querySelector('a');
return aButton.href;
});
// 关闭浏览器释放Page
await browser.close();
return downUrl;
};
main.js
const commonRouter = async (ctx, next) => {
}
// 下载 tvbox(测试 文件夹分享的资源下载)
router.get('/tvbox', async (ctx, next) => {
let fileName = '影视仓';
if (ctx.params?.type === 'mobile') {
fileName = '影视仓手机版';
}
const lanzouShareUrl = 'https://qiqi2020.lanzouw.com/b09svqv1c';
const url = await getLanzouDownUrl(lanzouShareUrl, fileName);
// 代理中间件方式 下载蓝奏云连接
ctx.respond = false // 绕过koa内置对象response ,写入原始res对象,而不是koa处理过的response
await koa2Connect(
HttpProxyMiddleware.createProxyMiddleware({
target: url,
changeOrigin: true,
onProxyReq: (proxyReq, req, res) => {
proxyReq.setHeader('accept-language', 'zh-CN,zh;q=0.9');
}
})
)(ctx, next);
await next();
})
// 下载adwars app(测试单个文件分享 下载)
router.get('/adwars', async (ctx, next) => {
const lanzouShareUrl = 'https://lanzoux.com/adWars';
const url = await getLanzouDownUrl(lanzouShareUrl);
await ctx.redirect(url);
})
gitHub Realse
github-helper.js
import axios from 'axios'
/**
* 获取github release真实下载地址
* @param lastVersionInfoUrl github release的信息
* @returns downUrl 真实下载地址
*/
export const getGitHubDownUrl = async (lastVersionInfoUrl) => {
const lastVersionInfo = await axios.get(lastVersionInfoUrl);
const {assets, tag_name} = lastVersionInfo.data;
let downUrl = '';
for(const item of assets) {
// if(item.name === `cfa-${tag_name.substr(1,tag_name.length-1)}-foss-arm64-v8a-release.apk`){
// downUrl = item.browser_download_url;
// }
if(item.name.indexOf(tag_name)){ // 获取最新的资源
downUrl = item.browser_download_url;
}
}
return downUrl;
}
// 下载 lx-music app
router.get('/lxmusic', async (ctx, next) => {
const lastVersionInfoUrl = 'https://api.github.com/repos/lyswhut/lx-music-mobile/releases/latest';
const gitHubDownUrl = await getGitHubDownUrl(lastVersionInfoUrl);
await ctx.redirect(gitHubDownUrl);
})
最后
因为puppeteer是基于无头浏览器实现的,每次请求他都要打开一次浏览器,所以比较吃内存。
如果你想要的资源固定,而且你也不要求实时,为了体验和性能,你可以定时爬取资源 下载到你自己的服务器即可!
利于puppeteer获取网络资源的直链的更多相关文章
- 自己写http获取网络资源和解析json数据
虽然github上有很多开源的,方便的jar报,用起来也很方便,但我们也需要了解其中的原理,如何自己不用第三方jar包来获取网络资源 主要代码如下: 因为联网是耗时的操作,所以需要另开一个线程来执行 ...
- Android开发16——获取网络资源之基础应用
一.项目背景在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据.本博文介绍了获取另一个web项目的资源.有一个web项目,在其WebRoot文件夹下 ...
- 旧瓶新酒-获取网络资源即爬取下载页面内容(图片、html、css、js等)
这个java获取网络资源以前也写过不少 最近用到又重新写了一个,apache.commons.io中的例子就非常好,但是无法对请求进行详细设置 于是大部分照搬,局部替换以设置请求头 如需更加复杂的设置 ...
- 安卓四大组件之activity和获取网络资源之断点续传
Day05 数据存储及多线程断点续传1.数据提交到服务器两种方式的优缺点* GET请求优点:使用非常方便,只需要在url后面组拼数据.缺点:数据在url的后面组拼,不安全.有数据长度限制.* POST ...
- Android 通过URL获取网络资源
1.先在AndroidManifest.xml中注册加入访问因特网服务的权限: <uses-permission android:name="android.permission.IN ...
- OC利用正则表达式获取网络资源(网络爬虫)
在开发项目的过程,很多情况下我们需要利用互联网上的一些数据,在这种情况下,我们可能要写一个爬虫来爬我们所需要的数据.一般情况下都是利用正则表达式来匹配Html,获取我们所需要的数据.一般情况下分以下三 ...
- 记录--java获取网络资源(图片、音频等)保存本地
注:本人开始运行下面报 java.io.FileNotFoundException ,纠结很久后清理tomcat后运行成功 //获取wav文件地址 String vRecordUrl=(request ...
- Android开发之异步获取并下载网络资源-下载图片和下载文本内容
在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图: 下载图片截图 ...
- nodejs:使用puppeteer在服务器中构建一个获取电影电视剧剧集的接口
首先我们看下数据来源: 来源于这个网站:https://z1.m1907.cn/ 可以说这个网站上能找到很多你想看的很多电影或电视剧,最重要的是很多电影电视剧在别的网站是收费的,但是在这里看是免费的, ...
- Pyqt 获取打包二进制文件中的资源
记得有一次打开一个单独exe程序,点击btn中的一个帮助说明按钮,在同级目录下就多出一个help.chm 文件并自动打开. 那这个exe肯定是把help.chm 打包到exe中,当我触发“帮助”按钮的 ...
随机推荐
- Semaphore.release()方法的底层原理
一.release() 方法代码解析 当调用 release() 方法时,实际调用的是 AQS 的 releaseShared(1) 方法.以下是其详细工作流程: public final boole ...
- 在 Idea 中使用 Git
以 git-2.21.0 为例说明安装步骤: 双击 Git-2.21.0-64-bit.exe 点击 Next 设置安装路径 点击 Next 点击 Next 点击 Next,选择默认的编辑器 点击 N ...
- eolinker流程用例步骤之脚本代码[Javascript]:读取多组数据,循环执行同一操作
特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html 场景(一)描述: 在未知有多少会员卡的前提下,对会员卡进 ...
- Python3爬虫批量爬取图片并保存到本地
看新闻的时候忽然发现了一个图片网站,那肯定得爬一下. 网址:https://www.0xu.cn/ 不难发现,qcmn这个路径对应青春美女 右键检查图片地址可见 访问该地址成功访问到了图片 正式开始 ...
- 当数据爆炸遇上SQL Server:优化策略全链路解析
在数据驱动的时代,海量数据冲击下的数据库性能成为系统成败的关键.SQL Server作为企业级数据库的常青树,面对单表亿级数据量时,我们往往陷入分库分表与否的抉择困境. 我们站在SQL Server视 ...
- Debian 12 安装&卸载 MySQL 8.4 教程
MySQL 8.4 安装指南 本指南将详细介绍如何在 Linux (Debian/Ubuntu) 上手动安装 MySQL 8.4,并进行基本配置. MySQL官网 1. 安装前准备 1.1 更新系统并 ...
- 联邦学习图像分类实战:基于FATE与PyTorch的隐私保护机器学习系统构建指南
引言 在数据孤岛与隐私保护需求并存的今天,联邦学习(Federated Learning)作为分布式机器学习范式,为医疗影像分析.金融风控.智能交通等领域提供了创新解决方案.本文将基于FATE框架与P ...
- ceph存储介绍
一.ceph简介 ceph是一个开源的.统一的分布式存储系统,设计初衷是提供较好的性能.可靠性和可扩展性.其中"统一"是说ceph可以一套存储系统同时提供块存储设备.文件系统存储和 ...
- C# 应用程序域
在.NET中,每个应用程序域都是一个独立的执行环境,有自己的安全边界和上下文.当使用AppDomain.ExecuteAssembly方法在一个新的应用程序域中执行一个程序集时,这个程序集将会在新的应 ...
- wireshark 抓包查看包得明文消息
转载注明出处: 最近在进行一些网络消息得定位,发现可以用wireshark查看网络包得消息内容,特此记录 需要注意得是,需要将wireshark更新到最新得版本,如果是老版本有可能不支持. 使用tcp ...