如何在C++程序中借助Windows自带的bitsadmin命令从123云盘(不开通直链或会员)上下载文件
最近,我想发布一个程序,里面想嵌入一些比较大的文件,但是如果直接用资源方式嵌入的话程序的体积就非常大,所以我想用从网上下载的方式获取这些文件。之前我试过很多方式,都没有成功,最后找到了这种方式...
- 准备工作:先了解一下bitsadmin命令的语法,详见官方文档
https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/bitsadmin
简单来说,下载文件就是以下命令:
bitsadmin /transfer 任务名(自己随便取) 文件的网络URL地址 文件将要保存的本地路径(可使用环境变量)
如果是特别大的文件,可以提高优先级:
bitsadmin /transfer 任务名(自己随便取) /priority foreground 文件的网络URL地址 文件将要保存的本地路径(可使用环境变量)
- 第一步:向123云盘上传想要下载的文件,相信大多数朋友都很熟悉,这里不再过多赘述。我已经上传好了一个文件test.txt,如图:
- 第二步:获取文件在123云盘上的真实URL地址
我发现,如果直接点下载,取得的网址是个临时的,不能长期使用,并且在bitsadmin里面没法用
现在有两种方式:
1.直接获取到直链(优点:较快,缺点:不稳定(一定时间后会失效),有一定概率在bitsadmin下载时会有问题)
这里使用一个蓝奏云API解析网站,https://lz.qaiu.top,将蓝奏云分享的网址放在上面就行了
点击下面的"复制链接":
复制上面的 "data",就是文件的直链地址.
2.实时解析(优点:稳定,用bitsadmin下载完全没问题,缺点:相对于方法1慢大概最多五六秒)
我翻到了上面API解析的Github项目地址:netdisk-fast-download
我发现他这有一个API
这个API的使用也非常方便,他也给了详细的介绍,格式如下:
https://lz.qaiu.top/parser?url=文件分享链接&pwd=密码(可空)
举个例子:直接下载文件
https://lz.qaiu.top/parser?url=https://www.123pan.com/s/I6PlVv-Vgti.html
自己尝试发现可以直接放在bitsadmin里面下载
- 第三步:万事俱备,只欠下载
1.将获取到的URL贴进上面的bitsadmin下载语句,如下:
bitsadmin /transfer mDL /priority foreground "https://117-95-171-218.pd1.123pan.cn:30443/download-cdn.123pan.cn/123-679/842d0111/1813787329-0/842d0111878ec75f8e2829c2f0ad22a7/c-m2?v=5&t=1692465408&s=16924654086762a3a6304dcf35fc339048b8ab8607&r=75Z2Z6&bzc=2&bzs=313831333738373332393a31323833323832303a32343a30&filename=test.txt&x-mf-biz-cid=193b6069-4ee0-4ddb-bc6a-575843292db3-63d50b&auto_redirect=0&xmfcid=ab1fbb46-626e-4f2d-8e3f-1bc3b3c8d85f-0-9eed82220" "%USERPROFILE%\Desktop\test.txt"
桌面上成功地出现了test.txt
2.将实时解析的网址贴进上面的bitsadmin下载语句,如下:
bitsadmin /transfer mDL /priority foreground "https://lz.qaiu.top/parser?url=https://www.123pan.com/s/I6PlVv-Vgti.html" "%USERPROFILE%\Desktop\test.txt"
桌面上成功地出现了test.txt
- 第四步:将下载语句加入程序
这个就非常简单了,用system语句就行了
C++:注意反斜杠和引号插入的时候用 " \\ " " \" " 转义
直接用URL:
system("bitsadmin /transfer mDL /priority foreground \"https://117-95-171-218.pd1.123pan.cn:30443/download-cdn.123pan.cn/123-679/842d0111/1813787329-0/842d0111878ec75f8e2829c2f0ad22a7/c-m2?v=5&t=1692465408&s=16924654086762a3a6304dcf35fc339048b8ab8607&r=75Z2Z6&bzc=2&bzs=313831333738373332393a31323833323832303a32343a30&filename=test.txt&x-mf-biz-cid=193b6069-4ee0-4ddb-bc6a-575843292db3-63d50b&auto_redirect=0&xmfcid=ab1fbb46-626e-4f2d-8e3f-1bc3b3c8d85f-0-9eed82220\" \"%USERPROFILE%\\Desktop\\test.txt\" ");
实时解析:
system("bitsadmin /transfer mDL /priority foreground \"https://lz.qaiu.top/parser?url=https://www.123pan.com/s/I6PlVv-Vgti.html\" \"%USERPROFILE%\\Desktop\\test.txt\" ");
问题解决.
- 进阶:将下载语句封装进函数
也不是非常困难,直接放代码:
void DownoladFrom123(const char* WebsiteAddress,const char* Password,const char* Path) //123云盘文件分享外链链接,文件密码(如果没有密码的话加什么都没有影响),文件保存地址 { char ml[99999]; sprintf(ml,"bitsadmin /transfer df123 /priority foreground \"https://lz.qaiu.top/parser?url=%s&pwd=%s\" \"%s\"",WebsiteAddress,Password,Path); system(ml); }
应用示例:
#include<bits/stdc++.h> using namespace std; void DownoladFromLanzou(const char*,const char*,const char*); int main() { DownoladFromLanzou("https://www.123pan.com/s/I6PlVv-Vgti.html","0","%userprofile%\\desktop\\test.txt"); return 0; } void DownoladFromLanzou(const char* WebsiteAddress,const char* Password,const char* Path) //123云盘文件分享外链链接,文件密码(如果没有密码的话加什么都没有影响),文件保存地址 { char ml[99999]; sprintf(ml,"bitsadmin /transfer df123 /priority foreground \"https://lz.qaiu.top/parser?url=%s&pwd=%s\" \"%s\"",WebsiteAddress,Password,Path); system(ml); }
参考资料:(感谢以下文档/文章)
bitsadmin使用方法:
https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/bitsadmin
https://blog.csdn.net/u012206617/article/details/119136825
https://www.likecs.com/show-305506404.html
123云盘URL解析:
https://github.com/qaiu/netdisk-fast-download