TypeError:无法读取位于got.then.res

时间:2019-08-16 17:21:36

标签: javascript node.js promise

我玩了一个叫做instagram-profile-picture的程序包。

这是我使用的代码,直接来自npm网站示例:

const ipp = require('instagram-profile-picture');

ipp('9gag').then(user => {
  console.log(user);
  // => https://scontent-sit4-1.cdninstagram.com/7...jpg
});

这曾经是几天前我测试过的。

现在,突然出现此错误:

(node:1820) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'u
rl' of undefined
    at got.then.res (C:\Users\User1\Desktop\testing npm\node_modules\insta
gram-profile-picture\index.js:15:49)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
(node:1820) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This
error originated either by throwing inside of an async function without a catch
block, or by rejecting a promise which was not handled with .catch(). (rejection
 id: 1)
(node:1820) [DEP0018] DeprecationWarning: Unhandled promise rejections are depre
cated. In the future, promise rejections that are not handled will terminate the
 Node.js process with a non-zero exit code.

这很奇怪,因为我没有更改代码。

所以我尝试了新安装

npm init -> npm install instagram-profile-picture

然后我以前发布的代码相同,而从npm示例中我仍然直接遇到相同的错误。

2 个答案:

答案 0 :(得分:2)

因此,问题是因为您尚未登录。基本上instagram更改了查询API,如果您有活动的会话(已登录),它将显示更多信息,否则,它将显示更多信息。

因此,对于9gag,如果已登录:(只需粘贴相关部分)

{
  "user": {
    "pk": 259220806,
    "hd_profile_pic_url_info": {
      "url": "https://instagram.fbom20-1.fna.fbcdn.net/vp/777f85cb149a23d10da15f4af19ef407/5DE89E04/t51.2885-19/18645376_238828349933616_4925847981183205376_a.jpg?_nc_ht=instagram.fbom20-1.fna.fbcdn.net",
      "width": 512,
      "height": 512
    }
  },
  "status": "ok"
}

但是,如果您注销:

{
  "user": {
    "username": "9gag",
    "profile_pic_url": "https://instagram.fbom20-1.fna.fbcdn.net/vp/c91395418170cbb196a69ac9dea359a4/5DD372FE/t51.2885-19/s150x150/18645376_238828349933616_4925847981183205376_a.jpg?_nc_ht=instagram.fbom20-1.fna.fbcdn.net"
  },
  "status": "ok"
}

但是图书馆需要user.hd_profile_pic_url_info.url,即undefined

图书馆要使用柚木吗?

不幸的是,该代码中的代码非常简单,因为该库仅获取url,您需要找到一个提供某种身份验证的位置。

您可以签出node-instagram

EDIT2 :从库中调用的端点为https://i.instagram.com/api/v1/users/${userid}/info/,也许那里的库将支持此api。或者,您也可以使用API​​手动进行身份验证,然后自己点击该网址。

答案 1 :(得分:1)

您不需要整个npm模块。该API非常简单。

const https = require('https');

function getUserDetails(username) {
    return new Promise(done => {
        var data = [];
        https.get(`https://www.instagram.com/${username}/?__a=1`, resp => {
            resp.on('data', chunk => data.push(chunk));
            resp.on('end', () => {
                var json = JSON.parse(data.join(''));
                done(json.graphql.user);
            });
        });
    });
}

getUserDetails('9gag').then(user=>{
    var bio = user.biography;
    var full_name = user.full_name;
    var profile_pic = user.profile_pic_url;
    console.log(bio);
    console.log(full_name)
    console.log(profile_pic);
});