Skip to content

Instantly share code, notes, and snippets.

@chamie
Last active October 31, 2017 20:09
Show Gist options
  • Save chamie/8e86b61666226e5df9a2 to your computer and use it in GitHub Desktop.
Save chamie/8e86b61666226e5df9a2 to your computer and use it in GitHub Desktop.
Сохранение альбомов с VK.com (В Контакте) целиком. Открываете страницу альбома и вставляете его в консоль JavaScript. Работает со всеми страницами с URL вида https://vk.com/photos1 (все фотографии пользователя с id = 1) или https://vk.com/album1_136592355 (альбом номер 136592355 пользователя с id = 1). Если альбом «фотографии со стены» скрыт, то…
var offset = parseInt(document.getElementsByClassName("summary")[0].innerText.match("[0-9]+")[0]);//первое (и единственное) число в описании - количество фотографий.
var path = document.location.pathname.split("?")[0];//обрабатываемые пути: vk.com/album... vk.com/photos...
var album = (path.search("photos")==-1)? ("album"+ path.split("/album")[1]) : ("photos"+ path.split("/photos")[1]);
var listPh = [];
var isOpera = !(this.opera === undefined);//в "старой" Опере можно сохранять удобнее, не открывая "простыню" из всех фотографий.
function sendReq(){
var Ajax = new XMLHttpRequest();
Ajax.onreadystatechange=function(){
if(Ajax.readyState === 4 && Ajax.status === 200){
var resp = Ajax.responseText;
resp = resp.split("<!json>")[1].split("<!>")[0]; //нужный кусок начинается с <!json> и кончается <!><!json>
resp = JSON.parse(resp);
console.log("Page "+Math.ceil(offset/10)+") got, processing."); //данные выдаются пакетами по 10 фотографий
var photosProcessed = listPh.length; //запоминаем, с какой позиции будем записывать в итоговый массив текущий пакет данных
for(f=0;f<resp.length;f++){
listPh.push([resp[f].id]);
for (i in resp[f]) //перебираем все свойства вида "..._src" - это ссылки на разные размеры
if(i.split("_")[1]=="src")
listPh[f+photosProcessed].push(resp[f][i]);
} //для просто сохранения нам все размеры не нужны, это задел на будущее
if(offset > 10){
offset-=(offset>9)?10:offset;
//setTimeout(sendReq, 100);
sendReq();
}
else
showList();
}
};
Ajax.open("GET","https://vk.com/al_photos.php?act=show&al=1&direction=-1&list="+album+"&offset="+offset,true);
Ajax.send(); //^--листаем с конца в начало
}
function showList(){
if(isOpera){
var wnd = window.open("");
wnd.document.write("<h1>Откройте боковую панель 'Ссылки', выделите все, кликните правой и нажмите 'Сохранить по ссылке как...'</h1>");
}
else
document.write("<h1>Вы можете сохранить эту страницу целиком вместе с картинками.</h1>");
for(i=0;i<listPh.length;i++)
if(!isOpera)
document.write("<img src='"+(listPh[i][listPh[i].length-1])+"'> ");
else
wnd.document.write("<a href='"+(listPh[i][listPh[i].length-1])+"'>Link №"+i+"</a> ");
}
sendReq();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment