Last active
August 19, 2020 06:23
-
-
Save PLhery/f4071f91d7c81b906ef8e173c26ab1f8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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