利于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中,当我触发“帮助”按钮的 ...
随机推荐
- CountDownLatch的countDown()方法的底层源码
一.CountDownLatch的构造方法 // 创建倒数闩,设置倒数的总数State的值 CountDownLatch doneSignal = new CountDownLatch(N); 二.c ...
- 华为od机考2025A卷真题 -寻找重复代码
题目描述与示例 题目 小明负责维护项目下的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码. 重复代码查找方法:以字符串形式给出两行代码text1,text2(字符串长度1 ...
- jmeter使用正则表达式提取器提取返回值中的数据
场景描述:测试过程中,一个场景经常会调用几个接口,且前后接口之间存在参数传递.前一个接口返回值提取后传给后一个接口使用 操作步骤: 第一步,选中被提取参数的接口请求,依次点击右键-添加-后置处理器-正 ...
- jmeter返回数据重新编码的方法
下图内容为请求后的返回值,红色箭头内容是需要正则处理传参给后面的接口使用 其中==后面的\U0026为未编码内容 而实际能够提交的链接为下图"&" 所以,图1请求后需要先转 ...
- 创建第一个属于自己的JavaWeb小程序吧
需要使用的 技术 工具: idea 2022 开发工具 MySql 5.6 数据库工具 Apache Tomcat 8.5.85 web应用部署工具 主要功能有: 用户登录 用户注册 展示列表 ...
- 2025西安交大集训Day11:排列组合,扩展欧几里得,素数筛,欧拉函数,容斥原理逆元,BSGS,莫比乌斯反演,LUCAS定理
快速幂 快速幂是我们解决中数论问题的基石让我们能以 \(O(logn)\) 的复杂度计算 \(a^n\) 快速幂的思想简单而言就是将 \(n\) 的二进制中所有的 \(1\) 代表的次幂乘起来比如计算 ...
- OneNote Embedded 文件滥用检测
本文分享自天翼云开发者社区<OneNote Embedded 文件滥用检测>,作者:Icecream 攻击技术 在这些网络钓鱼活动中被滥用的OneNote功能是在图片后面隐藏嵌入式文件,诱 ...
- 【工具】Vscode插件推荐(不用谷歌api、支持短句英汉互译、支持查词、支持自动补全、不需要浏览器)
需求: 1)偶尔需要查英文生词: 2)有时候想不起来中文对应的英文: 3)不想回到浏览器打开一堆网页: 4)谷歌翻译挂了. 偶尔需要的需求: 1)短句翻译. 因为谷歌翻译挂了,首先,排除最热门的翻译插 ...
- IDEA问题之“调整IDEA字体大小”
调整IDEA字体大小 1.正常版 2. 远程版
- 字节大模型应用开发框架 Eino 全解(一)|结合 RAG 知识库案例分析框架生态
前言 大家好,这里是白泽,Eino 是字节开源的 Golang 大模型应用开发框架,诸如豆包.扣子等 Agent 应用或工作流都是借助这个框架进行开发. 我将通过<字节大模型应用开发框架 Ein ...