Instagram API - 如何检索用户在Instagram上关注的人员列表

时间:2015-09-04 23:20:15

标签: instagram instagram-api

我想知道如何检索用户在Instagram上关注的人员列表。这是因为这个特定用户是我关注的人。所以我可以在Instagram应用程序上访问他/她的照片和他的粉丝。

如何使用Instagram API执行此操作?这是合法的吗?

8 个答案:

答案 0 :(得分:28)

Shiva的回答不再适用。 API调用" / users / {user-id} /跟随" Instagram不支持一段时间(2016年被禁用)。

有一段时间,您只能通过" / users / self / follow" 端点获得您自己的关注者/关注者,但Instagram在2018年4月禁用该功能(与剑桥Analytica问题)。你可以read about it here

据我所知(目前),没有可用的服务(官方或非官方),您可以获得用户的关注者/关注者(甚至是您自己的)。

答案 1 :(得分:13)

您可以使用以下Instagram API端点来获取用户关注的人员列表。

https://api.instagram.com/v1/users/{user-id}/follows?access_token=ACCESS-TOKEN

以下是该端点的完整文档。 GET /users/user-id/follows

这是执行该端点的示例响应。 enter image description here

由于此端点需要user-id(而非user-name),因此您可能需要调用/users/search端点用户名,然后从响应中获取用户ID并将其传递到上面的/users/user-id/follows端点以获取关注者列表。

IANAL,但考虑到它在API中的记录,并查看使用条款,我看不出这样做是不合法的。

答案 2 :(得分:10)

这是一种仅通过浏览器和一些复制粘贴即可获得用户关注的人的方法(基于Deep Seeker回答的纯JavaScript解决方案):

  1. 获取用户的ID(在浏览器中,导航至https://www.instagram.com/user_name/?__a=1,然后寻找响应-> graphql->用户-> ID [来自Deep Seeker的答案])

  2. 打开另一个浏览器窗口

  3. 打开浏览器控制台并将其粘贴到其中

    options = {
        userId: your_user_id,
        list: 1 //1 for following, 2 for followers
    }

  4. 更改为您的用户ID,然后按Enter键

  5. 将此内容粘贴到控制台中,然后按Enter

    `https://www.instagram.com/graphql/query/?query_hash=c76146de99bb02f6415203be841dd25a&variables=` + encodeURIComponent(JSON.stringify({
            "id": options.userId,
            "include_reel": true,
            "fetch_mutual": true,
            "first": 50
        }))

  6. 导航到输出链接

(这将设置http请求的标头。如果您尝试在未打开该脚本的页面上运行脚本,则它将无法正常工作。)

  1. 在刚打开的页面的控制台中,粘贴此内容并按Enter
    let config = {
      followers: {
        hash: 'c76146de99bb02f6415203be841dd25a',
        path: 'edge_followed_by'
      },
      following: {
        hash: 'd04b0a864b4b54837c0d870b0e77e076',
        path: 'edge_follow'
      }
    };
    
    var allUsers = [];
    
    function getUsernames(data) {
        var userBatch = data.map(element => element.node.username);
        allUsers.push(...userBatch);
    }
    
    async function makeNextRequest(nextCurser, listConfig) {
        var params = {
            "id": options.userId,
            "include_reel": true,
            "fetch_mutual": true,
            "first": 50
        };
        if (nextCurser) {
            params.after = nextCurser;
        }
        var requestUrl = `https://www.instagram.com/graphql/query/?query_hash=` + listConfig.hash + `&variables=` + encodeURIComponent(JSON.stringify(params));
    
        var xhr = new XMLHttpRequest();
        xhr.onload = function(e) {
            var res = JSON.parse(xhr.response);
    
            var userData = res.data.user[listConfig.path].edges;
            getUsernames(userData);
    
            var curser = "";
            try {
                curser = res.data.user[listConfig.path].page_info.end_cursor;
            } catch {
    
            }
            var users = [];
            if (curser) {
                makeNextRequest(curser, listConfig);
            } else {
                var printString =""
                allUsers.forEach(item => printString = printString + item + "\n");
                console.log(printString);
            }
        }
    
        xhr.open("GET", requestUrl);
        xhr.send();
    }
    
    if (options.list === 1) {
    
        console.log('following');
        makeNextRequest("", config.following);
    } else if (options.list === 2) {
    
        console.log('followers');
        makeNextRequest("", config.followers);
    }

几秒钟后,它应该输出您的用户关注的用户列表。

答案 3 :(得分:6)

最近几天,我一直在为chrome开发一些Instagram扩展程序,然后我开始进行锻炼:

首先,您需要知道,如果用户个人资料是公开的,或者您已经登录并且正在关注该用户,则可以使用此功能。

我不确定为什么会这样工作,但是登录时可能设置了一些cookie,这些cookie会在获取私有配置文件时在后端进行检查。

现在,我将与您分享一个ajax示例,但是如果您不使用jquery,可以找到其他更适合您的示例。

此外,您会注意到我们有两个query_hash值用于关注者和关注者,而其他查询则不同。

let config = {
  followers: {
    hash: 'c76146de99bb02f6415203be841dd25a',
    path: 'edge_followed_by'
  },
  followings: {
    hash: 'd04b0a864b4b54837c0d870b0e77e076',
    path: 'edge_follow'
  }
};

您可以以https://www.instagram.com/user_name/?__a=1的身份从response.graphql.user.id获得的用户ID

之后只是您收到的第一部分用户的响应,因为每个请求限制为50个用户:

let after = response.data.user[list].page_info.end_cursor

let data = {followers: [], followings: []};

function getFollows (user, list = 'followers', after = null) {
  $.get(`https://www.instagram.com/graphql/query/?query_hash=${config[list].hash}&variables=${encodeURIComponent(JSON.stringify({
    "id": user.id,
    "include_reel": true,
    "fetch_mutual": true,
    "first": 50,
    "after": after
  }))}`, function (response) {
    data[list].push(...response.data.user[config[list].path].edges);
    if (response.data.user[config[list].path].page_info.has_next_page) {
      setTimeout(function () {
        getFollows(user, list, response.data.user[config[list].path].page_info.end_cursor);
      }, 1000);
    } else if (list === 'followers') {
      getFollows(user, 'followings');
    } else {
      alert('DONE!');
      console.log(followers);
      console.log(followings);
    }
  });
}

您可能可以在instagram网站之外使用此网站,但我没有尝试过,您可能需要一些标头来匹配instagram页面中的标头。

如果您需要这些标头一些其他数据,则可能会发现window._sharedData JSON中来自带有csrf令牌等后端的JSON。

您可以使用以下方法来捕获它:

let $script = JSON.parse(document.body.innerHTML.match(/<script type="text\/javascript">window\._sharedData = (.*)<\/script>/)[1].slice(0, -1));

那是我的全部!

希望它可以帮助您!

答案 4 :(得分:4)

Instagram的REST API已停产。但是您可以使用GraphQL获得所需的数据。您可以在此处找到概述:https://developers.facebook.com/docs/instagram-api

答案 5 :(得分:3)

我根据Caitlin Morris's answer采取了自己的方式来获取Instagram上的所有关注者和关注者。只需复制此代码,粘贴到浏览器控制台中,然后等待几秒钟即可。

您需要使用instagram.com标签中的浏览器控制台才能使其正常工作。

let username = 'USERNAME'
let followers = [], followings = []
try {
  let res = await fetch(`https://www.instagram.com/${username}/?__a=1`)

  res = await res.json()
  let userId = res.graphql.user.id

  let after = null, has_next = true
  while (has_next) {
    await fetch(`https://www.instagram.com/graphql/query/?query_hash=c76146de99bb02f6415203be841dd25a&variables=` + encodeURIComponent(JSON.stringify({
      id: userId,
      include_reel: true,
      fetch_mutual: true,
      first: 50,
      after: after
    }))).then(res => res.json()).then(res => {
      has_next = res.data.user.edge_followed_by.page_info.has_next_page
      after = res.data.user.edge_followed_by.page_info.end_cursor
      followers = followers.concat(res.data.user.edge_followed_by.edges.map(({node}) => {
        return {
          username: node.username,
          full_name: node.full_name
        }
      }))
    })
  }
  console.log('Followers', followers)

  has_next = true
  after = null
  while (has_next) {
    await fetch(`https://www.instagram.com/graphql/query/?query_hash=d04b0a864b4b54837c0d870b0e77e076&variables=` + encodeURIComponent(JSON.stringify({
      id: userId,
      include_reel: true,
      fetch_mutual: true,
      first: 50,
      after: after
    }))).then(res => res.json()).then(res => {
      has_next = res.data.user.edge_follow.page_info.has_next_page
      after = res.data.user.edge_follow.page_info.end_cursor
      followings = followings.concat(res.data.user.edge_follow.edges.map(({node}) => {
        return {
          username: node.username,
          full_name: node.full_name
        }
      }))
    })
  }
  console.log('Followings', followings)
} catch (err) {
  console.log('Invalid username')
}

答案 6 :(得分:1)

还有另一种方法可以做到这一点。 Instapy 为我们提供了一组 API 来执行此操作。

这是一个可以用于此的简单代码。我们需要传递我们需要的数量关注者,如果我们需要所有关注者列表,我们需要传递full作为数量的参数值。包含列表的文件将存储在本地。

只需执行一个简单的 pip install 命令即可。

pip install instapy 

示例代码

from instapy import InstaPy

user = <Username>
password = <password>
gecko_path = <geckodriver path>
#instapy uses this internally
session = InstaPy(username=user, password=password,geckodriver_path= gecko_path)
session.login()
followers = session.grab_followers(username=user,amount=40)
print(followers)
following = session.grab_following(username=user,amount=40)
print(following)
session.end()

链接到其文档:https://instapy.org/

答案 7 :(得分:0)

您可以使用Phantombuster。 Instagram设置了速率限制,因此您将不得不使用多个帐户或等待15分钟才能进行下一次运行。