// ==UserScript== // @name Andrew's Tagged Photos Downloader // @include https://www.facebook.com/*/allactivity?privacy_source=activity_log&log_filter=cluster_200 // @require http://code.jquery.com/jquery-1.7.1.min.js // @grant none // @version 1.0 // @description Download all photos that you are tagged in. // @namespace https://greasyfork.org/users/36399 // @downloadURL none // ==/UserScript== /* * For jQuery Conflicts. */ this.$ = this.jQuery = jQuery.noConflict(true); // Variables var fbname = document.title; var inited = false; var firstrun = false; var retry = 0; var retries = 10; var activityheight = 0; // Inject buttons into page $(document).ready(function() { $('#pagelet_main_column_personal div [class="_2o3t fixed_elem"] div[class="clearfix uiHeaderTop"]').append(''); $('#andrewfbdl').click(triggerdl); }); jQuery.fn.simulateClick = function() { return this.each(function() { if('createEvent' in document) { var doc = this.ownerDocument, evt = doc.createEvent('MouseEvents'); evt.initMouseEvent('click', true, true, doc.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null); this.dispatchEvent(evt); } else { this.click(); } }); }; function triggerdl() { if (confirm('Are you sure you wish to continue? Chrome may tell you that this page is attempting to download multiple files: please click on Allow.')) { inited = false; firstrun = false; retry = 0; andrewhandler(); } } // Behold: the master function. function andrewhandler() { if (!inited) { activityheight = 0; console.log('> Activate all years and months...'); // Tickle all the years and months to make sure all activity data are loaded $("div#rightColContent ul.fbTimelineLogScrubber li a").each(function() { $(this).simulateClick('click'); }); inited = true; var checkFinish = setInterval(function() { // Kind of primitive, but check the height of the activity log box every 5 seconds. If it remains the same after 5 seconds, we assume all data has finished loading. if ($("#fbTimelineLogBody").height() != activityheight) { activityheight = $("#fbTimelineLogBody").height(); } else { console.log('> Finished loading all data! Proceeding to download photos...'); clearInterval(checkFinish); andrewhandler(); } }, 5000); } else { if (!firstrun) { scrollTo(0, 0); firstrun = true; } if (retry < retries) { if (!$("#fbTimelineLogBody div._5shk:not(.fbprocessed)").length) { if ($("#fbTimelineLogBody a.uiMorePagerPrimary").length) { $("#fbTimelineLogBody a.uiMorePagerPrimary").each(function() { $(this).simulateClick('click'); }); retry = 0; console.log($("#fbTimelineLogBody a.uiMorePagerPrimary").length+" More Activity Links Exist"); setTimeout(function() { andrewhandler(); }, 500); return; } setTimeout(function() { andrewhandler(); }, 500); retry++; console.log('Seems to be done. '+retry+'/'+retries); } else { retry = 0; contents = $("#fbTimelineLogBody div._5shk:not(.fbprocessed):first div._42ef").text(); if (contents.indexOf(fbname+' was tagged in') != -1 && contents.indexOf(' photo.') != -1) { dlphoto(); } else { //console.log('> Not a relevant activity, skipping.'); $("#fbTimelineLogBody div._5shk:not(.fbprocessed):first").addClass('fbprocessed'); andrewhandler(); } } } else { alert('Done!'); } } } function dlphoto() { code = $("#fbTimelineLogBody div._5shk:not(.fbprocessed):first td._5ep6 a").attr('href'); regexp = /\?fbid=([0-9]+)&/g; match = regexp.exec(code); if (match[1]) $("body").append(""); $("#fbTimelineLogBody div._5shk:not(.fbprocessed):first").addClass('fbprocessed'); setTimeout(andrewhandler, 1500); }