Skip to content

Instantly share code, notes, and snippets.

@abir-taheer
Last active June 4, 2024 12:24
Show Gist options
  • Save abir-taheer/0d3f1313def5eec6b78399c0fb69e4b1 to your computer and use it in GitHub Desktop.
Save abir-taheer/0d3f1313def5eec6b78399c0fb69e4b1 to your computer and use it in GitHub Desktop.
"This is our community, this is our family, these are our friends." https://www.youtube.com/watch?v=gk7iWgCk14U&t=425s
if (window.location.origin !== "https://www.instagram.com") {
window.alert(
"Hey! You need to be on the instagram site before you run the code. I'm taking you there now but you're going to have to run the code into the console again.",
);
window.location.href = "https://www.instagram.com";
console.clear();
}
const fetchOptions = {
credentials: "include",
headers: {
"X-IG-App-ID": "936619743392459",
},
method: "GET",
};
let username;
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const random = (min, max) => Math.floor(Math.random() * (max - min)) + min;
// This function handles all of the pagination logic
// Calls the API recursively until there are no more pages to load
const concatFriendshipsApiResponse = async (
list,
user_id,
count,
next_max_id = "",
) => {
let url = `https://www.instagram.com/api/v1/friendships/${user_id}/${list}/?count=${count}`;
if (next_max_id) {
url += `&max_id=${next_max_id}`;
}
const data = await fetch(url, fetchOptions).then((r) => r.json());
if (data.next_max_id) {
const timeToSleep = random(800, 1500);
console.log(
`Loaded ${data.users.length} ${list}. Sleeping ${timeToSleep}ms to avoid rate limiting`,
);
await sleep(timeToSleep);
return data.users.concat(
await concatFriendshipsApiResponse(
list,
user_id,
count,
data.next_max_id,
),
);
}
return data.users;
};
// helper methods to make the code a bit more readable
const getFollowers = (user_id, count = 50, next_max_id = "") => {
return concatFriendshipsApiResponse("followers", user_id, count, next_max_id);
};
const getFollowing = (user_id, count = 50, next_max_id = "") => {
return concatFriendshipsApiResponse("following", user_id, count, next_max_id);
};
const getUserId = async (username) => {
let user = username;
const lower = user.toLowerCase();
const url = `https://www.instagram.com/api/v1/web/search/topsearch/?context=blended&query=${lower}&include_reel=false`;
const data = await fetch(url, fetchOptions).then((r) => r.json());
const result = data.users?.find(
(result) => result.user.username.toLowerCase() === lower,
);
return result?.user?.pk || null;
};
const getUserFriendshipStats = async (username) => {
const user_id = await getUserId(username);
if (!user_id) {
throw new Error(`Could not find user with username ${username}`);
}
const followers = await getFollowers(user_id);
const following = await getFollowing(user_id);
const followersUsernames = followers.map((follower) =>
follower.username.toLowerCase(),
);
const followingUsernames = following.map((followed) =>
followed.username.toLowerCase(),
);
const followerSet = new Set(followersUsernames);
const followingSet = new Set(followingUsernames);
console.log(Array(28).fill("-").join(""));
console.log(
`Fetched`,
followerSet.size,
"followers and ",
followingSet.size,
" following.",
);
console.log(
`If this doesn't seem right then some of the output might be inaccurate`,
);
const PeopleIDontFollowBack = Array.from(followerSet).filter(
(follower) => !followingSet.has(follower),
);
const PeopleNotFollowingMeBack = Array.from(followingSet).filter(
(following) => !followerSet.has(following),
);
return {
PeopleIDontFollowBack,
PeopleNotFollowingMeBack,
};
};
// Make sure you don't delete the quotes
// Replace "example_username" below with your instagram username
//
// Change this:
username = "example_username";
//
//
//
getUserFriendshipStats(username).then(console.log);
@cchoi928
Copy link

Hi, I don't think it's working again, the code stops loading followers halfway through and Instagram logs me out when I refresh to do it again, just letting you know

@fpookie
Copy link

fpookie commented May 27, 2024

can you make one of these for tiktok please!! :)

@skideron
Copy link

as of right now doesn't work

@camball
Copy link

camball commented May 31, 2024

Just worked for me—thank ya! Following/follower counts were 100% correct. Unfollowed ~30 people over the span of an hour or so after seeing the results of the script, so I don't suspect my account will get suspended as that's a fairly large time frame, but let's keep fingers crossed. This is the only solution I'd trust these days for getting these numbers, all the apps where you put in your credentials are a straight shot to getting suspended (happened to me in the past).

@miamiamiaaaaa
Copy link

not working... stays at loaded 20 followers ish

@miamiamiaaaaa
Copy link

plz help

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