window.jQuery = window.jQuery || {}; window.instasScript = window.instasScript || {}; ( function( window, document, $, app, undefined ) { 'use strict'; /** * Instagram Downloader Script * * Instructions: * * 1. Go to your Instagram profile url (e.g. https://instagram.com/jtsternberg/) * 2. Scroll to the bottom, and click the "LOAD MORE" button. This triggers the auto-loading on scroll - http://b.ustin.co/142xL (if you forget, it will prompt you) * 3. Copy this entire thing to your javascript console. (only tested on chrome) * 4. Hit enter and watch your images download. * 5. To stop the process, close the tab or refresh (or hit your escape key). */ /** * instagram image - http://b.ustin.co/1aLvI * * @type {String} */ app.instaImageSelector = '._22yr2'; /** * Full-size instagram image after the modal opens - http://b.ustin.co/18xhe * * @type {String} */ app.modalImageSelector = '._n3cp9._d20no ._jjzlb img'; /** * Full-size instagram video after the modal opens * * @type {String} */ app.modalVideoSelector = '._n3cp9._d20no ._2tomm video'; /** * "Load More" button selector * * @type {String} */ app.loadMoreSelector = '._oidfu'; /** * Closes the modal * * @type {String} */ app.closeButtonSelector = '._3eajp'; /** * Amount of time to allow the image to download. May need to increase this value on a slow connection. * * @type {Number} */ app.downloadBufferTime = 800; /** * Amount of time to allow the freshly-loaded images (after scroll) to load. May need to increase this value on a slow connection. * * @type {Number} */ app.loadMoreBufferTime = 2000; /** * Amount of time to allow the modal to load after triggering it. * * @type {Number} */ app.waitForModalTime = 200; var notified = false; var stop = false; app.dowloaded = []; app.init = function() { var go = function() { alert( "Ok, we're about to begin! Press the 'escape' key to stop the the downloads." ); $ = jQuery; // Listen for escape to stop the import $( document ).on( 'keyup', function( evt ) { if ( 27 === evt.keyCode ) { console.warn( 'STOP dowload script' ); stop = true; } }); app.processNext(); }; if ( ! window.jQuery || ! window.jQuery.fn ) { app.loadjQuery(); setTimeout( go, 1000 ); } else { setTimeout( go, 200 ); } }; app.start = function() { stop = false; app.processNext(); }; app.loadjQuery = function() { var script = document.createElement('script'); script.async = 1; script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js'; var otherscript = document.getElementsByTagName('script')[0]; otherscript.parentNode.insertBefore(script, otherscript); }; app.processNext = function() { if ( stop ) { $( app.closeButtonSelector ).trigger( 'click' ); return alert( "Ok, it's stopped! `instasScript.start()` in your JS console to continue." ); } app.$toClick = $( app.instaImageSelector + ':not(.instadone )' ).first(); if ( ! app.$toClick.length ) { return app.triggerMore(); } app.$toClick.trigger( 'click' ); setTimeout( app.processThis, app.waitForModalTime ); }; app.processThis = function() { var $media = $( app.modalImageSelector ); if ( ! $media.length ) { $media = $( app.modalVideoSelector ); } if ( $media.hasClass( 'instadone' ) ) { return app.processNext(); } if ( ! $media.length ) { return app.processNext(); } var src = $media.attr('src'); var haveIt = $.inArray( src, app.dowloaded ); if ( ! src || -1 !== haveIt ) { if ( ! src ) { console.warn('! src',$media); } if ( -1 !== haveIt ) { console.warn('We have this image!', haveIt, src); } return app.processNext(); } app.$toClick.addClass( 'instadone' ); $media.addClass( 'instadone' ); app.dowloaded.push( app.saveToDisk( src ) ); $( app.closeButtonSelector ).trigger( 'click' ); // Wait a bit to give adequate time to download setTimeout( app.processNext, app.downloadBufferTime ); }; app.triggerMore = function() { if ( $( app.loadMoreSelector ).length ) { return app.needToClickLoadMore(); } var y = $(window).scrollTop(); // your current y position on the page // Jigger the scrolling to trigger the load-more $( 'html, body' ).animate( { scrollTop: y-250 }, 200, 'swing', function() { $( 'html, body' ).animate( { scrollTop: $( document ).height() }, 200 ); }); // Start the processing on the new batch setTimeout( app.processNext, app.loadMoreBufferTime ); }; app.needToClickLoadMore = function() { if ( ! notified ) { notified = true; $( app.closeButtonSelector ).trigger( 'click' ); setTimeout( function() { $( app.loadMoreSelector ).css({ 'box-shadow' : '0px 2px 108px red', 'border-radius' : '100%' }); alert( 'click the "LOAD MORE" button! The download script will continue automatically once "infinite scroll" is triggered.' ); }, 500 ); $( 'html, body' ).animate( { scrollTop: $( document ).height() }, 200 ); } setTimeout( app.triggerMore, app.downloadBufferTime * 2 ); }; app.saveToDisk = function( fileUrl, fileName ) { var hyperlink = document.createElement('a'); hyperlink.href = fileUrl; hyperlink.target = '_blank'; hyperlink.download = fileName || fileUrl; console.log( app.dowloaded.length + ') download', hyperlink.download ); var mouseEvent = new MouseEvent('click', { view: window, bubbles: true, cancelable: true }); hyperlink.dispatchEvent(mouseEvent); (window.URL || window.webkitURL).revokeObjectURL(hyperlink.href); return fileUrl; }; app.init(); } )( window, document, window.jQuery, window.instasScript );