Skip to content

Instantly share code, notes, and snippets.

@nickboyce
Last active June 23, 2024 22:01
Show Gist options
  • Save nickboyce/06c0ff48a2892311bd9a6601baed55b0 to your computer and use it in GitHub Desktop.
Save nickboyce/06c0ff48a2892311bd9a6601baed55b0 to your computer and use it in GitHub Desktop.
Track your Instagram followers over time with Google Sheets Scripts
// Thank you to @juliendev for his script (updated here with minor cosmetic changes)
// https://gist.github.com/JulienDev/df5a3b66e899c224fa1b2dc90acfa2ae
// Your sheet name in the document
var sheetName = "Sheet1";
// Your instagram user id
var user_id = ""; //find your id here : https://codeofaninja.com/tools/find-instagram-user-id
var instagram_base_url = "https://www.instagram.com/graphql/query/";
var following = "?query_hash=58712303d941c6855d4e888c5f0cd22f&variables=%7B%22id%22%3A%22" + user_id + "%22%2C%22first%22%3A24%7D"
var followers = "?query_hash=37479f2b8209594dde7facb0d904896a&variables=%7B%22id%22%3A%22" + user_id + "%22%2C%22first%22%3A24%7D"
var medias = "?query_hash=f2405b236d85e8296cf30347c9f08c2a&variables=%7B%22id%22%3A%22" + user_id + "%22%2C%22first%22%3A12%7D"
function insertFollowerCount() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(this.sheetName);
var followers = getFollowers();
var following = getFollowing();
var medias = getMedias();
var engagement = getEngagement(medias, followers);
sheet.appendRow([Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd"), followers, following, medias.count, engagement.totalLikes, engagement.totalComments, engagement.EngagementRatio]);
};
function getFollowers() {
return parseInt(fetch(instagram_base_url + followers)['data']['user']['edge_followed_by']['count']);
}
function getFollowing() {
return parseInt(fetch(instagram_base_url + following)['data']['user']['edge_follow']['count']);
}
function getMedias() {
return fetch(instagram_base_url + medias)['data']['user']['edge_owner_to_timeline_media'];
}
function getEngagement(medias, followers) {
var totalComments = 0,
totalLikes = 0;
for (var i = 0; i < 12; i++) {
totalComments += parseInt(medias.edges[i].node.edge_media_to_comment.count);
};
for (var l = 0; l < 12; l++) {
totalLikes += parseInt(medias.edges[l].node.edge_media_preview_like.count);
};
var engagementRatio = (((totalLikes + totalComments)) / followers) / 12;
return {
mediaCount: parseInt(medias.count),
totalComments: totalComments,
totalLikes: totalLikes,
EngagementRatio: engagementRatio
}
}
function fetch(url) {
var ignoreError = {
"muteHttpExcecptions": true
};
var source = UrlFetchApp.fetch(url, ignoreError).getContentText();
var data = JSON.parse(source);
return data;
}
@NickCrews
Copy link

In fetch(), there's a typo, muteHttpExcecptions is misspelled. The rest of the script isn't working for me, but still I thought it might be worth pointing that out if people are copy pasting snippets like I am.

@bbakalov
Copy link

I have found solution how to get correct "cookie" value, for the request.
Here is an article: https://thomas-strosse.medium.com/how-to-automatically-create-instagram-analytics-with-a-google-sheets-scripts-325ee5fa8e7e
Over there paragraph start from words "To get the cookie data, do the following:" steps 1-5

It was useful for me. Maybe it helps someone.

@syrinx32123 I have found solution. I'm not sure how long it will be working BUT it works now)

  1. Login to the instagram via browser (i'm using my usual everyday usage browser)
  2. Go to the API endpoint that you need via browser (example https://www.instagram.com/graphql/query/?query_hash=.....)
  3. Open browser console (in google chrome click F12) and go to the tab "Network"
  4. Reload the page with URL from step #2
  5. In the Network tab open request info and in the tab "Headers" you should find dropdown menu "Request headers", click on it and copy value from cookie section
  6. Go to your Google Script and modify function fetch(url)
function fetch(url) {
  var cookie = 'cookieValueFromTheStep#5';
  var header = {'Cookie':cookie};
  var opt = {
    muteHttpExcecptions: true,
    "headers":header
  };
  var source = UrlFetchApp.fetch(url, opt).getContentText();
  var data = JSON.parse(source);
  return data;
}
  1. Run script and be happy 🎉

If it was helpful, please subscribe to my IG account https://www.instagram.com/bbakalov/

@NickCrews
Copy link

Oh as a follow up, I ended up just using one of the many instagram APIs available from RapidAPI. Someone else already did the dirty work, figured this stuff out, and then gave an even easier to use API for us. Many of them have a free tier that was totally adequate for my needs.

@rancilyo
Copy link

Oh as a follow up, I ended up just using one of the many instagram APIs available from RapidAPI. Someone else already did the dirty work, figured this stuff out, and then gave an even easier to use API for us. Many of them have a free tier that was totally adequate for my needs.

Thanks for the info. But, how does it work? I have 0 skills as a programmer, lol.

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