Created
November 22, 2017 16:42
-
-
Save FlyInk13/3a034b65b155898671dbbda81a322fb1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var VK = require('VK-Promise'), // Модуль для работы с ВК (npm i VK-Promise) | |
https = require('https'), | |
fs = require('fs'), | |
peer_id = 2e9 + 69, // Сюда ид диалога (2e9 = 2000000000 = Смещение для chat_id) | |
path = "./" + peer_id + "/", // Путь, куда сохранять | |
vk = VK("access_token"); // Токен | |
fs.mkdir(path, function (err, res) { // Создаем путь для диалога | |
if (err) return console.error("Ошибка создания пути", path, err); | |
console.log("Путь создан", path, res); | |
}); | |
function download(url, dest) { // Скачивание файла через Promise с игнором ошибок и таймаутом соединения | |
return new Promise(function (resolve, reject) { | |
if (fs.existsSync(dest)) // Если существует файл, то пропускаем-с | |
return resolve("Уже существует"); | |
var file = fs.createWriteStream(dest); // Создаем файл | |
function onerror(descr, err) { // При ошибках | |
console.error("Error", dest, descr, err); // Срем в лог | |
fs.unlink(dest, function () { // Удаляем файл | |
resolve(descr); | |
}); | |
} | |
var request = https.get(url, function (response) { // Получаем | |
if (response.statusCode !== 200) // Если статус не 200 (404, 500 и прочие высеры вк) | |
return onerror("statusCode", response.statusCode); | |
response.pipe(file); // Записываем файл | |
file.on('finish', function () { // Если все ОК | |
file.close(resolve); // Закрываем запись | |
}); | |
file.on('error', onerror.bind(this, "FS error")); // При ошибках записи | |
}).on('error', onerror.bind(this, "NET error")); // При ошибках соединения | |
request.on('timeout', onerror.bind(this, "NET timeout")); // При долгом соединении | |
request.setTimeout(8000); // 8 сек ждем | |
}); | |
} | |
(function next(start_from) { | |
console.log("next", start_from); | |
return vk("messages.getHistoryAttachments", { | |
peer_id: peer_id, | |
media_type: "photo", | |
count: 100, // Можно и 200, но тогда https лагать будет | |
start_from: start_from | |
}).then(function (r) { | |
if (!r.items.length) return; // Если пусто, то выходим | |
console.log("next", "loaded", r.items.length); // Показываем сколько загружено | |
return Promise.all( | |
r.items.map(function (a) { // Перебираем все | |
var aid = a.photo.owner_id + "_" + a.photo.id; // ID фото, оно же название файла | |
var url = VK.getAttachmentUrl(a); // Получаем ссылку | |
console.log("Downlod", aid, url); | |
return download(url, path + aid + ".jpg").then(function (r) { // Скачиваем-с | |
console.log("Downlod", aid, r || "OK"); | |
}); | |
}) | |
).then(function () { | |
return next(r.next_from); // Как все скачали - получаем новую партию | |
}); | |
}); | |
})(0).catch(function (e) { | |
console.error("Ошибка", e); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment