instagram-private-api icon indicating copy to clipboard operation
instagram-private-api copied to clipboard

ig.feed.accountFollowers does not yield correct followers list when requesting on another accounnt

Open khalilacheche opened this issue 5 years ago • 8 comments

Bug Report

Form

Put an [x] if you meet the condition, else leave [ ].

Requirements

  • [x] I've searched the Issues
  • [x] I've read the basic concepts
  • [x] I'm using the latest version
  • [ ] I've debugged my code using the DEBUG variable.

Platform

  • [x] I'm using Node.js version 10.13.0
  • [ ] I'm using electron
  • [ ] I'm using the browser YOUR_BROWSER_AND_VERSION
  • [ ] I'm using some other environment YOUR_ENV

Description

YOUR DESCRIPTION HERE Hello, it seems that I'm having an issue while trying to get the full followers list of an account, from a different account. I used the items() function to retrieve the data in a while loop that checks if there's more availbale data. When I check the resulting followers list, I get the correct number of followers (length of the items array), however, when I inspect the list elements, I get different results from call to call (whilst being sure there are no updates on the real followers list on instagram), with duplicate usernames in the list. However, this issue doesn't appear when I user this same method to check the followers list of the same account. I tried setting the maxId manually, as I thought there might be an issue with pagination, but it doesn't seem to solve the problem. I don't know if this is a bug, or if I'm not using something the right way, so if you could help me, that would be awesome :) !

Code

Add a meaningful section of your code here. If you are using TypeScript replace js with typescript.

  const ig = new IgApiClient();
  ig.state.generateDevice(*username*);
  //ig.state.proxyUrl = process.env.IG_PROXY;
  const auth = await ig.account.login(*username*, *password*);
  const followersFeed = ig.feed.accountFollowers(*different account pk*);
  var items = []
  do{
    const a  = await followersFeed.items();
    items = items.concat(a)
  }while(followersFeed.isMoreAvailable())

khalilacheche avatar Dec 04 '20 16:12 khalilacheche

Same problem here!

My code:

import { AccountFollowersFeedResponseUsersItem, IgApiClient } from 'instagram-private-api'

async function getFollowers(ig: IgApiClient, id: number) {
  let followers = ig.feed.accountFollowers(id)
  let result: AccountFollowersFeedResponseUsersItem[] = []
  let currentPage: AccountFollowersFeedResponseUsersItem[] = []

  do {
    currentPage = await followers.items()
    result = [...result, ...currentPage]
  } while (followers.isMoreAvailable())

  return result
}

;(async () => {
  const ig = new IgApiClient()
  const auth = await login(ig, IG_USERNAME, IG_PASSWORD)

  if (auth) {
    const userToStalk = 'xxxx'
    const id = await ig.user.getIdByUsername(userToStalk)
    const followersResults = await getFollowers(ig, id)
  }
})()

jesusvallez avatar Dec 22 '20 17:12 jesusvallez

I don't know if this is a bug

It may be a bug, but probably not with this library. Kepp in mind, it just returns the data Instagram returns. It's probably hard to count in the app, but when looking through the requests of the app, try counting the items. You'll probably find the same issue. So this library can't do much about this.

Nerixyz avatar Dec 22 '20 18:12 Nerixyz

It may be a bug, but probably not with this library. Kepp in mind, it just returns the data Instagram returns. It's probably hard to count in the app, but when looking through the requests of the app, try counting the items. You'll probably find the same issue. So this library can't do much about this.

The number of followers is correct but when I list users... some are duplicated

EDIT: @khalilacheche, dirty workaround:

  let iterator = 1
  const times = 3
  let followersResultsLength = 0
  let followersResults: string[] = []

  do {
    const rawData = await getFollowers(ig, idToStalk)
    const rawDataName = rawData.map((user) => user.username).sort()
    followersResultsLength = rawData.length
    followersResults = [...followersResults, ...rawDataName]
    iterator++
  } while (iterator <= times)

  followersResults = followersResults.filter((e, i, a) => a.indexOf(e) === i)
  followersResultsLength === followersResults.length ? console.log('DONE') : console.log('FAIL')

jesusvallez avatar Dec 22 '20 18:12 jesusvallez

I have the same problem.

Apparently the next_max_id property is not returned by the '/api/v1/friendships/${this.id}/followers/' endpoint.

Any suggestion?

kadupenido avatar Apr 08 '21 01:04 kadupenido

Does the official application deals with this bug repeating the requests a few times?

DrRek avatar Oct 20 '21 14:10 DrRek

i have the same problem. Any solution?

pepinogttv avatar May 13 '22 20:05 pepinogttv

Same problem :/

miitchpls avatar May 15 '22 00:05 miitchpls

Same problem here too

albertosierramolleda avatar Apr 09 '23 19:04 albertosierramolleda