Skip to content

Instantly share code, notes, and snippets.

@PLhery
Last active August 19, 2020 06:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PLhery/f4071f91d7c81b906ef8e173c26ab1f8 to your computer and use it in GitHub Desktop.
Save PLhery/f4071f91d7c81b906ef8e173c26ab1f8 to your computer and use it in GitHub Desktop.
import { IgApiClient } from 'instagram-private-api';
import * as dotenv from 'dotenv';
import {AccountFollowersFeedResponseUsersItem} from "instagram-private-api/dist/responses";
dotenv.config({ path: __dirname+'/.env' });
const username = process.env.IG_USERNAME as string;
const password = process.env.IG_PASSWORD as string;
const INTERVAL_BETWEEN_CHECKS = 15000; // in ms
interface INinjaUser {
username: string;
instagramUser: AccountFollowersFeedResponseUsersItem;
followers: number[];
}
const ninjaUsers: {[key: number]: INinjaUser} = {};
const ig = new IgApiClient();
async function checkUnfollowers(instaUser: AccountFollowersFeedResponseUsersItem) {
console.log(`checking ${instaUser.username} unfollowers...`);
const followersFeed = ig.feed.accountFollowers(instaUser.pk);
const followers = await followersFeed.items();
const newFollowersIds = new Set(followers.map(user => user.pk));
const ninjaUser = ninjaUsers[instaUser.pk];
if (ninjaUser) {
const formerFollowers = ninjaUser.followers;
const unfollowers = formerFollowers.filter(id => !newFollowersIds.has(id));
for (const unfollowerId of unfollowers) {
const unfollower = await ig.user.info(unfollowerId);
console.log(`Someone unfollowed ${ninjaUser.username} : ${unfollowerId} ${unfollower.username}`);
const [ thread ] = await ig.feed.directInbox().records();
await thread.broadcastText(`Someone unfollowed ${ninjaUser.username} : ${unfollower.username}`);
}
}
ninjaUsers[instaUser.pk] = {
username: instaUser.username,
instagramUser: instaUser,
followers: followers.map(follower => follower.pk),
}
}
async function loginAndRun() {
console.log('logging in...');
ig.state.generateDevice(String(process.env.IG_USERNAME));
await ig.simulate.preLoginFlow();
const loggedInUser = await ig.account.login(username, password);
await ig.simulate.postLoginFlow();
await run(loggedInUser.pk);
}
async function run(userId: number) {
console.log('checking all unfollowers');
// Create UserFeed instance to get loggedInUser's posts
const usersFeed = ig.feed.accountFollowers(userId);
const users = await usersFeed.items();
for (const instaUser of users) {
await checkUnfollowers(instaUser);
}
setTimeout(() => run(userId).catch(err => console.error(err.stack)), INTERVAL_BETWEEN_CHECKS);
}
loginAndRun().catch(err => console.error(err.stack));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment