为啥不使用 NodeJS 中的 API 就无法获取所有 Instagram 帖子

Posted

技术标签:

【中文标题】为啥不使用 NodeJS 中的 API 就无法获取所有 Instagram 帖子【英文标题】:Why can't I get all Instagram posts without using API in NodeJS为什么不使用 NodeJS 中的 API 就无法获取所有 Instagram 帖子 【发布时间】:2020-03-29 00:07:09 【问题描述】:

请注意,截至 2020 年 3 月,Instagram 发生了很大变化,因此,这个问题与以前的问题不同。 问题是我总是使用非 Instagram-API 方式获得 12 个帖子,而不是所有帖子。我遇到过很多解决方案,但它们现在都只返回 12 个帖子,即使是著名的:

https://www.instagram.com/instagram/?__a=1

这是我通过拥有 6282 个帖子的 instagram 帐户获得的结果:

我也尝试了以下技巧,但它也返回了 12 个帖子:

async function instagramPhotos () 
    // It will contain our photos' links
    const res = []
    
    try 
        const userInfoSource = await Axios.get('https://www.instagram.com/instagram/')

        // userInfoSource.data contains the html from Axios
        const jsonObject = userInfoSource.data.match(/<script type="text\/javascript">window\._sharedData = (.*)<\/script>/)[1].slice(0, -1)

        const userInfo = JSON.parse(jsonObject)
        // Retrieve only the first 10 results
        const mediaArray = userInfo.entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.edges
        for (let media of mediaArray) 
            const node = media.node
            
            // Process only if is an image
            if ((node.__typename && node.__typename !== 'GraphImage')) 
                continue
            

            // Push the thumbnail src in the array
            res.push(node.thumbnail_src)
        
     catch (e) 
        console.error('Unable to retrieve photos. Reason: ' + e.toString())
    
    
    return res

有许多 npm 模块声称它们可以在不使用 Instagram API 的情况下获取 feed,但最后它们只返回 12 个帖子,例如:(instagram-nodejs-without-api)

我运行以下代码,但我也只得到 12 个帖子

let Instagram = require('instagram-nodejs-without-api');
Instagram = new Instagram()

const username="instagram"
const password="123hola" 

Instagram.getCsrfToken().then((csrf) =>

  Instagram.csrfToken = csrf;
).then(() =>

  return Instagram.auth(username, password).then(sessionId =>
  
    Instagram.sessionId = sessionId

    return Instagram.getUserDataByUsername(username).then((t) =>
    
        console.log(t)
    )

  )
).catch(console.error);

我的下一步是对 Instagram 个人资料进行网络抓取,但特别是当图像在 6000 左右时,速度非常慢,是否有任何优雅的方法来获取这些帖子?我只想获取我的帖子,所以我不介意登录。

【问题讨论】:

【参考方案1】:

因为我需要从具体的个人资料中获取帖子,所以我在 chrome 浏览器中打开了个人资料,打开控制台并运行以下代码来获取所有帖子:

//LOOPING ALL (credit www.hamzadiaz.com)
let posts = []
setInterval(()=>
var inputs = document.getElementsByClassName('v1Nh3 kIKUG  _bz0w'); 
for(var i=0; i<inputs.length;i++) 
 if(!posts.includes(inputs[i].getElementsByTagName("a")[0].href))
    posts.push(inputs[i].getElementsByTagName("a")[0].href)
  

,500);

【讨论】:

服务器端有这样的解决方案吗? 是的,在 python 中使用 selenium scrapper 或在 Nodejs 中使用 puppeteer 并使用类似方法抓取所有帖子

以上是关于为啥不使用 NodeJS 中的 API 就无法获取所有 Instagram 帖子的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS,如何使用谷歌 api 获取带有刷新令牌的新令牌?

如何将两个参数传递给 Javascript/NodeJS 中的 API“获取”请求

nodejs入门API之path模块

为啥在 API 级别 30 上使用范围存储无法访问某些音频文件?

获取 API Gateway 传递的 Lambda (Nodejs) 中的 url 参数

为啥我无法在 Web Api 中获取标头?