背景

比如我想使用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获取网络资源的直链的更多相关文章

  1. 自己写http获取网络资源和解析json数据

    虽然github上有很多开源的,方便的jar报,用起来也很方便,但我们也需要了解其中的原理,如何自己不用第三方jar包来获取网络资源 主要代码如下:  因为联网是耗时的操作,所以需要另开一个线程来执行 ...

  2. Android开发16——获取网络资源之基础应用

    一.项目背景在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据.本博文介绍了获取另一个web项目的资源.有一个web项目,在其WebRoot文件夹下 ...

  3. 旧瓶新酒-获取网络资源即爬取下载页面内容(图片、html、css、js等)

    这个java获取网络资源以前也写过不少 最近用到又重新写了一个,apache.commons.io中的例子就非常好,但是无法对请求进行详细设置 于是大部分照搬,局部替换以设置请求头 如需更加复杂的设置 ...

  4. 安卓四大组件之activity和获取网络资源之断点续传

    Day05 数据存储及多线程断点续传1.数据提交到服务器两种方式的优缺点* GET请求优点:使用非常方便,只需要在url后面组拼数据.缺点:数据在url的后面组拼,不安全.有数据长度限制.* POST ...

  5. Android 通过URL获取网络资源

    1.先在AndroidManifest.xml中注册加入访问因特网服务的权限: <uses-permission android:name="android.permission.IN ...

  6. OC利用正则表达式获取网络资源(网络爬虫)

    在开发项目的过程,很多情况下我们需要利用互联网上的一些数据,在这种情况下,我们可能要写一个爬虫来爬我们所需要的数据.一般情况下都是利用正则表达式来匹配Html,获取我们所需要的数据.一般情况下分以下三 ...

  7. 记录--java获取网络资源(图片、音频等)保存本地

    注:本人开始运行下面报 java.io.FileNotFoundException ,纠结很久后清理tomcat后运行成功 //获取wav文件地址 String vRecordUrl=(request ...

  8. Android开发之异步获取并下载网络资源-下载图片和下载文本内容

    在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图:              下载图片截图   ...

  9. nodejs:使用puppeteer在服务器中构建一个获取电影电视剧剧集的接口

    首先我们看下数据来源: 来源于这个网站:https://z1.m1907.cn/ 可以说这个网站上能找到很多你想看的很多电影或电视剧,最重要的是很多电影电视剧在别的网站是收费的,但是在这里看是免费的, ...

  10. Pyqt 获取打包二进制文件中的资源

    记得有一次打开一个单独exe程序,点击btn中的一个帮助说明按钮,在同级目录下就多出一个help.chm 文件并自动打开. 那这个exe肯定是把help.chm 打包到exe中,当我触发“帮助”按钮的 ...

随机推荐

  1. FastAPI中的依赖注入与数据库事务管理

    title: FastAPI中的依赖注入与数据库事务管理 date: 2025/04/09 00:10:29 updated: 2025/04/09 00:10:29 author: cmdragon ...

  2. symfony Fatal error: Declaration of App\DataFixtures\AppFixtures::load(Doctrine\Common\Persistence

    报错: Fatal error: Declaration of App\DataFixtures\AppFixtures::load(Doctrine\Common\Persistence\Objec ...

  3. 暂时永久免费高配云服务可跑32b模型

    谷歌IDX免费云主机,16核CPU,64G内存,300G硬盘! 需要谷歌账号一个,且能google,无需绑卡. 到手第一时间安装一个ollama+qwen2.5-coder:32b, 无限cursor ...

  4. 代码随想录第八天| Leecode 344. 反转字符串、Leecode 541 反转字符串 II

    Leecode 344 反转字符串 题目链接:https://leetcode.cn/problems/reverse-string/description/ 题目描述 编写一个函数,其作用是将输入的 ...

  5. 代码随想录第三天 | Leecode 203. 移除链表元素、707. 设计链表、206. 翻转链表

    Leecode 203 移除链表元素 题目链接:https://leetcode.cn/problems/remove-linked-list-elements/ 题目描述 给你一个链表的头节点 he ...

  6. 【经验】VScode 远程 SSH 连接 Ubuntu 或 TrueNas 出错,Could not establish connection

    用VScode常常会碰到以下情况,Could not establish connection. 先介绍一下VScode远程连接和终端SSH连接的区别:终端直接用SSH连接时,只需要开启SSH服务,并 ...

  7. 内网私仓全流程搭建记录(一)-Nexus3环境搭建

    1.部署 1)在https://help.sonatype.com/repomanager3/product-information/download中下载对应环境及版本,此处要求3以上版本,本次以& ...

  8. 笔记 - linux子系统更换阿里云镜像源

    平时还是用 windows 多一些, 偶尔会玩一玩 linux, 之前给我一台多年的笔记本装了个 manjaro , 颜值是蛮高的, 就一点也不太熟, 就不想玩了, 还是用子系统, win 有支持 U ...

  9. 如何清理误提交到git的历史大文件?

    前言 哈喽!好久不见~ 最近在思考转型的事情,好久没有更新文章了 不过看到我之前开发的视频剪辑工具 Clipify 收获了不少 star ,让我想起之前画的饼似乎才实现了一点点,所以利用了周末的空闲时 ...

  10. eclipse修改默认的工作空间路径

    搜索Workspaces -->勾选Prompt for workspace on startup