0%

Node.js 将MEGA网盘的指定目录下载并打包成ZIP

Node.js也很适合编写自动化脚本。Node.js的在编写自动化脚本这方面生态不比Python差多少。并且据说相同的代码,Node.js的执行效率要高于Python。Node.js和Python的运行库体积也相差无几。MEGA在PIP和NPM都有现成的封装好的MEGA网盘API。但是经过实测发现Node.js的API相对来说更好使一些。我們把写好的代码放到ReplIt上运行就可以直接下载打包好的ZIP文件了。

我們把生成和运行JS的过程都集中到一个Bash里面,这样方便调用Linux的命令。Node.js调用系统命令比Python要复杂不少,并且有些命令并不能达到想要的效果,例如clear命令。

首先需要从NPM下载安装两个依赖,megajs即为Node.js的MEGA网盘API,compress用来将下载好的文件打成ZIP包。

然后使用cat命令生成这个JS文件,然后使用node命令执行它。

注意在ReplIt上执行完成之后,如果想要下载得到打包好的ZIP文件,要先把打包好的ZIP文件随便重命名一下,从shell里面运行生成、删除、重命名的文件变化虽然会反映到左侧的文件列表中,但是执行文件列表菜单中的“Download as ZIP”之后下载得到的文件是没有这个变化的。

同理,要删除文件的时候,也不宜在脚本中直接删除之前生成的ZIP文件,应该从文件列表中鼠标移到要删除的文件,然后点击右侧三个点的按钮,在菜单中选择Delete来删除。 否则以后下载整个ZIP文件时会发现之前从脚本删除的文件仍然还在。这种情况需要从文件列表中创建这个文件名的文件然后从文件列表中删除之才能去掉。

这已经是在ReplIt上提出了数个月的BUG了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
npm install megajs compressing
rm -f run.js || true
# rm -f pixiv*.zip || true
rm -rf pixiv || true
mkdir pixiv
cat>>run.js<<-EOF
const readline = require('readline');
const mega = require("megajs");
const fs = require("fs");
const compressing = require("compressing");
var y, z = 0;
var email = "", password = "";
var folderToDownload = "Pixiv"; // 改成你需要下载的目录名称。暂时只支持根目录下的一级目录

console.log("+-----------------------------------------------------------+");
console.log("| |");
console.log("| Download Specific Folder From Mega And Pack Up to Zip |");
console.log("| |");
console.log("+-----------------------------------------------------------+");

console.log("ATTENTION: Password will be shown - Do not let any others see");

Date.prototype.format = function (fmt) { //type : 类型 0:时间为秒 1:时间为毫秒
var date = this;
var o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"h+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.\$1, (date.getFullYear() + "").substr(4 - RegExp.\$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.\$1, (RegExp.\$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}

console.log("Input email: ");

// 运行到这里的时候输入邮箱
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

new Promise((resolve, reject) => {
rl.on('line', function(line){
email = line;
rl.close();
resolve();
});
}).then(() => {

console.log("Input password: ");

// 运行到这里的时候输入密码
new Promise((resolve, reject) => {
var rl2 = readline.createInterface({
input: process.stdin,
output: process.stdout
});

//-----将显示输入的密码替换为星号-----//
rl2.stdoutMuted = true;

rl2._writeToOutput = function _writeToOutput(stringToWrite) {
if (rl2.stdoutMuted)
rl2.output.write("*");
else
rl2.output.write(stringToWrite);
};
//----------------------------------//

rl2.on('line', function(line){
password = line;
rl2.close();
resolve();
});
}).then(async () => {

console.clear();

var storage;
console.log("Logging " + email + " in ...");

new Promise((resolve, reject) => {
storage = mega({email: email, password: password}, () => { resolve(); });
}).then(() => {

var folder = storage.root.children.find(x => x.name == folderToDownload);

console.log("To Download " + folderToDownload);
console.log("Total Files: " + folder.children.length);

for (var x in folder.children) {
folder.children[x].download({}, function () {
console.log((Number(z) + 1) + "/" + folder.children.length + " finished");
z++;
if (z >= folder.children.length) {
console.log("begin packing");
compressing.zip.compressDir('pixiv', 'pixiv' + new Date().format("yyyyMMddhhmmss") + '.zip').then(() => {
console.log('Packing complete!!!');
console.log('NOTE: If you want to download from "Download as Zip" in the upper right menu, you must rename this zip file to something else, in the menu next to the zip file, in the file list on the left hand side. Otherwise the zip wont contain the zip you want. This is a ReplIt bug months ago.');
console.log('Zip file wont be deleted by the nodejs script. As the downloaded zip would preserve the zip file just deleted. The previous zip file is strongly suggested to delete manually in the file list on the left hand side.');
console.log('Program ends');
process.exit();
})
.catch(err => {
console.error(err);
});
}
}).pipe(fs.createWriteStream("./pixiv/" + folder.children[x].name));
console.log((Number(x) + 1) + "/" + folder.children.length + " started");
}

});

});
});


EOF
clear
node run.js
rm -f run.js
rm -rf pixiv

代码写好以后,保存为.sh的文件,在Linux控制台输入sh ./保存的bash脚本文件名.sh即可运行,网盘登录邮箱和密码需要自行输入。

注意密码输入没做隐藏,后续还要改进。密码输入完成后会自动清屏。输入的时候谨防被他人看到,导致网盘账号被盗。

代码已经更正,已经将显示输入的密码改为星号,但不影响回车之后提交的密码内容。但是网络数据包里面的密码仍然是明文,要提防数据包被窃取导致的密码泄露。

Buy me a coffee
No.5972 Alipay

Alipay

推进创文常态化 共建文明襄阳城 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 做文明襄阳人 建文明襄阳城 凝聚文明正能量 筑梦千年古襄阳 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 创建全国文明城市 加快建设汉江流域中心城市 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 讲文明 树新风 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 用微笑融化陌生 用文明美化襄阳 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 争当文明使者 播撒文明新风