Skip to content

Instantly share code, notes, and snippets.

@hardiksondagar
Forked from suprememoocow/intercept.js
Last active June 10, 2023 09:25
Show Gist options
  • Save hardiksondagar/732c5efa1c4327f12d8a343c960853d6 to your computer and use it in GitHub Desktop.
Save hardiksondagar/732c5efa1c4327f12d8a343c960853d6 to your computer and use it in GitHub Desktop.
Instagram follower web scrapper.
/**
*
* Instagram Follower Web Scrapper
*
* Steps to use.
* 1. Open instagram user's profile in browser https://www.instagram.com/tvfpitchers/
* 2. Open console ( press F12 in chrome ) and paste all the code below
* 3. Click on followers button and load all the followers
* 4. Call function downloadAsCsv() by writing "downloadAsCsv()" in console to download csv file containing user's all the followers .
*
* @author : Hardik Sondagar <hardikmsondagar@gmail.com>
*
*/
var followers = [];
(function(XHR) {
"use strict";
var stats = [];
var timeoutId = null;
var open = XHR.prototype.open;
var send = XHR.prototype.send;
XHR.prototype.open = function(method, url, async, user, pass) {
this._url = url;
open.call(this, method, url, async, user, pass);
};
XHR.prototype.send = function(data) {
var self = this;
var start;
var oldOnReadyStateChange;
var url = this._url;
var match_url_string = 'query';
function onReadyStateChange() {
if (self.readyState == 4 && url.indexOf(match_url_string) > -1) {
var response = JSON.parse(self.response);
followers = followers.concat(response.data.user.edge_followed_by.edges);
}
if (oldOnReadyStateChange) {
oldOnReadyStateChange();
}
}
if (!this.noIntercept) {
start = new Date();
if (this.addEventListener) {
this.addEventListener("readystatechange", onReadyStateChange, false);
} else {
oldOnReadyStateChange = this.onreadystatechange;
this.onreadystatechange = onReadyStateChange;
}
}
send.call(this, data);
}
})(XMLHttpRequest);
function downloadAsCsv() {
var csvContent = "data:text/csv;charset=utf-8,";
var header = "Username,Full Name,Pic,Id\n";
csvContent += header;
followers.forEach(function(follower, index) {
var data = [];
data.push(follower.node.username);
data.push(follower.node.full_name);
data.push(follower.node.profile_pic_url);
data.push(follower.node.id);
dataString = data.join(",");
csvContent += index < followers.length ? dataString + "\n" : dataString;
});
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
var pathArray = window.location.pathname.split('/');
var milliseconds = (new Date).getTime();
var filename = 'followers.' + milliseconds + '.csv';
if (pathArray && pathArray.length > 1) {
filename = pathArray[1] + '.' + milliseconds + '.csv';
}
link.setAttribute("download", filename);
document.body.appendChild(link); // Required for FF
var evt = new MouseEvent("click");
var canceled = !link.dispatchEvent(evt);
if (canceled) {
// A handler called preventDefault
console.log("canceled");
} else {
// None of the handlers called preventDefault
console.log("not canceled");
}
// This will download the data file named "my_data.csv".
}
@jasetom
Copy link

jasetom commented Jul 7, 2016

Hey, lovely script! But sadly it does not work ;/ All I get is an empty csv file with headers, is this is still working for you?

@hardiksondagar
Copy link
Author

@jasetom Hey it's working for me. Please follow the steps. Make sure you paste the script before hitting the followers button of user X.

@carlosMetrics
Copy link

Hey @hardiksondagar, I tested the script, but when I pasted and executed it on chrome, console says "udefined", before calling the "downloadAsCsv() " function. How can I solve this? Thanks in advance.

@dgambacorta
Copy link

dgambacorta commented May 9, 2017

Hey @hardiksondagar, i made some changes to the script and it works great. Before doing this, the csv was empty.

