Skip to content

Instantly share code, notes, and snippets.

@FlyInk13
Created November 22, 2017 16:42
Show Gist options
  • Save FlyInk13/3a034b65b155898671dbbda81a322fb1 to your computer and use it in GitHub Desktop.
Save FlyInk13/3a034b65b155898671dbbda81a322fb1 to your computer and use it in GitHub Desktop.
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