// ==UserScript==
// @name DownAlbum
// @author indream
// @version 0.17.11.1
// @description Download Facebook (Album & Video), Instagram, Pinterest, Twitter, Ask.fm, Weibo Album.
// @namespace DownAlbum
// @updateURL https://raw.githubusercontent.com/inDream/DownAlbum/master/DownAlbum.meta.js
// @downloadURL https://raw.githubusercontent.com/inDream/DownAlbum/master/DownAlbum.user.js
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @include htt*://*.facebook.com/*
// @include htt*://*.facebook.com/*/*
// @include htt*://instagram.com/*
// @include htt*://*.instagram.com/*
// @include htt*://twitter.com/*
// @include htt*://weibo.com/*
// @include htt*://www.pinterest.com/*
// @include htt*://www.pinterest.*/*
// @include htt*://ask.fm/*
// @exclude htt*://*static*.facebook.com*
// @exclude htt*://*channel*.facebook.com*
// @exclude htt*://developers.facebook.com/*
// @exclude htt*://upload.facebook.com/*
// @exclude htt*://*onnect.facebook.com/*
// @exclude htt*://*acebook.com/connect*
// @exclude htt*://*.facebook.com/plugins/*
// @exclude htt*://*.facebook.com/l.php*
// @exclude htt*://*.facebook.com/ai.php*
// @exclude htt*://*.facebook.com/extern/*
// @exclude htt*://*.facebook.com/pagelet/*
// @exclude htt*://api.facebook.com/static/*
// @exclude htt*://*.facebook.com/contact_importer/*
// @exclude htt*://*.facebook.com/ajax/*
// @exclude htt*://www.facebook.com/places/map*_iframe.php*
// @exclude https://www.facebook.com/xti.php
// @exclude https://*.ak.facebook.com/*
// @exclude https://www.facebook.com/ajax/pagelet/generic.php/*
// @exclude https://www.facebook.com/*/plugins/*
// @exclude https://www.facebook.com/xti.php*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
// ==/UserScript==
var HELPER_LOADING = false;
var log = function(s) {
try {
console.log(s);
} catch(e) {
GM_log(s);
}
};
var dFAinit = function(){
var href = location.href;
var site = href.match(/(facebook|instagram|twitter|pinterest|weibo)\.com|ask\.fm/);
if (document.querySelector('#dFA') || !site) {
return;
}
var k, k2, klass;
if (site[0] == 'instagram.com') {
klass = qS('header div:nth-of-type(2) div span button').parentNode;
k = document.createElement('div');
k.className = klass ? klass.className : '';
} else {
k = document.createElement('li');
}
k2 = k.cloneNode();
k.innerHTML = '<a id="dFA" class="navSubmenu">DownAlbum</a>';
k2.innerHTML = '<a id="dFAsetup" class="navSubmenu">DownAlbum(Setup)</a>';
var t = qS('.uiContextualLayerPositionerFixed ul') || qS('.Dropdown ul') ||
qS('.gn_topmenulist.gn_topmenulist_set ul') || qS('.uiContextualLayer [role="menu"]') ||
qS('.me.dropdown .dropdown-menu') || qS('header div:nth-of-type(2) div');
if(t){
t.appendChild(k); t.appendChild(k2);
k.addEventListener("click", function(){
dFAcore();
});
k2.addEventListener("click", function(){
dFAcore(true);
});
}
if(href.indexOf('facebook.com') > 0){
if (t) {
var pBtn = document.createElement('li');
pBtn.innerHTML = '<a id="photosOf" class="navSubmenu">[FB] Open "Photos of"</a>';
t.appendChild(pBtn);
pBtn.addEventListener('click', photosOfHelper);
}
if(!t && qS('#userNavigation, #logoutMenu')){
// Handle async menu
$('#pageLoginAnchor, #logoutMenu').on('click.dfainit', function(){
setTimeout(dFAinit, 500);
});
}
}else if(href.indexOf('pinterest') > 0){
if(!qS('#dfaButton')){
var t = qS('.infoBar .pull-right, .headerContainer, .centeredWithinWrapper');
klass = 'Button boardFollowUnfollowButton';
t.innerHTML += '<button id="dfaButton" class="' + klass + '"><span class="buttonText">DownAlbum</span></button><button id="dfaSetButton" class="' + klass + '"><span class="buttonText">DownAlbum(Setup)</span></button>';
qS('#dfaButton').addEventListener("click", function(){
dFAcore();
});
qS('#dfaSetButton').addEventListener("click", function(){
dFAcore(true);
});
}
}else if(href.indexOf('ask.fm') > 0){
k = qS('.profileButton').parentNode;
if (k) {
k.innerHTML += '<a class="link-green" onClick="dFAcore();">DownAlbum</a>' +
'<a class="link-green" onClick="dFAcore(true);">DownAlbum(Setup)</a>';
} else {
setTimeout(dFAinit, 300);
}
}
if (location.host.match(/instagram.com|facebook.com/)) {
var o = window.WebKitMutationObserver || window.MutationObserver;
if (o && !window.addedObserver) {
window.addedObserver = true;
var observer = new o(runLater);
observer.observe(document.body, {subtree: true, childList: true});
runLater();
}
}
};
function runLater() {
if (HELPER_LOADING) {
return;
}
clearTimeout(window.addLinkTimer);
window.addLinkTimer = setTimeout(addLink, 300);
}
function addLink() {
dFAinit();
if (location.host.match(/instagram.com/)) {
var k = qSA('article>div:nth-of-type(1), header>div:nth-of-type(1)');
for(var i = 0; i<k.length; i++){
if (k[i].nextElementSibling) {
_addLink(k[i], k[i].nextElementSibling);
}
}
var k = qSA('header');
for(var i = 0; i<k.length; i++){
_addLink(k[i], k[i]);
}
} else if (location.host.match(/facebook.com/)) {
addVideoLink();
}
}
function _addLink(k, target, album) {
var isProfile = (k.tagName == 'HEADER' || k.parentNode.tagName == 'HEADER');
var tParent = target.parentNode;
if (tParent.querySelectorAll('img').length > 2) {
return;
}
var t = k.querySelector('img, video');
if (t) {
var src = parseFbSrc(t.getAttribute("src"));
if (qS('.dLink [href="' + src + '"]')) {
return;
}
var next = isProfile ? target.querySelector('.dLink') :
target.nextElementSibling;
if (next && !album) {
if (next.childNodes[0] &&
next.childNodes[0].getAttribute('href') == src) {
return;
} else {
(isProfile ? target : tParent).removeChild(next);
}
}
}
var albumBtn = location.pathname.indexOf('/p') === 0 ?
k.querySelector('.coreSpriteRightChevron') : false;
if (t && src) {
var link = album ? album : document.createElement('div');
link.className = 'dLink';
link.style.maxWidth = '200px';
var title = '(provided by DownAlbum)';
var html = '<a href="' + src + '" download title="' + title + '">Download';
var num = '';
if (album || albumBtn) {
num = link.innerHTML.match(/\.jpg/g);
num = ' #' + (num ? num.length + 1 : 1);
}
if (src.match('mp4')) {
var poster = t.getAttribute('poster');
html += ' Video' + num + '</a><a href="' + poster +
'" download title="' + title + '">Download Photo' + num + '</a>';
} else {
html += num + '</a>';
}
if (album) {
link.innerHTML += html;
} else {
link.innerHTML = html;
if (isProfile) {
k.appendChild(link);
} else if (target.insertAdjacentElement) {
target.insertAdjacentElement('afterEnd', link);
} else {
if (target.nextSibling) {
tParent.insertBefore(link, target.nextSibling);
} else {
tParent.appendChild(link);
}
}
}
}
if (albumBtn) {
HELPER_LOADING = true;
albumBtn.click();
setTimeout(function() {
_addLink(k, target, link);
}, 300);
} else if (!albumBtn && album) {
while (albumBtn = k.querySelector('.coreSpriteLeftChevron')) {
albumBtn.click();
}
HELPER_LOADING = false;
}
}
function addVideoLink() {
var o = document.querySelectorAll('a[href$="mp4"]' +
'[title="(provided by DownAlbum)"]');
for (var i = 0; i < o.length; i++) {
o[i].parentNode.removeChild(o[i]);
}
var k = document.querySelectorAll('#stream_pagelet a[href*="/videos/"], ' +
'#fbPhotoSnowliftTimestamp a[href*="/videos/"]');
for (var i = 0; i < k.length; i++) {
if (k[i].dataset.loaded) {
continue;
}
k[i].dataset.loaded = 1;
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var e = document.querySelector('a[href*="' +
this.responseURL.replace(location.origin, '') + '"][data-loaded]');
var r = this.response;
var m = r.match(/(hd|sd)_src:"(\w[^"]+)"/img);
for (var j = 0; j < m.length; j++) {
var a = document.createElement('a');
a.href = m[j].slice(8, -1);
a.download = '';
a.target = '_blank';
a.style.padding = '5px';
a.title = '(provided by DownAlbum)';
a.innerHTML = m[j].slice(0, 2).toUpperCase() + '↓';
e.parentNode.appendChild(a);
}
}
xhr.open('GET', k[i].href);
xhr.send();
}
}
function photosOfHelper() {
var userId;
var timeline = qS('#pagelet_timeline_main_column');
try {
if (timeline) {
userId = JSON.parse(timeline.getAttribute('data-gt')).profile_owner;
}
} catch(e) {}
var cover = qS('.coverWrap') || qS('.coverImage');
try {
if (cover && !userId) {
userId = cover.href.match(/set=([\w\d\.]+)/)[1].split('.')[3];
}
} catch(e) {}
if (userId) {
location.href = '/search/' + userId + '/photos-of/intersect';
}
}
var g = {};
function getParent(child, selector){
var target = child;
while(target && !target.querySelector(selector)){
if (target.parentNode && target.parentNode.tagName == 'BODY') {
return target;
}
if (target.parentNode && target.parentNode.querySelector(selector)) {
return target;
} else {
target = target.parentNode;
}
}
return null;
}
function getText(s, html, parent){
var q = parent ? parent.querySelector(s) : qS(s);
var t = 'textContent';
if(q && q.querySelectorAll('br').length){t = 'innerHTML';}
if(q && html && q.querySelectorAll('a').length){t = 'innerHTML';}
return q ? q[t] : "";
}
function getDOM(html){
var doc;
if(document.implementation){
doc = document.implementation.createHTMLDocument('');
doc.documentElement.innerHTML = html;
}else if(DOMParser){
doc = (new DOMParser).parseFromString(html, 'text/html');
}else{
doc = document.createElement('div');
doc.innerHTML = html;
}
return doc;
}
function quickSelect(s){
var method = false;
switch(s){
case /#\w+$/.test(s):
method = 'getElementById'; break;
case /\.\w+$/.test(s):
method = 'getElementsByClassName'; break;
}
return method;
}
function qS(s){var k = document[quickSelect(s) || 'querySelector'](s);return k&&k.length ? k[0] : k;}
function qSA(s){return document[quickSelect(s) || 'querySelectorAll'](s);}
function padZero(str, len) {
str = str.toString();
while (str.length < len) {
str = '0' + str;
}
return str;
}
function parseTime(t){
var d = new Date(t * 1000);
return d.getFullYear() + '-' + padZero(d.getMonth() + 1, 2) + '-' +
padZero(d.getDate(), 2) + ' ' + padZero(d.getHours(), 2) + ':' +
padZero(d.getMinutes(), 2) + ':' + padZero(d.getSeconds(), 2);
}
function parseQuery(s){
var data = {};
var n = s.split("&");
for(var i=0; i<n.length; i++){
var t = n[i].split("=");
data[t[0]] = t[1];
}
return data;
}
function parseFbSrc(s, fb) {
if (fb) {
return s.replace(/s\d{3,4}x\d{3,4}\//g, '');
} else {
return s.replace(/\w\d{3,4}x\d{3,4}\//g, '')
.replace(/c\d+\.\d+\.\d+\.\d+\//, '');
}
}
function getFbid(s){
if (!s || !s.length) {
return false;
}
var fbid = s.match(/fbid=(\d+)/);
if(!fbid){
if(s.match('opaqueCursor')){
var index = s.indexOf('/photos/');
if(index != -1){
fbid = getFbid(s.slice(index + 8));
if(fbid){
return fbid;
}
}
if(!fbid){
fbid = s.match(/\/([0-9]+)\//);
if(!fbid){
fbid = s.match(/([0-9]{5,})/);
}
}
} else if (s.match('&') && !s.match(/photos|videos/)) {
try{
fbid = s.slice(s.indexOf('=') + 1, s.indexOf('&'));
}catch(e){}
return fbid ? fbid : false;
} else {
// id for page's photos / video album
fbid = s.match(/\/(?:photos|videos)(?:\/[\w\d\.-]+)*\/(\d+)/);
}
}
return fbid && fbid.length ? fbid[1] : false;
}
function extractJSON(str) {
// http://stackoverflow.com/questions/10574520/
var firstOpen, firstClose, candidate;
firstOpen = str.indexOf('{', firstOpen + 1);
var countOpen = 0, countClose = 0;
do {
countOpen++;
firstClose = str.lastIndexOf('}');
if (firstClose <= firstOpen) {
return null;
}
countClose = 0;
do {
countClose++;
candidate = str.substring(firstOpen, firstClose + 1);
var res;
try {
res = JSON.parse(candidate);
return res;
} catch (e) {}
try {
res = eval("(" + candidate + ")");
return res;
} catch (e) {}
firstClose = str.substr(0, firstClose).lastIndexOf('}');
} while (firstClose > firstOpen && countClose < 20);
firstOpen = str.indexOf('{', firstOpen + 1);
} while (firstOpen != -1 && countOpen < 20);
}
function createDialog() {
if (qS('#daContainer')) {
qS('#daContainer').style = '';
qS('#stopAjaxCkb').checked = false;
return;
}
var d = document.createElement('div');
var s = document.createElement('style');
s.textContent = '#daContainer {position: fixed; width: 360px; \
top: 20%; left: 50%; margin-left: -180px; background: #FFF; \
padding: 1em; border-radius: 0.5em; line-height: 2em; z-index: 9999;\
box-shadow: 1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);}\
#daHeader {font-size: 1.5rem; font-weight: 700; background: #FFF; \
padding: 1rem 0.5rem; color: rgba(0,0,0,.85); \
border-bottom: 1px solid rgba(34,36,38,.15);} \
#daContent {font-size: 1.2em; line-height: 1.4; padding: .5rem;} \
#daContainer a {cursor: pointer;border: 1px solid black;padding: 10px; \
display: block;} \
#stopAjaxCkb {display: inline-block; -webkit-appearance: checkbox; \
width: auto;}';
document.head.appendChild(s);
d.id = 'daContainer';
d.innerHTML = '<div id="daHeader">DownAlbum</div><div id="daContent">' +
'Status: <span class="daCounter"></span><br>' +
'<label>Stop <input id="stopAjaxCkb" type="checkbox"></label>' +
'<div class="daExtra"></div>' +
'<a class="daOutput">Output</a><a class="daClose">Close</a></div>';
document.body.appendChild(d);
qS('.daClose').addEventListener('click', hideDialog);
qS('.daOutput').addEventListener('click', output);
}
function hideDialog() {
qS('#daContainer').style = 'display: none;';
}
function closeDialog() {
document.body.removeChild(qS('#daContainer'));
}
function output(){
g.photodata.dTime = (new Date()).toLocaleString();
if(location.href.match(/.*facebook.com/)){
document.title = document.title.match(/(?:.*\|\|)*(.*)/)[1];
}
document.title=g.photodata.aName;
if(g.photodata.photos.length>1000 && !g.largeAlbum){
if(confirm('Large amount of photos may crash the browser:\nOK->Use Large Album Optimize Cancel->Continue'))g.photodata.largeAlbum = true;
}
sendRequest({type:'export',data:g.photodata});
}
function initDataLoaded(fbid) {
if (g.dataLoaded[fbid] === undefined) {
g.dataLoaded[fbid] = {};
}
}
function handleFbAjax(fbid) {
var d = g.dataLoaded[fbid];
if (d !== undefined) {
var photos = g.photodata.photos;
var i = g.ajaxLoaded;
if (!photos[i]) {
return true;
}
if (g.urlLoaded[fbid]) {
photos[i].url = g.urlLoaded[fbid];
delete g.urlLoaded[fbid];
}
if (g.commentsList[fbid]) {
photos[i].comments = g.commentsList[fbid];
delete g.commentsList[fbid];
}
photos[i].title = d.title;
photos[i].tag = d.tag;
photos[i].date = d.date;
if (d.video) {
g.photodata.videos.push({
url: d.video
});
}
delete g.dataLoaded[fbid];
delete photos[i].ajax;
if (g.ajaxLoaded + 1 < photos.length) {
g.ajaxLoaded++;
g.ajaxRetry = 0;
}
return true;
}
return false;
}
function handleFbAjaxProfiles(data) {
var profiles = Object.keys(data.profiles);
for (var j = 0; j < profiles.length; j++) {
try {
var p = data.profiles[profiles[j]];
g.profilesList[p.id] = {name: p.name, url: p.uri};
} catch(e) {}
}
}
function handleFbAjaxComment(data) {
try {
var comments = data.comments;
var commentsList = [data.feedbacktarget.commentcount];
var fbid = comments[0].ftentidentifier;
var timeFix = new Date(parseTime(data.servertime)) - new Date();
} catch(e) {
console.log('Cannot parse comment');
return;
}
for (j = 0; j < comments.length; j++){
try {
var c = comments[j];
p = g.profilesList[c.author];
commentsList.push({
fbid: fbid,
id: c.legacyid,
name: p.name,
url: p.url,
text: c.body.text,
date: parseTime(c.timestamp.time)
});
} catch(e) {}
}
g.commentsList[fbid] = commentsList;
g.commentsList.count++;
}
function fbAjax(){
var len=g.photodata.photos.length,i=g.ajaxLoaded;
var src;
try{
src = getFbid(g.photodata.photos[i].href);
}catch(e){
if(i + 1 < len){g.ajaxLoaded++; fbAjax();}else{output();}
return;
}
if (handleFbAjax(src)) {
if(len<50||i%15==0)log('Loaded '+(i+1)+' of '+len+'. (cached)');
g.statusEle.textContent='Loading '+(i+1)+' of '+len+'.';
if(i+1!=len){document.title="("+(i+1)+"/"+(len)+") ||"+g.photodata.aName;fbAjax();
}else{output();}
}else if(!qS('#stopAjaxCkb')||!qS('#stopAjaxCkb').checked){
var xhr = new XMLHttpRequest();
xhr.onload = function() {
clearTimeout(g.timeout);
var r=this.response,htmlBase=document.createElement('html');
var targetJS = [], list = [src];
if (g.isPageVideo) {
r = JSON.parse(r.slice(9));
var k = r.jsmods.instances;
for (var ii = 0; ii < k.length; ii++) {
if (!k[ii] || !k[ii].length || !k[ii][1] || !k[ii][1].length) {
continue;
}
if (k[ii][1][0] === 'VideoConfig') {
var inst = k[ii][2][0].videoData[0];
initDataLoaded(inst.video_id);
g.dataLoaded[inst.video_id].video = inst.hd_src || inst.sd_src;
}
}
g.cursor = r.payload.cursor;
} else {
htmlBase.innerHTML = r.slice(6,-7);
targetJS = htmlBase.querySelectorAll('script');
}
for(var k=0;k<targetJS.length;k++){
var t=targetJS[k].textContent,content=t.slice(t.indexOf('(2, {')+4,t.indexOf('}, true);}')+1);
if(!content.length||t.indexOf('JSONPTransport')<0){continue;}
content=JSON.parse(content);
if (!content.payload || !content.payload.jsmods ||
!content.payload.jsmods.require) {
alert('Autoload failed, go to photo tab and try again.');
return output();
}
var require=content.payload.jsmods.require;
if(require&&(content.id=='pagelet_photo_viewer'||require[0][1]=='addPhotoFbids')){list=require[0][3][0];}
for (var ii = 0; ii < require.length; ii++) {
if (!require[ii] || !require[ii].length) {
continue;
}
if (require[ii].length > 2 && require[ii][0] == 'UFIController') {
var inst = require[ii][3];
if (inst.length && inst[2]) {
handleFbAjaxProfiles(inst[2]);
}
}
}
for (var ii = 0; ii < require.length; ii++) {
if (!require[ii] || !require[ii].length) {
continue;
}
if (require[ii].length > 2 && require[ii][0] == 'UFIController') {
var inst = require[ii][3];
if (inst.length && inst[2].comments && inst[2].comments.length) {
handleFbAjaxComment(inst[2]);
}
}
if (require[ii][1] == 'storeFromData') {
var image = require[ii][3][0].image;
if (image) {
var keys = Object.keys(image);
for (var j = 0; j < keys.length; j++) {
var pid = keys[j];
if (image[pid].url) {
g.urlLoaded[pid] = image[pid].url;
}
}
}
}
}
if (t.indexOf('fbPhotosPhotoTagboxBase') > 0 ||
t.indexOf('fbPhotosPhotoCaption') > 0 ||
t.indexOf('uiContextualLayerParent') > 0) {
var markup = content.payload.jsmods.markup;
for (var ii = 0; ii < markup.length; ii++) {
var test = markup[ii][1].__html;
var h = document.createElement('div');
h.innerHTML = unescape(test);
var box = h.querySelectorAll('.snowliftPayloadRoot');
if (box.length) {
for (var kk = 0; kk < box.length; kk++) {
var c = box[kk].querySelector('.fbPhotosPhotoCaption');
var b = box[kk].querySelector('.fbPhotosPhotoTagboxes');
var a = box[kk].querySelector('abbr');
if (!a) {continue;}
var s = c.querySelector('.hasCaption');
s = !s ? '' : s.innerHTML.match(/<br>|<wbr>/) ?
s.outerHTML.replace(/'/g,'"') : s.textContent;
var tag = b.querySelector('.tagBox');
pid = getFbid(a.parentNode.href);
initDataLoaded(pid);
g.dataLoaded[pid].tag = !tag ? '' : b.outerHTML;
g.dataLoaded[pid].title = s;
g.dataLoaded[pid].date = a ? parseTime(a.dataset.utime) : '';
}
}
// Handle profile / group video cover
box = h.querySelector('.img');
if (h.querySelector('video') && box) {
try {
var bg = box.style.backgroundImage.slice(5, -2);
var file = bg.match(/\/(\w+\.jpg)/)[1];
for (var kk = g.ajaxLoaded; kk < len; kk++) {
var a = g.photodata.photos[kk];
if (a.url.indexOf(file) > 0) {
a.url = bg;
break;
}
}
} catch (e) {}
}
}
}
// Fallback to old comment
var instances = content.payload.jsmods.instances;
for(ii = 0; instances && ii<instances.length; ii++){
if (!instances[ii] || !instances[ii].length ||
!instances[ii][1] || !instances[ii][1].length) {
continue;
}
if (instances[ii][1][0] === 'UFIController') {
inst = instances[ii][2];
if (inst.length && inst[2].comments && inst[2].comments.length) {
handleFbAjaxProfiles(inst[2]);
}
}
}
for(ii = 0; instances && ii<instances.length; ii++){
if (!instances[ii] || !instances[ii].length ||
!instances[ii][1] || !instances[ii][1].length) {
continue;
}
if (instances[ii][1][0] === 'UFIController') {
inst = instances[ii][2];
if (inst.length && inst[2].comments && inst[2].comments.length) {
handleFbAjaxComment(inst[2]);
}
}
if (instances[ii][1][0] === 'VideoConfig') {
inst = instances[ii][2][0].videoData[0];
initDataLoaded(inst.video_id);
g.dataLoaded[inst.video_id].video = inst.hd_src || inst.sd_src;
}
}
}
handleFbAjax(src);
if(len<50||i%15==0)log('Loaded '+(i+1)+' of '+len+'.');
g.statusEle.textContent = 'Loaded ' + (i+1) + ' of ' + len;
if(i+1>=len){
output();
}else{
if (i === g.ajaxLoaded) {
g.ajaxRetry++;
if (g.isPageVideo) {
g.photodata.photos[i].ajax = location.origin +
'/video/channel/view/story/async/' + src + '/?video_ids[0]=' + src;
}
}
if (g.ajaxRetry > 5) {
if (g.ajaxAutoNext) {
g.ajaxRetry = 0;
g.ajaxLoaded++;
} else {
var retryReply = prompt('Retried 5 times.\nTry again->OK\n' +
'Try next photo->Type 1\nAlways try next->Type 2\n' +
'Output loaded photos->Cancel');
if (retryReply !== null) {
g.ajaxRetry = 0;
if (+retryReply === 2){
g.ajaxAutoNext = true;
g.ajaxLoaded++;
} else {
g.ajaxLoaded++;
}
} else {
output();
return;
}
}
}
document.title="("+(i+1)+"/"+(len)+") ||"+g.photodata.aName;fbAjax();
}
};
xhr.onreadystatechange = function() {
if (xhr.readyState == 2 && xhr.status != 200) {
clearTimeout(g.timeout);
g.ajaxLoaded++;
fbAjax();
}
};
if (g.isPageVideo) {
xhr.open('POST', g.photodata.photos[i].ajax +
(g.cursor ? '&cursor=' + g.cursor : ''));
} else {
xhr.open('GET', g.photodata.photos[i].ajax);
}
g.timeout=setTimeout(function(){
xhr.abort();
g.ajaxRetry++;
if(g.ajaxRetry>5){if(confirm('Timeout reached.\nTry again->OK\nOutput loaded photos->Cancel')){g.ajaxRetry=0;fbAjax();}else{output();}}
},10000);
var data = null;
if (g.isPageVideo) {
if (!g.fb_dtsg) {
getFbDtsg();
}
data = '__user=' + g.Env.user + '&__a=1&fb_dtsg=' + g.fb_dtsg;
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
}
xhr.send(data);}else{output();}
}
function getPhotos(){
if(g.start!=2||g.start==3){return;}
var scrollEle = !!(qS('#fbTimelinePhotosScroller *, ' +
'.uiSimpleScrollingLoadingIndicator, .fbStarGrid~img, ' +
'.fbStarGridWrapper~img, #browse_result_below_fold, ' +
'#content_container div > span[aria-busy="true"], ' +
'#pages_video_hub_all_videos_pagelet .uiMorePagerLoader') ||
(!qS('#browse_end_of_results_footer') && qS('#contentArea div.hidden_elem')
&& location.href.match('search')));
if(g.ajaxFailed&&g.mode!=2&&scrollEle){scrollTo(0, document.body.clientHeight);setTimeout(getPhotos,2000);return;}//g.start=3;
var i, photodata = g.photodata, testNeeded = 0, ajaxNeeded = 0;
var elms = g.elms || qS('#album_photos_pagelet') || qS('#album_pagelet') || qS('#static_set_pagelet') || qS('#pagelet_photos_stream') || qS('#group_photoset') || qS('#initial_browse_result') || qS('#contentArea');
var grid = qSA('#fbTimelinePhotosFlexgrid, .fbStarGrid, ' +
'#pages_video_hub_all_videos_pagelet');
var selector = 'a[rel="theater"]';
var tmp = [], tmpE, eLen;
if(g.elms){ajaxNeeded=1;}
else if(grid.length){
if(grid.length>1){
for(eLen = 0; eLen<grid.length; eLen++){
tmpE = grid[eLen].querySelectorAll(g.thumbSelector);
for(var tmpLen = 0; tmpLen<tmpE.length; tmpLen++){
tmp.push(tmpE[tmpLen]);
}
}
elms = tmp; ajaxNeeded=1;
}else{elms=grid[0].querySelectorAll(g.thumbSelector);ajaxNeeded=1;}
}else if(elms){
var temp = elms.querySelectorAll(g.thumbSelector);ajaxNeeded=1;
if(!temp.length){
testNeeded = 1;
tmpE = elms.querySelectorAll(selector);
for(eLen = 0; eLen < tmpE.length; eLen++){
if (tmpE[eLen].querySelector('img')) {
tmp.push(tmpE[eLen]);
}
}
elms = tmp;
}else{
elms = temp;
}
}
else{elms=qSA(selector);testNeeded=1;}
if(qSA('.fbPhotoStarGridElement')){ajaxNeeded=1;}
if (g.isPage) {
if (qS('input[type="file"][accept="image/*"]')) {
g.pageType = 'other';
} else {
g.pageType = 'posted';
}
}
if(g.mode!=2&&!g.lastLoaded&&scrollEle&&(!qS('#stopAjaxCkb')||!qS('#stopAjaxCkb').checked)){
fbAutoLoad(g.isPage && !g.isVideo ? [] : elms);return;
}
for (i = 0;i<elms.length;i++) {
if (testNeeded) {
var test1 = (getParent(elms[i],'.mainWrapper')&&getParent(elms[i],'.mainWrapper').querySelector('.shareSubtext')&&elms[i].childNodes[0]&&elms[i].childNodes[0].tagName=='IMG');
var test2 = (getParent(elms[i],'.timelineUnitContainer')&&getParent(elms[i],'.timelineUnitContainer').querySelector('.shareUnit'));
var test3 = (elms[i].querySelector('img')&&!elms[i].querySelector('img').scrollHeight);
if (test1 || test2 || test3) {
continue;
}
}
try{
var ajaxify = unescape(elms[i].getAttribute('ajaxify')) || '';
var href = ajaxify.indexOf('fbid=') > -1 ? ajaxify : elms[i].href;
var isVideo = (href.indexOf('/videos/') > -1 || g.isVideo);
var parentSrc = elms[i].parentNode ?
elms[i].parentNode.getAttribute('data-starred-src') : '';
var bg = !isVideo ? elms[i].childNodes[0] :
elms[i].querySelector(g.isPage ? 'img' : 'div[style], .uiVideoLinkImg');
var src = bg ? bg.getAttribute('src') : '';
if (src) {
if (src.indexOf('rsrc.php') > 0) {
src = '';
} else if (src && src.indexOf('?') === -1) {
src = parseFbSrc(src);
}
}
bg = bg && bg.style ? (bg.style.backgroundImage || '').slice(5, -2) : '';
var url = src || parentSrc || bg;
var ohref = href + '';
var fbid = getFbid(href);
if(href.match('opaqueCursor')){
if(fbid){
href = location.origin + '/photo.php?fbid=' + fbid;
}else{
continue;
}
}else if(href.match('&')){
href=href.slice(0, href.indexOf('&'));
}
if(!g.downloaded[fbid]){g.downloaded[fbid]=1;}else{continue;}
var ajax = '';
if (!g.notLoadCm && !isVideo) {
var q = {};
if (url.indexOf('&src') != -1) {
ajax = url.slice(url.indexOf("?")+1,url.indexOf("&src")).split("&");
url = parseFbSrc(url.match(/&src.(.*)/)[1]).replace(/&smallsrc=.*\?/, '?', true);
} else {
ajax = ohref.slice(ohref.indexOf('?') + 1).split('&');
var pset = ohref.match(/\/photos\/([\.\d\w-]+)\//);
if (pset) {
q = {set: pset[1]};
}
}
for(var j=0;j<ajax.length;j++){var d=ajax[j].split("=");q[d[0]]=d[1];}
if(!q.fbid && fbid){
q.fbid = fbid;
}
ajax = location.origin + '/ajax/pagelet/generic.php/' +
'PhotoViewerInitPagelet?ajaxpipe=1&ajaxpipe_token=' +
g.Env.ajaxpipe_token + '&no_script_path=1&data=' + JSON.stringify(q)+
'&__user=' + g.Env.user + '&__a=1&__adt=2';
} else if (!g.notLoadCm && isVideo) {
if (g.isPage) {
if (i === 0) {
ajax = location.origin + '/video/channel/view/story/async/' + fbid +
'/?video_ids[0]=' + fbid;
} else {
ajax = location.origin + '/video/channel/view/async/' + g.pageId +
'/?story_count=20&original_video_id=' +
getFbid(photodata.photos[photodata.photos.length - 1].href);
}
} else {
var id = href.match(/\/videos\/([\w+\d\.-]+)\/(\d+)/);
var q = {
type: 3,
v: id[2],
set: id[1]
};
ajax = location.origin + '/ajax/pagelet/generic.php/' +
'PhotoViewerInitPagelet?ajaxpipe=1&ajaxpipe_token=' +
g.Env.ajaxpipe_token + '&no_script_path=1&data=' + JSON.stringify(q) +
'&__user=' + g.Env.user + '&__a=1&__adt=2';
}
}
if(url.match(/\?/)){
var b=url.split('?'), t='', a=b[1].split('&');
for(var ii=0;ii<a.length;ii++){
if(a[ii].match(/oh|oe|__gda__/))t+=a[ii]+'&';
}
url = b[0] + (t.length?('?'+t.slice(0, -1)):'');
} else if (url.indexOf('&') > 0) {
url = url.slice(0, url.indexOf('&'));
}
var title = elms[i].getAttribute('title') || (elms[i].querySelector('img') ?
elms[i].querySelector('img').getAttribute('alt') : '') || '';
title=title.indexOf(' ')>0?title:'';
title=title.indexOf(': ')>0||title.indexOf(': ')>0?title.slice(title.indexOf(' ')+1):title;
if(!title){
t=getParent(elms[i],'.timelineUnitContainer')||getParent(elms[i],'.mainWrapper');
if(t){var target1=t.querySelectorAll('.fwb').length>1?'':t.querySelector('.userContent');}
var target2=elms[i].getAttribute('aria-label')||'';
if(target2){title=target2;}
if(title===''&&target1){title=target1.innerHTML.match(/<br>|<wbr>/)?target1.outerHTML.replace(/'/g,'"'):target1.textContent;}
}
var newPhoto={url: url, href: href};
newPhoto.title=title;
if (elms[i].dataset.date) {
newPhoto.date = parseTime(elms[i].dataset.date);
}
if(!g.notLoadCm)newPhoto.ajax=ajax;
photodata.photos.push(newPhoto);
}catch(e){log(e);}
}
if(qS('#stopAjaxCkb')&&qS('#stopAjaxCkb').checked){qS('#stopAjaxCkb').checked=false;}
log('export '+photodata.photos.length+' photos.');
if(!g.notLoadCm){
if (ajaxNeeded && (g.loadCm || confirm("Try to load photo's caption?"))) {
g.elms = null;
fbAjax();
} else {output();}
}else{output();}
}
function getFbMessagesPhotos() {
if (!g.offset) {
g.ajaxRetry = {};
g.offset = 0;
g.photodata.aName = getText('.fb_content [role="main"] h2');
g.photodata.aDes = '';
getFbDtsg();
var headers = qSA('[role="gridcell"], [id^="row_header_id_user:"]');
var rows = [];
for (var i = 0; i < headers.length; i++) {
rows.push({e: headers[i], len: headers[i].parentNode.className.length});
}
rows.sort(function(a, b) {
return a.len > b.len ? -1 : a.len === b.len ? 0 : 1;
});
g.threadId = rows[0].e.id.split(':')[1];
}
var url = location.origin + '/ajax/messaging/attachments/sharedphotos.php';
var data = 'thread_id='+g.threadId+'&offset='+g.offset+'&limit=30&__user='+g.Env.user+'&__a=1&__req=7&fb_dtsg='+g.fb_dtsg;
var xhr = new XMLHttpRequest();
xhr.onload = function(){
var elms = g.elms.length ? g.elms : [];
var payload = JSON.parse(this.response.slice(9)).payload;
if(payload.imagesData){
elms = elms.concat(payload.imagesData);
if(elms.length){
g.elms = elms;
if(payload.moreImagesToLoad){
g.offset += 30;
getFbMessagesPhotos();
}else{
fbAjaxAttachment();
}
}else{
alert('No photo attachments found.');
}
}
};
xhr.open('POST', url);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(data);
}
function fbAjaxAttachment(){
var len = g.elms.length, i = g.ajaxLoaded;
if(len && len > g.photodata.photos.length){
var elms = g.elms[i];
var fbid = elms.fbid;
if(!g.ajaxRetry[fbid]){
g.ajaxRetry[fbid] = 0;
}
if(!g.dataLoaded[fbid] && g.ajaxRetry[fbid]<3){
g.ajaxRetry[fbid]++;
var xhr = new XMLHttpRequest();
xhr.onload = function(){
var output = JSON.parse(JSON.parse(this.response.slice(9)).payload.output);
var images = output[g.threadId].message_images.edges
for(var i = 0; i < images.length; i++){
g.dataLoaded[images[i].node.id] = 1;
g.photodata.photos.push({
href: '',
url: images[i].node.image2.uri
});
}
g.ajaxLoaded++;
fbAjaxAttachment();
};
xhr.open('POST', location.origin + '/ajax/graphql/query/');
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var after = i > 0 ? ('¶ms[after]=' + g.elms[i - 1].fbid) : '';
var data = 'queryName=MESSAGE_THREAD_IMAGES_FIRST'+after+'¶ms[first]=19¶ms[thread_id]='+g.threadId+'&__user='+g.Env.user+'&__a=1&__req=7&fb_dtsg='+g.fb_dtsg;
xhr.send(data);
}else{
if(g.ajaxRetry[fbid] > 3){
g.photodata.photos.push({
href: '',
url: elms.url
});
}
g.ajaxLoaded++;
fbAjaxAttachment();
}
}else if(g.photodata.photos.length){
output();
}
}
function getQL(type, target, key) {
if (g.pageType === 'album') {
if (!g.elms.length && !g.ajaxStartFrom) {
return 'Query PhotoAlbumRoute {node(' + g.pageAlbumId +
') {id,__typename,@F8}} QueryFragment F0 : Photo {album {' +
'album_type,id},can_viewer_edit,id,owner {id,__typename}} ' +
'QueryFragment F1 : Photo {can_viewer_delete,id} QueryFragment F2 : ' +
'Feedback {does_viewer_like,id} QueryFragment F3 : Photo {id,album {' +
'id,name},feedback {id,can_viewer_comment,can_viewer_like,likers {' +
'count},comments {count},@F2}} QueryFragment F4 : Photo {' +
'can_viewer_edit,id,image as _image1LP0rd {uri},url,modified_time,' +
'message {text},@F0,@F1,@F3} QueryFragment F5 : Node {id,__typename}' +
' QueryFragment F6 : Album {can_upload,id} QueryFragment F7 : Album' +
' {id,media.first(28) as ' + key + ' {edges {node {__typename,@F4,' +
'@F5},cursor},page_info {has_next_page,has_previous_page}},owner {' +
'id,__typename},@F6} QueryFragment F8 : Album {can_edit_caption,' +
'can_upload,id,media.first(28) as ' + key + ' {edges {node {' +
'__typename,@F4,@F5},cursor},page_info {has_next_page,' +
'has_previous_page}},message {text},modified_time,owner {' +
'id,name,__typename},@F6,@F7}';
}
return 'Query ' + type + ' {node('+ g.pageAlbumId +
') {@F6}} QueryFragment F0 : Photo {album {album_type,id},' +
'can_viewer_edit,id,owner {id,__typename}} QueryFragment F1 : ' +
'Photo {can_viewer_delete,id} QueryFragment F2 : Feedback ' +
'{does_viewer_like,id} QueryFragment F3 : Photo {id,album {id,name},' +
'feedback {id,can_viewer_comment,can_viewer_like,likers {count},' +
'comments {count},@F2}} QueryFragment F4 : Photo {can_viewer_edit,id,' +
'image as _image1LP0rd {uri},url,modified_time,message {text},' +
'@F0,@F1,@F3} QueryFragment F5 : Node ' +
'{id,__typename} QueryFragment F6 : ' + target +
'.first(28) as ' + key +' {edges {node {__typename,@F4,@F5},cursor},' +
'page_info {has_next_page,has_previous_page}}}';
} else {
if (g.pageType === 'other' && !g.elms.length && !g.ajaxStartFrom) {
return 'Query MediaPageRoute {node(' + g.pageId + ') {id,__typename,' +
'@F5}} QueryFragment F0 : Photo {album {album_type,id},' +
'can_viewer_edit,id,owner {id,__typename}} QueryFragment F1 : ' +
'Photo {can_viewer_delete,id} QueryFragment F2 : Feedback {' +
'does_viewer_like,id} QueryFragment F3 : Photo {id,album {id,name}' +
',feedback {id,can_viewer_comment,can_viewer_like,likers {count},' +
'comments {count},@F2}} QueryFragment F4 : Photo {can_viewer_edit,' +
'id,image as _image1LP0rd {uri},url,modified_time,message {text},' +
'@F0,@F1,@F3} QueryFragment F5 : Page {id,photos_by_others.first(28)' +
' as _photos_by_others4vtdVT {count,edges {node {id,@F4},cursor}, ' +
'page_info {has_next_page,has_previous_page}}}';
}
return 'Query ' + type + ' {node(' + g.pageId +
') {@F3}} QueryFragment F0 : Feedback {does_viewer_like,id} ' +
'QueryFragment F1 : Photo {id,album {id,name},feedback ' +
'{id,can_viewer_comment,can_viewer_like,likers {count},' +
'comments {count},@F0}} QueryFragment F2 : Photo {image' +
' as _image1LP0rd {uri},url,id,modified_time,message {text},@F1} ' +
'QueryFragment F3 : ' + target + '.first(28) as ' + key + ' {edges {' +
'node {id,@F2},cursor},page_info {has_next_page,has_previous_page}}}';
}
}
function fbLoadPage() {
var xhr = new XMLHttpRequest();
var key, type, target;
switch (g.pageType) {
case 'album':
key = '_media1xY4vu';
type = 'PagePhotosTabAlbumPhotosGrid_react_AlbumRelayQL';
target = 'Album {id,media' + (g.elms.length || g.last_fbid ?
('.after(' + g.last_fbid + ')') : '');
break;
case 'other':
key = '_photos_by_others4vtdVT';
type = 'PagePhotosTabPostByOthersPhotoGrids_react_PageRelayQL';
target = 'Page {id,photos_by_others' + (g.elms.length || g.last_fbid ?
('.after(' + g.last_fbid + ')') : '');
break;
case 'posted':
default:
key = '_posted_photos1B25GG';
type = 'PagePhotosTabAllPhotosGrid_react_PageRelayQL';
target = 'Page {id,posted_photos' + (g.elms.length || g.last_fbid ?
('.after(' + g.last_fbid + ')') : '');
}
xhr.onload = function() {
var r = extractJSON(this.responseText);
var d = r.q0.response[g.pageAlbumId || g.pageId][key];
var images = d.edges, img, e = [];
var doc = document.createElement('div');
for (var i = 0; i < images.length; i++) {
img = images[i].node;
doc.innerHTML = '<a href="' + img.url + '" rel="theater" data-date="' +
img.modified_time + '"><img src="' + img._image1LP0rd.uri + '" alt="' +
(img.message ? img.message.text : '') + '"></a>';
e.push(doc.childNodes[0].cloneNode(true));
g.last_fbid = images[i].cursor || img.id;
}
g.elms = g.elms.concat(e);
if (g.pageType === 'album' && images.length) {
g.photodata.aName = images[0].node.album.name;
}
g.statusEle.textContent = 'Loading album... (' + g.elms.length + ')';
document.title = '(' + g.elms.length + ') ||' + g.photodata.aName;
if (d.page_info && d.page_info.has_next_page && !qS('#stopAjaxCkb').checked) {
setTimeout(fbLoadPage, 1000);
} else {
console.log('Loaded ' + g.elms.length + ' photos.');
g.lastLoaded = 1;
setTimeout(getPhotos, 1000);
}
}
xhr.open('POST', location.origin + '/api/graphqlbatch/');
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
var q = JSON.stringify({q0 : {
priority: 0,
q: getQL(type, target, key),
query_params: {}
}});
var data = '__user=' + g.Env.user + '&method=GET&response_format=json' +
'&fb_dtsg=' + g.fb_dtsg + '&batch_name=' + type + '&queries=' + q;
xhr.send(data);
}
function getFbDtsg() {
var s = qSA('script');
for (var i = 0; i < s.length; i++) {
if (s[i].textContent.indexOf('DTSGInitialData') > 0) {
s = s[i].textContent;
break;
}
}
s = s.slice(s.indexOf('DTSGInitialData'));
s = s.slice(0, s.indexOf('}')).split('"');
if (!s.length || !s[4]) {
fbAutoLoadFailed();
return;
}
g.fb_dtsg = s[4];
}
function fbAutoLoadFailed(){
if(confirm('Cannot load required variable, refresh page to retry?')){
location.reload();
}else{
g.lastLoaded=1;getPhotos();
}
}
function fbAutoLoad(elms){
var l; if(g.ajaxStartFrom){
elms = [];
g.elms = [];
l = g.ajaxStartFrom;
} else if (elms.length) {
for (var i = elms.length - 1; i > elms.length - 5 && !l; i--) {
l = getFbid(elms[i].getAttribute('ajaxify')) || getFbid(elms[i].href);
}
if(!l){
alert("Autoload failed!");g.lastLoaded=1;getPhotos();
return;
}
}
var ajaxAlbum = '', targetURL, tab, pType;
if(!g.last_fbid){
g.last_fbid = l;
}else if(g.last_fbid==l){
if(g.ajaxRetry<5 && elms.length > 2){l=elms[elms.length-2].href;l=l.slice(l.indexOf('=')+1,l.indexOf('&'));g.ajaxRetry++;}
else if(confirm('Reaches end of album / Timeouted.\nTry again->OK\nOutput loaded photos->Cancel')){g.ajaxRetry=0;}else{g.lastLoaded=1;getPhotos();return;}
}else{
g.last_fbid=l;
}
var p = location.href + '&';
var isAl = p.match(/media\/set|media|set=a/)
var aInfo = {};
var isPS = p.match(/photos_stream/);
var isGp = p.match(/group/);
var isGraph = p.match(/search/);
if (g.isPage && !g.isVideo) {
if (!g.pageId){
fbAutoLoadFailed();
return;
}
if (p.match(/album_id=/)) {
p = qS('.uiMediaThumb, [data-token] a');
if (!p) {
return fbAutoLoadFailed();
}
p = p.getAttribute('href').match(/a\.[\.\d]+/g);
g.pageType = 'album';
g.pageAlbumId = p[p.length - 1].split('.')[1];
}
getFbDtsg();
g.elms = [];
return fbLoadPage();
}
if (g.isPage) {
if (!g.cursor) {
var s = qSA('script');
for (var i = 0; i < s.length; i++) {
if (s[i].textContent.indexOf('cursor') > 0) {
s = s[i].textContent;
break;
}
}
var cursor = null;
try {
cursor = extractJSON(s);
var idx = cursor.jscc_map.indexOf('Pagelet');
g.cursor = extractJSON(cursor.jscc_map.slice(idx));
} catch (e) {}
if (!cursor) {
return fbAutoLoadFailed();
}
}
} else if (isGp) {
p = elms[0].href.match(/g\.(\d+)/)[1];
aInfo = {
scroll_load: true,
last_fbid: l,
fetch_size: 120,
group_id: p,
filter: g.isVideo ? 'videos' : 'photos'
};
}else if (isAl){
if (!g.isPage) {
p = p.match(/set=([\w+\.\d]*)&/) || p;
p = p.length ? p[1] : p.slice(p.indexOf('=')+1,p.indexOf('&'));
aInfo={"scroll_load":true,"last_fbid":l,"fetch_size":32,"profile_id":+p.slice(p.lastIndexOf('.')+1),"viewmode":null,"set":p,"type":"1"};
}
var token = qS("div[aria-role='tabpanel']");
if (token && token.id) {
token = token.id.split("_")[4];
var user = token.split(':')[0];
var tnext = qS('.fbPhotoAlbumTitle').nextSibling;
var isCollab = tnext && tnext.className != 'fbPhotoAlbumActions' &&
tnext.querySelectorAll('[data-hovercard]').length > 1;
if (location.href.match(/collection_token/) || isCollab || g.isVideo) {
aInfo.collection_token = token;
aInfo.profile_id = user;
}
}
if (g.isVideo) {
p = qS('#pagelet_timeline_medley_photos a[aria-selected="true"]');
var lst = parseQuery(unescape(p.getAttribute('href')).split('?')[1]);
aInfo.cursor = '0';
aInfo.tab_key = 'media_set';
aInfo.type = '2';
aInfo.lst = lst.lst;
}
}else if(isGraph){
var query = {};
if(!g.query){
var s=qSA("script"), temp=[];
for(var i=0;i<s.length;i++){
if (s[i].textContent.indexOf('encoded_query') > 0) {
temp[0] = s[i].textContent;
}
if(s[i].textContent.indexOf('cursor:"') > 0) {
temp[1] = s[i].textContent;
}
}
query = temp[0];
var cursor = temp[1];
query = extractJSON(query);
cursor = extractJSON(cursor);
if (!query || !cursor) {
fbAutoLoadFailed();
return;
}
var rq = query.jsmods.require;
for(i=0; i<rq.length; i++){
if(rq[i][0] == "BrowseScrollingPager"){
query = rq[i][3][1];
break;
}
}
rq = cursor.jsmods.require;
for(i=0; i<rq.length; i++){
if(rq[i][0] == "BrowseScrollingPager"){
cursor = rq[i][3][0].cursor;
break;
}
}
query.cursor = cursor;
query.ads_at_end = false;
g.query = query;
}else{
query = g.query;
query.cursor = g.cursor;
}
aInfo = query;
}else if(!g.newL){
var ele = qS('#pagelet_timeline_main_column');
if (ele) {
p = JSON.parse(ele.dataset.gt).profile_owner;
} else if (ele = qS('#pagesHeaderLikeButton [data-profileid]')) {
p = ele.dataset.profileid;
} else {
alert('Cannot get profile id!');
return;
}
aInfo={"scroll_load":true,"last_fbid":l,"fetch_size":32,"profile_id":+p,"tab_key":"photos"+(isPS?'_stream':''),"sk":"photos"+(isPS?'_stream':'')};
} else if (!ajaxAlbum) {
p = qS('#pagelet_timeline_medley_photos a[aria-selected="true"]');
if (!p) {
return alert('Please go to photos tab or album.');
}
var lst = unescape(p.getAttribute('href')).split('?')[1];
if (!lst) {
return fbAutoLoadFailed();
}
lst = parseQuery(lst);
p = p.getAttribute('aria-controls').match(/.*_(.*)/)[1];
var userId = p.match(/(\d*):.*/)[1];
tab = +p.split(':')[2];
if(qS('.hidden_elem .fbStarGrid')){
var t=qS('.hidden_elem .fbStarGrid');t.parentNode.removeChild(t);getPhotos();return;
}
if (!g.cursor) {
var s = qSA('script');
for (i = 0; i < s.length; i++) {
if (s[i].textContent.indexOf('MedleyPageletRequestData') > 0) {
try {
rq = extractJSON(s[i].textContent).jsmods.require;
rq.forEach(function(e) {
if (e && e[0] === 'MedleyPageletRequestData') {
g.pageletToken = e[3][0].pagelet_token;
}
})
} catch (e) {}
} else if (s[i].textContent.indexOf('enableContentLoader') > 0) {
try {
rq = extractJSON(s[i].textContent).jsmods.require;
rq.forEach(function(e) {
if (e && e[1] === 'enableContentLoader') {
g.cursor = e[3][2];
}
});
} catch (e) {}
}
}
if (!g.cursor || !g.pageletToken) {
alert('Cannot get cursor for auto load!');
}
}
aInfo = {
collection_token: p,
cursor: g.cursor,
disablepager: false, overview: false,
profile_id: userId,
pagelet_token: g.pageletToken,
tab_key: tab === 5 ? 'photos' : 'photos_of',
lst: lst.lst,
ftid: null, order: null, sk: 'photos', importer_state: null
};
}
if (g.isPage) {
ajaxAlbum = location.origin + '/ajax/pagelet/generic.php/' +
'PagesVideoHubVideoContainerPagelet?data=' +
escape(JSON.stringify(g.cursor)) + '&__user=' + g.Env.user + '&__a=1';
} else if (isGraph) {
ajaxAlbum = location.origin + '/ajax/pagelet/generic.php/' +
'BrowseScrollingSetPagelet?data=' + escape(JSON.stringify(aInfo)) +
'&__user=' + g.Env.user + '&__a=1';
}else if(!g.newL || isGp || isAl){
targetURL = isGp ? 'GroupPhotoset' : (g.isVideo ? 'TimelinePhotoSet' :
'TimelinePhotos' + (isAl ? 'Album' : (isPS ? 'Stream' : '')));
ajaxAlbum = location.origin + '/ajax/pagelet/generic.php/' + targetURL +
'Pagelet?ajaxpipe=1&ajaxpipe_token=' + g.Env.ajaxpipe_token +
'&no_script_path=1&data=' + JSON.stringify(aInfo) + '&__user=' +
g.Env.user + '&__a=1&__adt=2';
}else{
var req = 5+(qSA('.fbStarGrid>div').length-8)/8*2
tab=qSA('#pagelet_timeline_medley_photos a[role="tab"]');
pType = +p.split(':')[2];
targetURL = "";
switch(pType){
case 4: targetURL = 'TaggedPhotosAppCollection'; break;
case 5: targetURL = 'AllPhotosAppCollection'; break;
case 70: targetURL = "UntaggedPhotosAppCollection";
cursor = btoa('0:not_structured:'+l);
aInfo = {"collection_token": p, "cursor": cursor, "tab_key": "photos_untagged","profile_id": +userId,"overview":false,"ftid":null,"sk":"photos"}; break;
}
ajaxAlbum = location.origin + '/ajax/pagelet/generic.php/' + targetURL+
'Pagelet?data=' + escape(JSON.stringify(aInfo)) + '&__user=' +
g.Env.user+'&__a=1';
}
var xhr = new XMLHttpRequest();
xhr.onload = function(){
clearTimeout( g.timeout );
if(this.status!=200){
if(!confirm('Autoload failed.\nTry again->OK\nOutput loaded photos->Cancel')){g.lastLoaded=1;}getPhotos();return;
}
var r=this.response,htmlBase=document.createElement('html');
var newL = r.indexOf('for')==0;
var eCount = 0, e, old;
if(!newL){
htmlBase.innerHTML=r.slice(6,-7);
var targetJS=htmlBase.querySelectorAll('script');
for(var k=0;!newL && k<targetJS.length;k++){
var t=targetJS[k].textContent,content=t.slice(t.indexOf(', {')+2,t.indexOf('}, true);}')+1);
if(!content.length||t.indexOf('JSONPTransport')<0){continue;}
content=JSON.parse(content);
var d=document.createElement('div');
d.innerHTML=content.payload.content.content;
e=d.querySelectorAll(g.thumbSelector);
if(!e||!e.length)continue;
eCount+=e.length;
old=elms?Array.prototype.slice.call(elms,0):'';
g.elms=old?old.concat(Array.prototype.slice.call(e,0)):e;
}
}else{
r = JSON.parse(r.slice(9));
htmlBase.innerHTML = r.payload;
var e = [], temp = [];
if(g.query){
temp = htmlBase.querySelectorAll('a[rel="theater"]');
for(k = 0; k < temp.length; k++){
if (temp[k].querySelector('img')) {
e.push(temp[k]);
}
}
temp = [];
if(e.length)g.cursor = parseQuery(e[e.length-1].href).opaqueCursor;
}else{
e = htmlBase.querySelectorAll(g.thumbSelector);
if (g.pageletToken) {
g.cursor = '';
r.jsmods.require.forEach(function(e) {
if (e && e[1] === 'enableContentLoader') {
g.cursor = e[3][2];
}
});
if (!g.cursor) {
g.lastLoaded = 1;
}
}
}
var map = {};
for (k = 0; k < e.length; k++) {
var href = unescape(e[k].getAttribute('ajaxify')) || e[k].href;
if (!map[href]) {
map[href] = 1;
temp.push(e[k]);
}
}
e = temp;
eCount+=e.length;
old=elms?Array.prototype.slice.call(elms,0):'';
g.elms=old?old.concat(Array.prototype.slice.call(e,0)):e;
}
if (g.isPage) {
if (r.jscc_map) {
g.cursor = extractJSON(r.jscc_map.slice(r.jscc_map.indexOf('Pagelet')));
} else {
g.lastLoaded = 1;
g.cursor = '';
}
}
g.statusEle.textContent = 'Loading album... (' + g.elms.length + ')';
document.title='('+g.elms.length+') ||'+g.photodata.aName;
if(!eCount){console.log('Loaded '+g.elms.length+' photos.');g.lastLoaded=1;}
if (g.ajaxStartFrom) {
g.ajaxStartFrom = false;
}
setTimeout(getPhotos,1000);
};
xhr.open("GET", ajaxAlbum);
g.timeout=setTimeout(function(){
xhr.abort();
if(g.ajaxRetry>5){if(confirm('Timeout reached.\nTry again->OK\nOutput loaded photos->Cancel')){g.ajaxRetry=0;}else{g.lastLoaded=1;}}getPhotos();
},10000);
xhr.send();
}
function instaAjax(){
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var total=g.total, photodata=g.photodata,
res=JSON.parse(this.response),elms=res.items;
if(elms[0].id.indexOf('_')<0)elms=elms[3];
g.ajax=res.more_available?elms[elms.length-1].id:null;
for(var i=0;i<elms.length;i++){
var url = parseFbSrc(elms[i].images.standard_resolution.url);
var c = elms[i].comments, cList = [c.count];
for(var k=0; k<c.data.length; k++){
var p = c.data[k];if(p){
cList.push({name: p.from.full_name || p.from.username, url: 'http://instagram.com/'+p.from.username, text: p.text, date: parseTime(p.created_time), id: elms[i].link});}
}
if(elms[i].videos){
photodata.videos.push({
url: elms[i].videos.standard_resolution.url,
thumb: url
});
}
photodata.photos.push({
title: elms[i].caption?elms[i].caption.text:'',
url: url,
href: elms[i].link,
date: elms[i].created_time?parseTime(elms[i].created_time):'',
comments: c.count?cList:''
});
}
log('Loaded '+photodata.photos.length+' of '+total+' photos.');
g.statusEle.textContent='Loaded '+g.photodata.photos.length+' / '+total;
document.title="("+g.photodata.photos.length+"/"+total+") ||"+g.photodata.aName;
if(qS('#stopAjaxCkb')&&qS('#stopAjaxCkb').checked){output();}
else if(total>photodata.photos.length&&g.ajax){instaAjax();}else{output();}
};
xhr.open("GET", 'https://www.instagram.com/'+g.Env.user.username+'/media/?max_id='+g.ajax);
xhr.send();
}
function _instaQueryAdd(elms) {
for (var i = 0; i < elms.length; i++) {
var feed = elms[i];
if (!elms || g.downloaded[feed.id]) {
continue;
} else {
g.downloaded[feed.id] = 1;
}
var c = feed.edge_media_to_comment || {count: 0};
var cList = [c.count];
for (var k = 0; c.edges && k < c.edges.length; k++) {
var p = c.edges[k].node;
cList.push({
name: p.owner.username,
url: 'http://instagram.com/' + p.owner.username,
text: p.text,
date: parseTime(p.created_at)
});
}
var url;
var isVideo = feed.__typename === 'GraphVideo';
if (feed.__typename === 'GraphSidecar' || isVideo) {
var edges = isVideo ? [feed] : feed.edge_sidecar_to_children.edges;
for (var j = 0; j < edges.length; j++) {
var n = isVideo ? edges[j] : edges[j].node;
url = parseFbSrc(n.display_url);
if (n.is_video) {
g.photodata.videos.push({
url: n.video_url,
thumb: url
});
}
var caption = feed.edge_media_to_caption.edges;
g.photodata.photos.push({
title: j === 0 && caption.length ? caption[0].node.text : '',
url: url,
href: 'https://www.instagram.com/p/' + (n.shortcode || n.code) + '/',
date: feed.taken_at_timestamp ? parseTime(feed.taken_at_timestamp) : '',
comments: c.count && j === 0 && cList.length > 1 ? cList : ''
});
}
} else {
url = parseFbSrc(feed.display_url || feed.display_src);
var date = feed.date || feed.taken_at_timestamp;
var code = feed.shortcode || feed.code;
var caption = feed.edge_media_to_caption;
if (caption) {
caption = caption.edges.length ? caption.edges[0].node.text : '';
}
g.photodata.photos.push({
title: feed.caption || caption || '',
url: url,
href: 'https://www.instagram.com/p/' + code + '/',
date: date ? parseTime(date) : '',
comments: c.count && cList.length > 1 ? cList : ''
});
}
}
}
function _instaQueryProcess(elms) {
for (var i = 0; i < elms.length; i++) {
if (elms[i].node) {
elms[i] = elms[i].node;
}
var feed = elms[i];
if (!elms[i] || (g.downloaded && g.downloaded[feed.id])) {
continue;
}
if (feed.__typename === 'GraphSidecar' || feed.__typename === 'GraphVideo') {
if (g.skipAlbum) {
elms[i] = null;
continue;
} else if (!feed.edge_sidecar_to_children && !feed.video_url) {
var xhr = new XMLHttpRequest();
xhr.onload = function() {
try {
var res = JSON.parse(this.response);
elms[i] = res.graphql.shortcode_media;
} catch(e) {
var htmlBase = document.createElement('html');
htmlBase.innerHTML = this.response;
var targetJS = htmlBase.querySelectorAll('script');
try {
for (var j = 0; j < targetJS.length; j++) {
if (targetJS[j].textContent.indexOf('_sharedData') > -1) {
elms[i] = extractJSON(targetJS[j].textContent);
break;
}
}
elms[i] = elms[i].entry_data.PostPage[0].graphql.shortcode_media;
} catch (e) {
elms[i] = null;
}
}
setTimeout(function() {
_instaQueryProcess(elms);
}, 500);
};
var code = feed.shortcode || feed.code;
xhr.open('GET', 'https://www.instagram.com/p/' + code + '/?__a=1');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send();
return;
}
}
}
_instaQueryAdd(elms);
var total = g.total;
var photodata = g.photodata;
console.log('Loaded '+photodata.photos.length+' of '+total+' photos.');
g.statusEle.textContent = 'Loaded ' + photodata.photos.length + ' / '+ total;
document.title="("+photodata.photos.length+"/"+total+") ||"+photodata.aName;
if (qS('#stopAjaxCkb') && qS('#stopAjaxCkb').checked) {
output();
} else if (g.ajax && +g.mode !== 2) {
setTimeout(instaQuery, 1000);
} else {
output();
}
}
function instaQuery() {
var xhr = new XMLHttpRequest();
xhr.onload = function() {
if (xhr.status === 429) {
alert('Too many request, Please try again later.');
if (!qS('.daExtra').innerHTML) {
qS('.daExtra').innerHTML = '<a class="daContinue">Continue</a>';
qS('.daContinue').addEventListener('click', instaQuery);
}
return;
}
if (this.response[0] == '<') {
if (confirm('Cannot load comments, continue?')) {
g.loadCm = false;
instaQuery();
}
return;
}
var res = JSON.parse(this.response).data.user.edge_owner_to_timeline_media;
g.ajax = res.page_info.has_next_page ? res.page_info.end_cursor : null;
_instaQueryProcess(res.edges);
};
xhr.open('GET', 'https://www.instagram.com/graphql/query/?' +
'query_id=' + g.queryId + '&id=' + g.Env.user.id + '&first=30&after=' +
g.ajax);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send();
}
function getInstagramQueryId() {
var s = qS('script[src*="Commons"]');
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var id = this.response.match(/profilePosts\S+queryId:"(\d+)"/);
if (!id) {
id = this.response.match(/byUserId\.get\S+queryId:"(\d+)"/);
}
if (id) {
g.queryId = id[1];
} else {
alert('Cannot get query id, using fallback instead');
g.queryId = 17880160963012870;
}
getInstagram();
};
xhr.open('GET', s.src);
xhr.send();
}
function getInstagram() {
if (g.start != 2 || g.start == 3) {
return;
}
g.start = 3;
if (g.Env.user.biography !== undefined) {
if (!g.Env.media) {
closeDialog();
return alert('Cannot download private account.');
}
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var res = JSON.parse(this.response).user.media;
g.ajax = res.page_info.has_next_page ? res.page_info.end_cursor : null;
_instaQueryProcess(res.nodes);
};
xhr.open('GET', location.origin + location.pathname + '?__a=1');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send();
}
}
function getTwitter(){
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var r = JSON.parse(this.responseText);
g.ajax = r.min_position || '';
var doc = getDOM(r.items_html);
var elms = doc.querySelectorAll('.content');
var photodata = g.photodata;
var i, j, link, url, title, date;
for(i = 0; i < elms.length; i++){
link = elms[i].querySelectorAll('.js-adaptive-photo, [data-image-url]');
if (!link.length) {
link = elms[i].querySelectorAll('img[src*=media]');
}
for(j = 0; j < link.length; j++){
url = link[j].getAttribute('data-image-url') || link[j].src;
if (!url) {
continue;
}
title = elms[i].querySelector('.tweet-text').innerHTML || '';
title = title.replace(/href="\//g, 'href="https://twitter.com/');
date = elms[i].querySelector('._timestamp, .js-short-timestamp');
photodata.photos.push({
title: title,
url: url.replace(':large', '') + ':orig',
href: 'https://twitter.com' + date.parentNode.getAttribute('href'),
date: date ? parseTime(+date.getAttribute('data-time')) : ''
});
if (!r.min_position) {
var max_id = (date.parentNode.getAttribute('href') || '')
.match(/status\/(\d+)/);
if(max_id){
g.ajax = max_id[1];
}
}
}
}
log("Loaded", photodata.photos.length);
document.title = photodata.photos.length + g.total + ' || ' + g.photodata.aName;
g.statusEle.textContent = g.photodata.photos.length + g.total;
if (qS('#stopAjaxCkb') && qS('#stopAjaxCkb').checked) {
output();
} else if (r.has_more_items && g.ajax && !g.ajaxStop) {
setTimeout(getTwitter, 1000);
} else {
output();
}
};
var url = 'https://twitter.com/i/profiles/show/'+g.photodata.aName+'/media_timeline?include_available_features=1&include_entities=1' + (g.ajax ? ('&max_position='+g.ajax) : '');
xhr.open('GET', url);
xhr.send();
}
function getWeibo(){
if(!GM_xmlhttpRequest){alert("This script required Greasemonkey/Tampermonkey!");return;}
GM_xmlhttpRequest({
method: "GET",
url: "https://photo.weibo.com/page/waterfall?filter=wbphoto&page="+g.ajaxPage+"&count=20&module_id=profile_photo&oid="+g.oId+"&uid=&lastMid="+g.ajax+"&lang=zh-tw",
onload: function() {
g.ajaxPage++;
var r = this.response;
var s = r.slice( r.indexOf("{"),r.lastIndexOf("}")+1 );
var res = new Function("return " + s)().data;
var elms = res.html;
var photodata=g.photodata;
var html;
g.ajax=res.lastMid || null;
for(var i=0;elms&&i<elms.length;i++){
html = document.createElement("div");
html.innerHTML = elms[i];
var links = html.querySelectorAll("a.ph_ar_box");
var img = html.querySelectorAll("img.photo_pic");
var title = html.querySelector(".describe span").title || '';
var photoTime = html.querySelector(".photo_time").textContent || '';
for(var imgCount = 0; imgCount < img.length; imgCount++){
var data = {};
var link = links[imgCount].getAttribute("action-data").split("&");
for(var j=0; j<link.length; j++){
var t = link[j].split("=");
data[t[0]] = t[1];
}
var url = img[imgCount].src.match(/:\/\/([\w\.]+)\//);
url = 'http://' + url[1] + '/large/' + data.pid + '.jpg';
if(!g.downloaded[url]){g.downloaded[url]=1;}else{continue;}
photodata.photos.push({
title: title,
url: url,
href: 'http://photo.weibo.com/'+g.uId+'/talbum/detail/photo_id/'+data.mid,
date: photoTime
});
}
}
log('Loaded '+photodata.photos.length+' photos.');
document.title="("+g.photodata.photos.length+") ||"+g.photodata.aName;
g.statusEle.textContent = 'Loaded ' + g.photodata.photos.length;
if(qS('#stopAjaxCkb')&&qS('#stopAjaxCkb').checked){output();}
else if(g.ajax){setTimeout(getWeibo, 2000);}else{output();}
}
});
}
function parsePinterest(list){
var photodata = g.photodata;
for(var j = 0; j < list.length; j++){
if (list[j].name || !list[j].images) {
continue;
}
photodata.photos.push({
title: list[j].description + '<br><a taget="_blank" href="' +
list[j].link + '">Pinned from ' + list[j].domain + '</a>',
url: (list[j].images.orig || list[j].images['736x']).url,
href: 'https://www.pinterest.com/pin/' + list[j].id + '/',
date: list[j].created_at ? new Date(list[j].created_at).toLocaleString() : false
});
}
log('Loaded ' + photodata.photos.length + ' photos.');
}
function getPinterest(){
var board = location.pathname.match(/\/(\S+)\/(\S+)\//);
if (board && board[1] === 'pin') {
closeDialog();
var img = qS('.pinImage, .imageLink img');
if (img) {
var link = document.createElement('a');
link.href = img.getAttribute('src');
link.download = '';
link.click();
}
return;
}
g.source = board ? encodeURIComponent(board[0]) : '/';
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var html = this.response;
var doc = getDOM(html);
var s = JSON.parse(doc.querySelector('#initial-state').textContent);
var type = s.ui.mainComponent.current;
var resources = s.resources.data;
while (resources && !resources.data) {
resources = resources[Object.keys(resources)[0]];
}
var r = resources && resources.data ? resources.data : null;
g.resource = type.replace(/Feed|Page/g, '') + 'FeedResource';
switch (type) {
case 'HomePage':
parsePinterest(r);
g.bookmarks = {
bookmarks: [resources.nextBookmark],
prependPartner: false,
prependUserNews: false,
prependExploreRep: null,
field_set_key: 'grid_item_with_rec'
};
g.resource = 'UserHomefeedResource';
break;
case 'BoardPage':
g.bookmarks = {
board_id: r.id,
board_url: r.url,
field_set_key: 'react_grid_pin',
layout: 'default',
page_size: 25
};
break;
case 'DomainFeedPage':
g.bookmarks = {domain: board[2]};
break;
case 'ProfilePage':
switch (board[2]) {
case 'pins':
g.bookmarks = {username: board[1], field_set_key: 'grid_item'};
g.resource = 'UserPinsResource';
break;
case 'likes':
g.bookmarks = {username: board[1], page_size: 25};
g.resource = 'UserLikesResource';
break;
}
break;
case 'SearchPage':
var query = location.search.slice(1).replace(/&/g, '=').split('=');
query = query[query.indexOf('q') + 1];
g.bookmarks = {query: query, scope: board[2]};
break;
case 'TopicFeedPage':
g.bookmarks = {interest: board[2]};
break;
case 'InterestFeedPage':
g.bookmarks = {query: board[2]};
break;
}
if (type === 'SearchPage' || type === 'InterestFeedPage') {
if (r.results) {
parsePinterest(r.results);
}
if (resources.nextBookmark) {
g.bookmarks.bookmarks = [resources.nextBookmark];
}
g.resource = 'SearchResource';
}
getPinterest_sub();
};
xhr.open('GET', location.href);
xhr.send();
}
function getPinterest_sub(){
var photodata = g.photodata;
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var r = JSON.parse(this.responseText);
parsePinterest(r.resource_response.data);
g.bookmarks = r.resource.options;
document.title="("+g.photodata.photos.length+") ||"+g.photodata.aName;
g.statusEle.textContent = g.photodata.photos.length + '/' + g.total;
if(qS('#stopAjaxCkb')&&qS('#stopAjaxCkb').checked){output();}
else if(g.bookmarks.bookmarks[0] != '-end-'){
setTimeout(getPinterest_sub, 1000);
}else{
output();
}
};
var data = {
"options" : g.bookmarks,
"context": {}
};
var url = location.origin + '/resource/' + g.resource + '/get/';
var data = 'source_url=' + g.source + '&data=' +
escape(JSON.stringify(data)) + '&_=' + (+new Date());
xhr.open('POST', url);
xhr.setRequestHeader('Accept', 'application/json, text/javascript, */*; q=0.01');
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var token = g.token || document.cookie.match(/csrftoken=(\S+);/)
if(token){
if(!g.token){
token = token[1];
g.token = token;
}
xhr.setRequestHeader('X-CSRFToken', token);
xhr.setRequestHeader('X-NEW-APP', 1);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send(data);
}else{
alert('Missing token!');
}
}
function getAskFM() {
var url = g.page || (location.protocol + '//ask.fm/' + g.username +
'?no_prev_link=true');
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var html = getDOM(this.response);
var hasMore = html.querySelector('.item-page-next');
var elms = html.querySelectorAll('.streamItem_visual');
var i, box, link, title, url, video;
var photodata = g.photodata;
for (var i = 0; i < elms.length; i++) {
box = getParent(elms[i], '.item');
var img = elms[i].querySelector('img');
if (!img) {
continue;
}
video = box.querySelector('.playIcon');
if (video) {
url = img.getAttribute('src');
photodata.videos.push({
url: img.parentNode.getAttribute('href'),
thumb: url
});
} else {
url = img.parentNode.getAttribute('data-url') ||
img.getAttribute('src');
}
link = box.querySelector('.streamItem_meta');
var content = box.querySelector('.streamItem_content');
if (content) {
content.removeChild(box.querySelector('.readMore'));
}
title = 'Q: ' +
getText('.streamItem_header', 0, box) +
' <br>' + 'A: ' + getText('.streamItem_content', 0, box);
photodata.photos.push({
title: title,
url: url,
href: 'https://ask.fm' + link.getAttribute('href'),
date: link.getAttribute('title')
});
}
console.log('Loaded ' + photodata.photos.length + ' photos.');
g.count += html.querySelectorAll('.item').length;
g.statusEle.textContent = g.count + '/' + g.total;
document.title = g.statusEle.textContent + ' ||' + g.title;
if (g.count < g.total && hasMore && !qS('#stopAjaxCkb').checked) {
g.page = hasMore.getAttribute('href');
setTimeout(getAskFM, 500);
} else {
if (photodata.photos.length) {
output();
} else {
alert('No photos loaded.');
}
}
};
xhr.open('GET', url);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send();
}
var dFAcore = function(setup, bypass) {
g.start=1;g.settings={};
if(!setup&&localStorage['dFASetting']){
g.settings=localStorage['dFASetting']?JSON.parse(localStorage['dFASetting']):{};
}
g.mode=g.settings.mode||window.prompt('Please type your choice:\nNormal: 1/press Enter\nDownload without auto load: 2\nAutoload start from specific id: 3\nOptimization for large album: 4')||1;
if(g.mode==null){return;}
if(g.mode==3){g.ajaxStartFrom=window.prompt('Please enter the fbid:\ni.e. 123456 if photo link is:\nfacebook.com/photo.php?fbid=123456');if(!g.ajaxStartFrom){return;}}
if(g.mode==4){g.largeAlbum=true;g.mode=window.prompt('Please type your choice:\nNormal: 1/press Enter\nDownload without auto load: 2\nAutoload start from specific id: 3');}
g.loadCm=g.settings.notLoadCm?0:(g.settings.loadCm||confirm("Try to load photo's caption?"));
g.notLoadCm=g.settings.notLoadCm||!g.loadCm;
g.largeAlbum=g.settings.largeAlbum||g.largeAlbum;
g.settings={mode:g.mode,loadCm:g.loadCm,largeAlbum:g.largeAlbum,notLoadCm:g.notLoadCm};
localStorage['dFASetting']=JSON.stringify(g.settings);
var aName=document.title,aAuth="",aDes="",aTime="";g.start=2;
g.timeOffset=new Date().getTimezoneOffset()/60*-3600000;
createDialog();
g.statusEle = qS('.daCounter');
if(location.host.match(/.*facebook.com/)){
if(qS('.fbPhotoAlbumTitle')||qS('.fbxPhotoSetPageHeader')){
aName=getText('.fbPhotoAlbumTitle')||getText("h2")||document.title;
aAuth=getText('#fb-timeline-cover-name')||getText("h2")||getText('.fbStickyHeaderBreadcrumb .uiButtonText')||getText(".fbxPhotoSetPageHeaderByline a");
if(!aAuth){aName=getText('.fbPhotoAlbumTitle'); aAuth=getText('h2');}
aDes=getText('.fbPhotoCaptionText',1);
try{aTime=qS('#globalContainer abbr').title;
var aLoc=qS('.fbPhotoAlbumActionList').lastChild;
if((!aLoc.tagName||aLoc.tagName!='SPAN')&&(!aLoc.childNodes.length||(aLoc.childNodes.length&&aLoc.childNodes[0].tagName!='IMG'))){aLoc=aLoc.outerHTML?" @ "+aLoc.outerHTML:aLoc.textContent;aTime=aTime+aLoc;}}catch(e){};
}
if(location.href.match('/search/')){
var query = qS('input[name="q"][value]');
aName = query ? query.value : document.title;
}
s = qSA("script");
try{
for(i=0,t, len = s.length; t=s[i].textContent, i<len; i++){
if(t.match(/envFlush\({/)){
g.Env=JSON.parse(t.slice(t.lastIndexOf("envFlush({")+9,-2)); break;
}
}
}catch(e){alert('Cannot load required variable');}
try{
for(i=0; t=s[i].textContent, i<len; i++){
var m = t.match(/"USER_ID":"(\d+)"/);
if(m){
g.Env.user = m[1]; break;
}
}
}catch(e){console.warn(e);alert('Cannot load required variable');}
if (!g.loadCm) {
g.loadCm = confirm('Load caption to correct photos url?\n' +
'(Not required for page)');
g.notLoadCm = !g.loadCm;
}
g.ajaxLoaded=0;g.dataLoaded={};g.ajaxRetry=0;g.elms='';g.lastLoaded=0;g.urlLoaded={};
g.thumbSelector = 'a.uiMediaThumb[ajaxify], a[data-video-id], ' +
'a.uiMediaThumb[rel="theater"], a.uiMediaThumbMedium, ' +
'.fbPhotoCurationControlWrapper a[ajaxify][rel="theater"], ' +
'a.uiVideoLink[ajaxify], #fbTimelinePhotosFlexgrid a[ajaxify]';
g.downloaded={};g.profilesList={};g.commentsList={count:0};
g.photodata = {
aName:aName.replace(/'|"/g,'\"'),
aAuth:aAuth.replace(/'|"/g,'\"'),
aLink:window.location.href,
aTime:aTime,
photos: [],
videos: [],
aDes:aDes,
largeAlbum:g.largeAlbum
};
g.newL = !!(qSA('#pagelet_timeline_medley_photos a[role="tab"]').length);
var xhr = new XMLHttpRequest();
xhr.onload = function(){
var html = this.response;
var doc = getDOM(html);
var pageId = doc.querySelector('[property="al:ios:url"]');
if (pageId && pageId.getAttribute('content').indexOf('page') > 0) {
g.isPage = true;
g.pageId = pageId.getAttribute('content').match(/\d+/)[0];
}
g.isVideo = location.href.match(/\/videos\/|set=v/);
g.isPageVideo = g.isPage && g.isVideo;
if (location.href.match('messages')) {
getFbMessagesPhotos();
} else {
getPhotos();
}
};
xhr.open('GET', location.href);
xhr.send();
}else if(location.host.match(/.*instagram.com/)){
if (location.pathname === '/') {
return alert('Please go to profile page.');
}
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var html = this.response;
var doc = getDOM(html);
try {
s = doc.querySelectorAll('script');
for (i=0; i<s.length; i++) {
if (!s[i].src && s[i].textContent.indexOf('_sharedData') > 0) {
s = s[i].textContent;
break;
}
}
g.Env = JSON.parse(s.match(/({".*})/)[1]);
g.token = g.Env.config.csrf_token;
var data = g.Env.entry_data;
if (data.ProfilePage) {
g.Env = data.ProfilePage[0];
} else {
alert('Need to reload for required variable.');
return location.reload();
}
} catch(e) {alert('Cannot load required variable!');}
g.total = g.Env.user.media.count;
aName = g.Env.user.full_name || 'Instagram';
aAuth = g.Env.user.username;
aLink = g.Env.user.external_url || ('http://instagram.com/'+ aAuth);
g.Env.media = g.Env.user.media.nodes;
var aTime = g.Env.media && g.Env.media.length ?
g.Env.media[0].date : 0;
g.photodata = {
aName: aName.replace(/'|"/g,'\"'),
aAuth: aAuth,
aLink: aLink,
aTime: aTime ? 'Last Update: ' + parseTime(aTime) : '',
photos: [],
videos: [],
aDes: (g.Env.user.bio || g.Env.user.biography || '').replace(/'|"/g,'\"')
};
g.downloaded = {};
getInstagramQueryId();
};
xhr.open('GET', location.href);
xhr.send();
}else if(location.host.match(/twitter.com/)){
g.id = qS('.ProfileAvatar img').getAttribute('src').match(/\d+/);
g.ajax = '';
var name = qS('h1 a');
var aTime = qS('.tweet-timestamp');
var total = getText('.PhotoRail-headingWithCount').replace(',', '').match(/\d+/);
g.total = total ? ('/' + total[0]) : '';
g.photodata = {
aName: name.getAttribute('href').slice(1),
aAuth: name.textContent,
aLink: location.href,
aTime: aTime ? aTime.getAttribute('data-original-title') : "",
photos: [],
aDes: getText('.ProfileHeaderCard-bio', true)
};
getTwitter();
}else if(location.host.match(/weibo.com/)){
try{
aName='微博配圖';
aAuth=getText('.username') || qS('.pf_photo img') ? qS('.pf_photo img').alt : '';
}catch(e){}
g.downloaded = {};
var k = qSA('script'), id = '';
for(var i=0; i<k.length && !id.length; i++){
var t = k[i].textContent.match(/\$CONFIG\['oid'\]/);
if(t)id = k[i].textContent;
}
eval(id);
if(!$CONFIG){alert("發生錯誤,請聯絡作者");return;}
g.oId = $CONFIG.page_id || $CONFIG.oid;
var uId = qS('[action-type="copy_cover"]') || qS('[action-type="webim.conversation"]');
if(uId){
uId = uId.getAttribute('action-data').match(/uid=(\d+)/);
if(uId){
g.uId = uId[1];
}
}
g.ajaxPage = 1;
g.ajax = ""
g.photodata = {
aName:aName,
aAuth:aAuth,
aLink:location.href,
aTime:aTime,
photos: [],
aDes:""
};
getWeibo();
}else if(location.host.match(/pinterest/)){
g.photodata = {
aName: getText('h3') || 'Pinterest',
aAuth: qS('.profileSource img') ? qS('.profileSource img').alt : '',
aLink: location.href,
aTime: aTime,
photos: [],
aDes: aDes
};
g.total = getText('.pinsAndFollowerCount .value') || getText('.value');
getPinterest();
}else if(location.host.match(/ask.fm/)){
g.count = 0;
g.page = 0;
g.total = +getText('.profileTabAnswerCount');
g.title = document.title;
g.username = getText('.profile-name span:nth-of-type(2)').slice(1);
if (!g.username) {
g.username = location.href.split('/')[3];
}
g.photodata = {
aName: getText('.profile-name span:nth-of-type(1)'),
aAuth: g.username,
aLink: location.href,
aTime: aTime,
photos: [],
videos: [],
aDes: getText('#sidebarBio', 1)
};
getAskFM();
}
};
function sendRequest(request, sender, sendResponse) {
switch(request.type){
case 'store':
localStorage["downAlbum"]=request.data;
log(request.no+' photos data saved.'); break;
case 'get':
g.photodata=JSON.parse(localStorage["downAlbum"]);
g.start=2;
log(g.photodata.photos.length+' photos got.');
getPhotos();
break;
case 'export':
if(!request.data){request.data=JSON.parse(localStorage["downAlbum"]);}
log('Exported '+request.data.photos.length+' photos.');
var a,b=[],c=request.data;
c.aName=(c.aName)?c.aName:"Facebook";
var d = c.photos,totalCount = d.length;
for (var i=0;i<totalCount;i++) {
if(d[i]){
var href=d[i].href?d[i].href:'',title=d[i].title||'',tag=d[i].tag||'',comments=d[i].comments||'',tagIndi='',dateInd='',commentInd='';
href=href?' href="'+href+'" target="_blank"':'';
if(tag){
tag = tag.replace(/href="/g, 'target="_blank" href="https://www.facebook.com');
tag='<div class="loadedTag">'+tag+'</div>';
tagIndi='<i class="tagArrow tagInd"></i>';
}
if(comments){
var co ='<div class="loadedComment">';
try{
if(comments[0]>comments.length-1){
var cLink = comments[1].fbid ? ("https://www.facebook.com/photo.php?fbid="+comments[1].fbid) : comments[1].id;
co += '<p align="center"><a href="'+cLink+'" target="_blank">View all '+comments[0]+' comments</a></p>';
}
}catch(e){}
for(var ii=1; ii<comments.length; ii++){
var p = comments[ii];
co += '<blockquote><p>'+p.text+'</p><small><a href="'+p.url+'" target="_blank">'+p.name+'</a> '+(p.fbid?('<a href="https://www.facebook.com/photo.php?fbid='+p.fbid+'&comment_id='+p.id+'" target="_blank">'):'')+p.date+(p.fbid?'</a>':'')+'</small></blockquote>';
}
comments = co + '</div>';
commentInd='<a title="Click to view comments" rel="comments"><i class="tagArrow commentInd"></i></a>';
}
if(d[i].date){dateInd='<div class="dateInd"><span>'+d[i].date+'</span> <i class="tagArrow dateInd"></i></div>';}
var $t = [];
var test = false;
var test2 = false;
try{if(title.match(/<.*>/))$t = $(title);}catch(e){}
try{test = title.match(/hasCaption/) && $t.length;}catch(e){}
try{test2 = title.match(/div/) && title.match(/span/)}catch(e){}
try{
if(test){
var t=document.createElement('div');
t.innerHTML=title;
var junk=t.querySelector('.text_exposed_hide');
if(junk&&junk.length)t.removeChild(junk);
title = $t.html();
if(title.indexOf("<br>") == 0)title = title.slice(4);
}else if(test2){
title = title.replace(/&(?!\w+([;\s]|$))/g, "&").replace(/</g, "<").replace(/>/g, ">");
}
else if($t.length){
try{
$t.find('.text_exposed_hide').remove().end()
.find('div *').unwrap().end()
.find('.text_exposed_show').unwrap().end()
.find('span').each(function() {$(this).replaceWith(this.childNodes);});
title=$t.html();
}catch(e){}
}
}catch(e){}
title=title?'<div class="captions"><a class="captions" rel="captions"></a>'+title+'</div>':'<div class="captions"></div>';
var a = '<div rel="gallery" class="item'+(c.largeAlbum?' largeAlbum':'')+'" id="item'+i+'"><a'+href+'>'+(i*1+1)+'</a>'+commentInd+tagIndi+dateInd+'<a class="fancybox" rel="fancybox" href="'+d[i].url+'" target="_blank"><div class="crop"><div style="background-image: url('+d[i].url+');" class="img"><img src="'+d[i].url+'"></div></div></a>'+title+tag+comments+'</div>';
b.push(a)}
}
var tHTML='<!DOCTYPE html><html><body class="index">'+'<script>document.title=\''+c.aAuth+(c.aAuth?"-":"")+c.aName+'\';</script>';
tHTML=tHTML+'<style>body{line-height:1;background:#f5f2f2;font-size:13px;color:#444;padding-top:70px;}.crop{width:192px;height:192px;overflow:hidden;}.crop img{display:none;}div.img{width:192px;height:192px;background-size:cover;background-position:50% 25%;border:none;image-rendering:optimizeSpeed;}@media screen and (-webkit-min-device-pixel-ratio:0){div.img{image-rendering: -webkit-optimize-contrast;}}header{display:block}.wrapper{width:960px;margin:0 auto;position:relative}#hd{background:#faf7f7;position:fixed;z-index:100;top:0;left:0;width:100%;}#hd .logo{padding:7px 0;border-bottom:1px solid rgba(0,0,0,0.2)}#container{width:948px;position:relative;margin:0 auto}.item{width:192px;float:left;padding:5px 15px 0;margin:0 7px 15px;font-size:12px;background:white;line-height:1.5}.item .captions{color:#8c7e7e;padding-bottom:15px;overflow:hidden;height:8px;position:relative;}.item .captions:first-child{position:absolute;width:100%;height:100%;top:0;left:0;z-index:1;}#logo{background-color:#3B5998;color:#FFF}#hd .logo h1{background-color:#3B5998;left:0;position:relative;width:100%;display:block;margin:0;color:#FFF;height:100%;font-size:20px}#logo a{color:#FFF}#logo a:hover{color:#FF9}progress{width:100%}#aDes{line-height:1.4;}.largeAlbum>a{visibility:visible;}.largeAlbum .fancybox{visibility:hidden;display:none;}.oImg{background-color:#FFC}\
.twitter-emoji, .twitter-hashflag {height: 1.25em; width: 1.25em; padding: 0 .05em 0 .1em; vertical-align: -0.2em;}\
/* drag */ #output{display:none;background:grey;min-height:200px;margin:20px;padding:10px;border:2px dotted#fff;text-align:center;position:relative;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;}#output:before{content:"Drag and Drop images.";color:#fff;font-size:50px;font-weight:bold;opacity:0.5;text-shadow:1px 1px#000;position:absolute;width:100%;left:0;top:50%;margin:-50px 0 0;z-index:1;}#output img{display:inline-block;margin:0 10px 10px 0;} button{display:inline-block;vertical-align:baseline;outline:none;cursor:pointer;text-align:center;text-decoration:none;font:700 14px/100% Arial, Helvetica, sans-serif;text-shadow:0 1px 1px rgba(0,0,0,.3);color:#d9eef7;border:solid 1px #0076a3;-webkit-border-radius:.5em;-moz-border-radius:.5em;background-color:#59F;border-radius:.5em;margin:0 2px 12px;padding:.5em 1em .55em;}.cName{display:none;}#fsCount{position: absolute;top: 20;right: 20;font-size: 3em;}\
/*! fancyBox v2.1.3 fancyapps.com | fancyapps.com/fancybox/#license */\
.fancybox-wrap,.fancybox-skin,.fancybox-outer,.fancybox-inner,.fancybox-image,.fancybox-wrap iframe,.fancybox-wrap object,.fancybox-nav,.fancybox-nav span,.fancybox-tmp{border:0;outline:none;vertical-align:top;margin:0;padding:0;}.fancybox-wrap{position:absolute;top:0;left:0;z-index:8020;}.fancybox-skin{position:relative;background:#f9f9f9;color:#444;text-shadow:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.fancybox-opened{z-index:8030;}.fancybox-outer,.fancybox-inner{position:relative;}.fancybox-type-iframe .fancybox-inner{-webkit-overflow-scrolling:touch;}.fancybox-error{color:#444;font:14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;white-space:nowrap;margin:0;padding:15px;}.fancybox-image,.fancybox-iframe{display:block;width:100%;height:100%;}.fancybox-image{max-width:100%;max-height:100%;}#fancybox-loading,.fancybox-close,.fancybox-prev span,.fancybox-next span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAACYBAMAAABt8RZRAAAAMFBMVEUAAAABAQEiIiIjIyM4ODhMTExmZmaCgoKAgICfn5+5ubnW1tbt7e3////+/v4PDw+0IcHsAAAAEHRSTlP///////////////////8A4CNdGQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAphJREFUSMftlE1oE0EUgNeCICru0YunaVNNSj3kbim5SqUECh7MxZMUvPQgKBQPggrSSy9SdFVC8Q8XwbNLpWhByRJQE5vsvimIFjxss14KmnTj/GR+Nrs9WH9OeZdlP96+nXnzvjG6qWHsDb+sVJK4AzSqfbgN767PXHimOMfu2zxCaPgujuGoWUA0RuyWjt0y4pHDGm43kQi7qvDF1xKf3lDYWZT4OJZ426Nfl1GO1nIk/tEgr9BEFpCnVRW4XSev87AEn8izJHHnIy1K9j5HnlMtgY98QCydJqPxjTi2gP4CnZT4MC2SJUXoOk/JIodqLHmJpatfHqRFCWMLnF+JbcdaRFmabcvtfHfPy82Pqs2HVlninKdadUw11tIauz+Y69ET+jGECyLdauiHdiB4yOgsvq/j8Bw8KqCRK7AWH4h99wAqAN/6p2po1gX/cXIGQwOZfz7I/xBvbW1VEzhijrT6cATNSzNn72ic4YDbcAvHcOQVe+32dBwsi8OB5wpHXkEc5YKm1M5XdfC+woFyZNi5KrGfZ4OzyX66InCHH3uJTqCYeorrTOCAjfdYXeCIjjeaYNNNxlNiJkPASym88566Aatc10asSAb6szvUEXQGXrD9rAvcXucr8dhKagL/5J9PAO1M6ZXaPG/rGrtPHkjsKEcyeFI1tq462DDVxYGL8k5aVbhrv5E32KR+hQFXKmNvGvrJ2941Rv1pU8fbrv/k5mUHl434VB11yFD5y4YZx+HQjae3pxWVo2mQMAfu/Dd3uDoJd8ahmOZOFr6kuYMsnE9xB+Xgc9IdEi5OukOzaynuIAcXUtwZ662kz50ptpCEO6Nc14E7fxEbiaDYSImuEaZhczc8iEEMYm/xe6btomu63L8A34zOysR2D/QAAAAASUVORK5CYII=);}#fancybox-loading{position:fixed;top:50%;left:50%;margin-top:-22px;margin-left:-22px;background-position:0 -108px;opacity:0.8;cursor:pointer;z-index:8060;}#fancybox-loading div{width:44px;height:44px;}.fancybox-close{position:absolute;top:-18px;right:-18px;width:36px;height:36px;cursor:pointer;z-index:8040;}.fancybox-nav{position:absolute;top:0;width:40%;height:100%;cursor:pointer;text-decoration:none;background:transparent url(data:image/png;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==);-webkit-tap-highlight-color:rgba(0,0,0,0);z-index:8040;}.fancybox-prev{left:-30%;}.fancybox-next{right:-30%;}.fancybox-nav span{position:absolute;top:50%;width:36px;height:34px;margin-top:-18px;cursor:pointer;z-index:8040;visibility:hidden;}.fancybox-prev span{left:10px;background-position:0 -36px;}.fancybox-next span{right:10px;background-position:0 -72px;}.fancybox-tmp{position:absolute;top:-99999px;left:-99999px;visibility:hidden;max-width:99999px;max-height:99999px;overflow:visible!important;}.fancybox-overlay{position:absolute;top:0;left:0;overflow:hidden;display:none;z-index:8010;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjY3NjM0OUJFNDc1MTFFMTk2RENERUM5RjI5NTIwMEQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjY3NjM0OUNFNDc1MTFFMTk2RENERUM5RjI5NTIwMEQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCNjc2MzQ5OUU0NzUxMUUxOTZEQ0RFQzlGMjk1MjAwRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCNjc2MzQ5QUU0NzUxMUUxOTZEQ0RFQzlGMjk1MjAwRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgbXtVkAAAAPSURBVHjaYhDg4dkAEGAAATEA2alCfCIAAAAASUVORK5CYII=);}.fancybox-overlay-fixed{position:fixed;bottom:0;right:0;}.fancybox-lock .fancybox-overlay{overflow:auto;overflow-y:scroll;}.fancybox-title{visibility:hidden;font:normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;position:relative;text-shadow:none;z-index:8050;}.fancybox-title-float-wrap{position:absolute;bottom:0;right:50%;margin-bottom:-35px;z-index:8050;text-align:center;}.fancybox-title-float-wrap .child{display:inline-block;margin-right:-100%;background:rgba(0,0,0,0.8);-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;text-shadow:0 1px 2px #222;color:#FFF;font-weight:700;line-height:24px;white-space:nowrap;padding:2px 20px;}.fancybox-title-outside-wrap{position:relative;margin-top:10px;color:#fff;}.fancybox-title-inside-wrap{padding-top:10px;}.fancybox-title-over-wrap{position:absolute;bottom:0;left:0;color:#fff;background:rgba(0,0,0,.8);padding:10px;}.fancybox-inner,.fancybox-lock{overflow:hidden;}.fancybox-nav:hover span,.fancybox-opened .fancybox-title{visibility:visible;}\
#fancybox-buttons{position:fixed;left:0;width:100%;z-index:8050;}#fancybox-buttons.top{top:10px;}#fancybox-buttons.bottom{bottom:10px;}#fancybox-buttons ul{display:block;width:400px;height:30px;list-style:none;margin:0 auto;padding:0;}#fancybox-buttons ul li{float:left;margin:0;padding:0;}#fancybox-buttons a{display:block;width:30px;height:30px;text-indent:-9999px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaBAMAAADKhlwxAAAAMFBMVEUAAAAAAAAeHh4uLi5FRUVXV1diYmJ3d3eLi4u8vLzh4eHz8/P29vb////+/v4PDw9Xwr0qAAAAEHRSTlP///////////////////8A4CNdGQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAbVJREFUWMPtlktugzAQhnPNnqLnSRuJXaRGVFm3NmFdPMC+YHqA8NiWBHBdlPgxETRIVatWjIQ0Hn/8DL9lywsxJRYz/T10h+uxkefyiUw6xPROpw33xZHHmm4yTD9WKg2LRHhZqumwuNDW77tQkAwCRTepx2VU5y/LSEMlXkPEc3AUHTJCCESn+S4FOaZa/F7OPqm/bDLyGXCmoR8a4nLkKLrupymiwT/Thz3ZbbWDK9ZPnzxuoMeZ6sSTdKLpGthShnP68EaGIX3MGKGFrx1cAXbQDbR0ypY0TDRdX9JKWtD8RawiZqz8CtMbnR6k1zVsDfod046RP8jnbt6XM/1n6WoSzX2ryLlo+dsgXaRWsSxFV1aDdF4kZjGP5BE0TAPj5vEOII+geJgm1Gz9S5p46RSaGK1fQUMwgabPkzpxrqcZWV/vYA5PE1anDG4nrDw4VpFR0ZDhTtbzLp7p/03LW6B5qnaXV1tL27X2VusX8RjdWnTH96PapbXLuzIe7ZvdxBb9OkbXvtga9ca4EP6c38hb5DymsbduWY1pI2/bcRp5W8I4bXmLnMc08hY5P+/L36M/APYreu7rpU5/AAAAAElFTkSuQmCC);background-repeat:no-repeat;outline:none;opacity:0.8;}#fancybox-buttons a:hover{opacity:1;}#fancybox-buttons a.btnPrev{background-position:5px 0;}#fancybox-buttons a.btnNext{background-position:-33px 0;border-right:1px solid #3e3e3e;}#fancybox-buttons a.btnPlay{background-position:0 -30px;}#fancybox-buttons a.btnPlayOn{background-position:-30px -30px;}#fancybox-buttons a.btnToggle{background-position:3px -60px;border-left:1px solid #111;border-right:1px solid #3e3e3e;width:35px;}#fancybox-buttons a.btnToggleOn{background-position:-27px -60px;}#fancybox-buttons a.btnClose{border-left:1px solid #111;width:35px;background-position:-56px 0;}#fancybox-buttons a.btnDisabled{opacity:0.4;cursor:default;}\
.loadedTag, .loadedComment{display:none}.fbphotosphototagboxes{z-index:9997}.fancybox-nav{width:10%;}.tagArrow{background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAABgCAMAAADfGilYAAABQVBMVEUAAABXV1dXV1dXV1dXV1dkZGRkZGQAAABXV1dXV1fj4+NXV1cAAAAAAABXV1dXV1cAAABXV1dXV1cdHR1XV1ciIiLi4uJXV1cnJyfl5eVXV1dXV1ff399XV1dXV1dXV1dXV1dXV1dXV1cXFxcAAABXV1dXV1dXV1cAAAA3NzdXV1dXV1dXV1cAAAAAAABXV1dXV1dXV1dXV1cAAAD+/v74+PhXV1dXV1f29vYeHh4tLS0AAAAyMjJXV1f5+flXV1f7+/v///9XV1dtfq9ugLCSn8PO0+Nrfqq9xdqKmL/x8fh1h7COnL5ugK/O1eKTocGkr87O1OTN0+Gnsc7L0eH4+PuRn8Crt85tgK/c4Oyos8+qtc1ugaytuNHx8vnX2+jx8viqtdFzhbOtt9ByhLHX3OiqtdC9xtuKl7/T2ebS2ObSpKIFAAAAQXRSTlMAFCzrgWZAfNNo5fkwLiY8MnLzhWCH49mJ5yp64x5CDo0yw4MG7Xz7Co0G1T5kSmwCk/1g/fcwOPeFiWKLZvn3+z0qeQsAAAJ7SURBVHhendLXctswEAXQJSVbVrdkW457r3FN7WUBkurFvab3/P8HZAGatCIsZ6zcJ2iOLrgYAKBcrrdbrXa9XAZApAX9RAQgaaNOW8lZWedMS11BmagOcKgAiY6VNAJp0DqQhpJWIC2A60CufVHLUBBDaaBOuJtOI5wA/QmOAzk2pr7y4QoBgpOe3pz0kE56eohaoiNlpYa1ipSq8v5b88vXoCE9VPGUuOdSyqZ7Ix1qqFYHwHOcyqeKIw988WpYkRWseQAdKWv4wXE6oVBHyw/1zZ+O/BzuRtG7fafPNJ2m/OiLPNByoCaoEjmyGsxW1VIlIXZIvECopCokyiVVQqnqipaLc0de3Iq8xCPpC142j7BLXM8N5OTXiZI7ZmAgCgYHiVhAJOJBEQ+aeNBkAEcaONLAkQaeCAyCu8XKRUAyNh6PANu6H+cBwBqK82Ar4mC2qFsmjKbF/AKR3QWWgqeCki7YMatL7CELdOeBEMUkdCeuaWvFWhVrM8DQpB3bF7vAkB1LbooCmEQAcyIPBo0TQH4RzOQs8ikb+OzlIDr8bnxogtc8DFlPaDgV/qQs2Jq4RnHWJJtgYV6kRw2imyukBSWvyOqmZFGIt7rTc9swsyZWrZUtMF/IrtiP2ZMMQEFsRrzEvJgDIgMoi3kg4p61PUVsTbJXsAf/kezDhMqOActL06iSYDpL0494gcyrx6YsKxhL4bNeyT7PQmYkhaUXpR55WRpRjdRIdmxi+x9JYGqjRJCB4XvDPYJvMDWWoeU69Aq+2/D/bQpO0Ea8EK0bspNQ2WY60alLisuJ9MMK/GaJ5I/Lt6QKS24obmSpn+kgAJ4gIi70k79vocBUxmfchgAAAABJRU5ErkJggg==);background-size: auto;background-repeat: no-repeat;display: inline-block;height: 11px;width: 20px;background-position: 0 -24px;margin-top:3px;}.tagInd{background-position: 0 -83px;float:right;}.dateInd{background-position:-12px 1px;text-indent:-100%;text-align:right;float:right;}.dateInd span{padding-right:3px;visibility:hidden;}.dateInd:hover span{visibility:visible;}.vis{visibility:visible !important;}.commentInd{background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAGJJREFUKFNjgIGJi47+905fQBCD1EG1MDCABIgBIHVQLSRqmrP2wn8QHo6aeuYdAwugYxiA8cFBDtME04iOYRpBNDSgGVA0YcMwjSiaYABZIVQIBWQ3bsStCcolDhCvgYEBADd1oN6ZvLbPAAAAAElFTkSuQmCC);background-position:0 0;float:right;cursor:pointer;}blockquote {padding: 0 0 0 15px;margin: 0 0 20px;border-left: 5px solid #eeeeee;}blockquote p {margin-bottom: 0;line-height: 1.25;}blockquote small {display: block;line-height: 20px;color: #999999;font-size: 85%;}blockquote small:before {content: "— ";}\
/* .borderTagBox & .innerTagBox */\
.fbPhotosPhotoTagboxes{height:100%;left:0;position:absolute;top:0;width:100%;/*pointer-events:none*/}.fbPhotosPhotoTagboxes .tagsWrapper{display:inline-block;height:100%;width:100%;position:relative;vertical-align:middle}.fbPhotosPhotoTagboxBase{line-height:normal;position:absolute}.imageLoading .fbPhotosPhotoTagboxBase{display:none}/*.fbPhotosPhotoTagboxBase .borderTagBox, .fbPhotosPhotoTagboxBase .innerTagBox{-webkit-box-sizing:border-box;height:100%;width:100%}.ieContentFix{display:none;font-size:200px;height:100%;overflow:hidden;width:100%}.fbPhotosPhotoTagboxBase .innerTagBox{border:4px solid #fff;border-color:rgba(255, 255, 255, .8)}*/.fbPhotosPhotoTagboxBase .tag{bottom:0;left:50%;position:absolute}.fbPhotosPhotoTagboxBase .tagPointer{left:-50%;position:relative}.fbPhotosPhotoTagboxBase .tagArrow{left:50%;margin-left:-10px;position:absolute;top:-10px}.fbPhotosPhotoTagboxBase .tagName{background:#fff;color:#404040;cursor:default;font-weight:normal;padding:2px 6px 3px;top:3px;white-space:nowrap}.fancybox-inner:hover .fbPhotosPhotoTagboxes{opacity:1;z-index:9998;}.fbPhotosPhotoTagboxes .tagBox .tag{top:85%;z-index:9999}.fbPhotosPhotoTagboxes .tag, .fbPhotosPhotoTagboxes .innerTagBox, .fbPhotosPhotoTagboxes .borderTagBox{visibility:hidden}.tagBox:hover .tag/*, .tagBox:hover .innerTagBox*/{opacity:1;/*-webkit-transition:opacity .2s linear;*/visibility:visible}</style>';
tHTML=tHTML+'<header id="hd"><div class="logo" id="logo"><div class="wrapper"><h1><a id="aName" href='+c.aLink+'>'+c.aName+'</a> '+((c.aAuth)?'- '+c.aAuth:"")+' <button onClick="cleanup()">ReStyle</button></h1><h1>Press Ctrl+S / [Mac]Command+S (with Complete option) to save all photos. [Photos are located in _files folder]</h1></div></div></header>';
tHTML=tHTML+'<center id="aTime">'+c.aTime+'</center><br><center id="aDes">'+c.aDes+'</center><center>Download at: '+c.dTime+'</center><br><div id="output" class="cName"></div><div class="wrapper"><div id="bd"><div id="container" class="masonry">';
tHTML=tHTML+b.join("")+'</div></div></div><script src="https://rawgit.com/inDream/DownAlbum/master/assets/jquery.min.js"></script></body></html>';
var file = new File([tHTML], 'photos.html', {type: 'text/html;charset=utf-8'});
window.open(window.URL.createObjectURL(file), '_blank');
break;
}
};
if (unsafeWindow !== undefined) {
console = unsafeWindow.console;
try {
var expG = exportFunction(g, unsafeWindow, {defineAs: "g"});
unsafeWindow.g = expG;
var expCore = exportFunction(dFAcore, unsafeWindow, {defineAs: "dFAcore"});
unsafeWindow.dFAcore = expCore;
} catch (e) {
unsafeWindow.dFAcore = dFAcore;
unsafeWindow.g = g;
}
document.addEventListener("DOMContentLoaded", dFAinit, false);
setTimeout(dFAinit, 2000);
} else {
alert("Cannot init script. Please try Greasemonkey/Scriptish.");
}
Donate for the site OpenUserJS
Are you sure you want to go to an external site to donate a monetary value?
WARNING: Some countries laws may supersede the payment processors policy such as the GDPR and PayPal. While it is highly appreciated to donate, please check with your countries privacy and identity laws regarding privacy of information first. Use at your utmost discretion.