/**
 *
 * Instagram Follower Web Scrapper
 *
 * Steps to use.
 * 1. Open instagram user's profile in browser https://www.instagram.com/tvfpitchers/
 * 2. Open console ( press F12 in chrome ) and paste all the code below
 * 3. Click on followers button and load all the followers
 * 4. Call function downloadAsCsv() by writing "downloadAsCsv()" in console to download csv file containing user's all the followers .
 *
 * @author : Hardik Sondagar <hardikmsondagar@gmail.com>
 *
 */

var followers = [];

(function(XHR) {
    "use strict";

    var stats = [];
    var timeoutId = null;

    var open = XHR.prototype.open;
    var send = XHR.prototype.send;

    XHR.prototype.open = function(method, url, async, user, pass) {
        this._url = url;
        open.call(this, method, url, async, user, pass);
    };

    XHR.prototype.send = function(data) {
        var self = this;
        var start;
        var oldOnReadyStateChange;
        var url = this._url;
        var match_url_string = 'query';

        function onReadyStateChange() {
            if (self.readyState == 4 && url.indexOf(match_url_string) > -1) {
                var response = JSON.parse(self.response);
                followers = followers.concat(response.data.user.edge_followed_by.edges);
            }

            if (oldOnReadyStateChange) {
                oldOnReadyStateChange();
            }
        }

        if (!this.noIntercept) {
            start = new Date();

            if (this.addEventListener) {
                this.addEventListener("readystatechange", onReadyStateChange, false);
            } else {
                oldOnReadyStateChange = this.onreadystatechange;
                this.onreadystatechange = onReadyStateChange;
            }
        }

        send.call(this, data);
    }
})(XMLHttpRequest);

function downloadAsCsv() {

    var csvContent = "data:text/csv;charset=utf-8,";

    var header = "Username,Full Name,Pic,Id\n";
    csvContent += header;


    followers.forEach(function(infoArray, index) {
  
        var data = [];

        for (var i in infoArray) {     
            data.push(infoArray[i].username);
            data.push(infoArray[i].full_name);
            data.push(infoArray[i].profile_pic_url);
            data.push(infoArray[i].id);            
        }

        dataString = data.join(",");
        csvContent += index < followers.length ? dataString + "\n" : dataString;

    });

    var encodedUri = encodeURI(csvContent);
    var link = document.createElement("a");
    link.setAttribute("href", encodedUri);

    var pathArray = window.location.pathname.split('/');

    var milliseconds = (new Date).getTime();
    var filename = 'followers.' + milliseconds + '.csv';

    if (pathArray && pathArray.length > 1) {
        filename = pathArray[1] + '.' + milliseconds + '.csv';
    }
    link.setAttribute("download", filename);
    document.body.appendChild(link); // Required for FF

    link.click(); // This will download the data file named "my_data.csv".

}

@hardiksondagar
Copy link
Author

@dgambacorta Hey thanks for the update :-)

@andreea143
Copy link

Is this still working? i have tried it and i am getting this error "Uncaught TypeError: Cannot read property 'edges' of undefined
at XMLHttpRequest.onReadyStateChange (:27:81)". this would be reaaaaly helpful if it worked, Thanks!:)

@muscal
Copy link

muscal commented Jul 21, 2017

I'm getting a similar error
image

For context, i'm leaving the browser on the instagram profile. I then paste the code and press 'Enter' and then I get this error.

@aliuzair1644
Copy link

Is this method still works in 2018

@unnir
Copy link

unnir commented Jul 5, 2018

Hey @hardiksondagar, I tested the script, but when I pasted and executed it on chrome, console says "udefined", before calling the "downloadAsCsv() " function. How can I solve this? Thanks in advance.

have the same issue

@hardiksondagar
Copy link
Author

@carlosMetrics @aliuzair @unnir, I've updated the script, it's working now.

@djsiddz2
Copy link

Works with Chrome, but doesn't work with Firefox. It only manages to get the first 17 followers in Firefox. I'll be working on tweaking this to read my followings and then compare the two in excel hopefully. Thanks @hardiksondagar

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment