如何在不通过用户身份验证的情况下从Instagram获取用户的媒体?


175

我试图将用户最近的Instagram媒体放在侧边栏上。我正在尝试使用Instagram API来获取媒体。

http://instagram.com/developer/endpoints/users/

该文档说GET https://api.instagram.com/v1/users/<user-id>/media/recent/,但说要传递OAuth访问令牌。访问令牌表示代表用户执行操作的授权。我不希望用户登录Instagram在侧栏上看到它。他们甚至不需要拥有Instagram帐户。

例如,我可以不登录Instagram 即可访问http://instagram.com/thebrainscoop。我想通过API做到这一点。

在Instagram API中,未经用户身份验证的请求传递client_id而不是access_token。但是,如果尝试这样做,则会得到:

{
  "meta":{
    "error_type":"OAuthParameterException",
    "code":400,
    "error_message":"\"access_token\" URL parameter missing. This OAuth request requires an \"access_token\" URL parameter."
  }
}

那么,这不可能吗?在不要求用户先通过OAuth登录Instagram帐户的情况下,是否无法获取用户的最新(公共)媒体?


可以使用此插件,只需签出他们如何获取用户最新公共媒体的源代码,而无需要求用户登录他或她的instagram帐户。:D smashballoon.com/instagram-feed/demo 您只需要一个客户端ID,不需要访问令牌。:D
jehzlau '16

您需要进行身份验证,以便他们可以像每个大型API一样跟踪您并限制您的下载(费率...)。真实用户是公共的,而剪贴器/机器人是公共的,这通常与真实用户看到广告并直接使用该服务不同。
Christophe Roussy '18

1
这些方法都不起作用。见stackoverflow.com/questions/49852080/...
Moradnejad

Answers:


123

这已经很晚了,但是如果它可以帮助某人,那是值得的,因为我在Instagram的文档中没有看到它。

https://api.instagram.com/v1/users/<user-id>/media/recent/(在撰写本文时)执行GET,实际上您不需要OAuth访问令牌。

你可以表演 https://api.instagram.com/v1/users/[USER ID]/media/recent/?client_id=[CLIENT ID]

[客户ID]是通过管理客户端在应用中注册的有效客户端ID(与用户无关)。您可以通过执行GET用户搜索请求从用户名中获取[USER ID]: https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]


9
我认为他们可能又改变了主意。我收到与OP中所示相同的错误响应
2014年

35
这仅对2015年11月17日之前创建的应用有效,并且在2016年6月之后将完全不受支持。之后,您将需要oauth access_token。instagram.com/developer/changelog
Dax Fohl 2015年

211
这是如此愚蠢和令人讨厌。他们为什么要强制访问令牌仅显示已公开的图像?我几乎不想为世界上的每个用户冲洗它们,我只想显示客户的最新insta,而不必花很多时间弄乱它。加!
马特·弗莱彻

8
@Cabus速率限制,伙伴。
沃尔夫

20
@MattFletcher现在变得更加愚蠢,必须经过应用程序权限审查,并且不确定是否可行,因为这种用例“在自己的网页上显示客户自己的供稿”不是用例之一。h,这些限制糟透了。
Ciantic

334

var name = "smena8m";
$.get("https://images"+~~(Math.random()*3333)+"-focus-opensocial.googleusercontent.com/gadgets/proxy?container=none&url=https://www.instagram.com/" + name + "/", function(html) {
if (html) {
    var regex = /_sharedData = ({.*);<\/script>/m,
        json = JSON.parse(regex.exec(html)[1]),
        edges = json.entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.edges;

      $.each(edges, function(n, edge) {
          var node = edge.node;
          $('body').append(
              $('<a/>', {
              href: 'https://instagr.am/p/'+node.shortcode,
              target: '_blank'
          }).css({
              backgroundImage: 'url(' + node.thumbnail_src + ')'
          }));
      });
    }
});
html, body {
  font-size: 0;
  line-height: 0;
}

a {
  display: inline-block;
  width: 25%;
  height: 0;
  padding-bottom: 25%;
  background: #eee 50% 50% no-repeat;
  background-size: cover;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

您可以使用下载JSON格式的任何用户的Instagram照片进?__a=1旁边的着陆页网址这样。无需获取用户ID或注册应用,无需令牌,无需oAuth。

min_idmax_id变量可以用于分页,这是示例

YQL可能无法在已插入iframe中使用,因此您始终可以在YQL控制台中手动对其进行检查

2018年4月更新:在instagram最新更新之后,您将无法在客户端(javascript)上执行此操作,因为由于CORS Access-Control-Allow-Headers限制而无法使用javascript设置已签名请求的自定义标头。它仍然可以通过做这个php或任何其他服务器端方法与基于适当的签名rhx_giscsrf_token和请求参数。您可以在此处了解更多信息。

2019年1月更新:YQL已退休,因此,请使用Google Image Proxy作为CORSInstagram页面的代理检查我的最新更新!然后只有负时刻-此方法无法使用分页。

PHP 解:

    $html = file_get_contents('https://instagram.com/apple/');
    preg_match('/_sharedData = ({.*);<\/script>/', $html, $matches);
    $profile_data = json_decode($matches[1])->entry_data->ProfilePage[0]->graphql->user;

14
@ 350D您是怎么找到这个的?我在他们的文档中找不到任何地方。我只想阅读更多有关此端点的可能信息(例如,EG正方形图像与非正方形,是否计划在六月结束,等等)-谢谢!
Phil Johnston

8
@Phil Johnston只是一项研究😀再进行一项研究-您可以在照片着陆页URL旁边添加/ media /?size = L并获取全分辨率照片。
350D

9
@ user2659694我终于找到了使用此方法可以获取下一页的解决方案,您可以使用/ media /?max_id = [MAX_ID]
Reza

3
仅供参考,这似乎仅在您自己登录Instagram帐户时有效。尝试在Chrome或类似设备中的隐身模式下执行此操作,您将看到JSON响应中没有任何项目。我试图将其合并到脚本中以获取Web服务器上的URL列表,并且不得不返回到旧的授权方法。
Ryan Zink

9
@RyanZink您是否尝试使用私人帐户?它适合我注销或隐姓埋名的公共帐户。
瑞安

40

2017年11月11日
由于Instagram更改了其提供此数据的方式,因此上述方法均无法使用。这是获取用户媒体的新方法:
GET https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
其中:
query_id-永久值:17888483320059182(请注意,将来可能会更改)。
id-用户的ID。它可能附带用户列表。要获取用户列表,您可以使用以下请求:GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
first-要获取的项目数量。
after-最后一个项目的ID(如果您想从该ID获得项目)。


您能告诉我从哪里获取用户的query_id和id吗?
Vijaysinh Parmar

2
我提到的@VijaysinhParmar query_id是永久值。这意味着它始终为17888483320059182(至少除非Instagram对其进行更改)。用户
ID-

1
我不记得确切地在互联网上的某个地方。但我与Instagram没有任何关系,因此如果它发生变化,我将无法告诉您新的消息:(
Footniko

1
想知道这种方法的速率限制策略是什么?
kkzxak47

1
如果有人对通过CURL请求请求此URL有问题,则需要获取cookie请求标头(运行url后,打开“网络”标签,复制cookie标头并将其粘贴到curl请求标头中。如果不这样做,您将收到403拒绝访问错误)。
安德斯

38

使用以下API,无需身份验证即可获得用户的最新媒体信息(包括描述,喜欢,评论数)。

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

例如

https://www.instagram.com/{username}/?__a=1

1
这对我也有用。但是当“ is_video = true”时,数据中没有视频网址。
didikee

4
正确,您只能获取缩略图(而不是视频本身)-不幸的是,我没有为此找到任何官方文档,并且我不知道此API是否已弃用或将支持多长时间。
迈克尔

8
截至2018-04-13,这似乎不再起作用。也许是由于Facebook最新的Cambridge Analytica数据丑闻,他们正在收紧一切。还有其他建议,无需身份验证即可获取基本用户数据?
BakerStreetSystems

2
是的,曾经有一段时间该API无法正常工作-但现在又回来了
Michael

4
它对我有用,但仅在我登录Instagram时有效。
zundi

16

截至上周,Instagram禁用了/media/URL,我实施了一种变通方法,目前该方法很好用。

为了解决此线程中每个人的问题,我编写了以下代码:https : //github.com/whizzzkid/instagram-reverse-proxy

它使用以下端点提供instagram的所有公共数据:

获取用户媒体:

https://igapi.ga/<username>/media
e.g.: https://igapi.ga/whizzzkid/media 

获取具有限制计数的用户媒体:

https://igapi.ga/<username>/media?count=N // 1 < N < 20
e.g.: https://igapi.ga/whizzzkid/media?count=5

使用JSONP:

https://igapi.ga/<username>/media?callback=foo
e.g.: https://igapi.ga/whizzzkid/media?callback=bar

代理API还会将下一页和上一页URL追加到响应中,因此您无需在最后进行计算。

希望你们喜欢!

感谢@ 350D发现了这个:)


1
@rex,直到他们改变事物的运行方式,我们才是好人!他们没有在过去的三年里打扰,可能他们不会在接下来的3
打扰

3
@whizzzkid运气不好,他们改变了。我看到您认为用户端点可以完成任务,但是对于未登录用户的请求有一定的限制。有任何想法吗?
nobilik

1
@nobilik解决方法到位,igpi.ga / whizzzkid / media?count = 3igpi.ga/graphql/query/?user_id=1606740656&count=3都应返回您的数据。请记住,这些URL禁用了未定义的引荐来源网址。
whizzzkid

1
@whizzzkid-正常工作!非常感谢-您是学者和绅士!
詹姆斯·特里奇

1
我收到“推荐人被拒绝访问”错误。也许这不再起作用了?
khalid13

14

Instagram API需要通过OAuth进行用户身份验证才能访问用户的最新媒体终结点。现在似乎没有其他方法可以为用户获取所有媒体。


4
如果我想在自己的网站上显示自己的媒体,这没有任何意义,为什么我需要每个想要看到它的人都拥有instagram帐户?
ninjasense 2013年

5
ninjasense-我不认为这是这样的。我认为您的网站中需要包含一些代码,这些代码将使用提供的oauth凭据查询Instagram API,以提取媒体。然后,您将向您的网站的任何用户显示媒体。您的网站将是唯一需要通过Instagram进行身份验证的东西。
比尔·罗林森

9

如果您正在寻找一种生成用于单个帐户的访问令牌的方法,则可以尝试以下方法-> https://coderwall.com/p/cfgneq

我需要一种使用instagram api来获取特定帐户的所有最新媒体的方法。


5
最后,这差不多是我要做的:创建一个新帐户,为其创建访问令牌,并将该令牌存储在API密钥旁边的服务器配置中。但是,对于JS应用程序来说,这是一个糟糕的解决方案,因为它需要将您的访问令牌传送给用户(我已经看到了很多示例代码)。对我来说幸运的是,我可以在服务器端做到这一点。
Peeja

4
@CraigHeneveld您如何使帽子access_token保持最新状态?它对你还没到期吗?
Ryan Ore 2013年

令牌会过期吗?
Monitus

如果我的记忆为我服务,则只有在您更改密码后密钥才会失效。下面是对此事的另一个话题- > stackoverflow.com/questions/22753170/...
克雷格Heneveld

我们如何获得多张用户照片?就像我们可以传递以“,”分隔的多个用户ID一样吗?
Aadil Keshwani '16

9

这是Rails解决方案。这是后门,实际上是前门。

# create a headless browser
b = Watir::Browser.new :phantomjs
uri = 'https://www.instagram.com/explore/tags/' + query
uri = 'https://www.instagram.com/' + query if type == 'user'

b.goto uri

# all data are stored on this page-level object.
o = b.execute_script( 'return window._sharedData;')

b.close

您取回的对象取决于是用户搜索还是标签搜索而有所不同。我得到这样的数据:

if type == 'user'
  data = o[ 'entry_data' ][ 'ProfilePage' ][ 0 ][ 'user' ][ 'media' ][ 'nodes' ]
  page_info = o[ 'entry_data' ][ 'ProfilePage' ][ 0 ][ 'user' ][ 'media' ][ 'page_info' ]
  max_id = page_info[ 'end_cursor' ]
  has_next_page = page_info[ 'has_next_page' ]
else
  data = o[ 'entry_data' ][ 'TagPage' ][ 0 ][ 'tag' ][ 'media' ][ 'nodes' ]
  page_info = o[ 'entry_data' ][ 'TagPage' ][ 0 ][ 'tag' ][ 'media' ][ 'page_info' ]
  max_id = page_info[ 'end_cursor' ]
  has_next_page = page_info[ 'has_next_page' ]
end

然后,我通过以下方式构造网址来获得另一页结果:

  uri = 'https://www.instagram.com/explore/tags/' + query_string.to_s\
    + '?&max_id=' + max_id.to_s
  uri = 'https://www.instagram.com/' + query_string.to_s + '?&max_id='\
    + max_id.to_s if type === 'user'

这个解决方案对我来说很有效,但是我遇到了一些麻烦。加载数据后,我的Rails服务器(使用Rails 5.0.0,Puma 3.6.0服务器)会莫名其妙地重启。
路易斯·爱德华多·罗哈斯·卡布雷拉

8

由于Instagram的API架构不断变化(并且经过精心设计),因此自2018年4月起,以上大多数功能将不再起作用。

如果您直接使用https://www.instagram.com/username/?__a=1方法查询各个帖子的API,则这是访问各个帖子数据的最新路径。

假设返回的JSON数据是$data您可以使用以下路径示例遍历每个结果:

foreach ($data->graphql->user->edge_owner_to_timeline_media->edges as $item) {

    $content_id = $item->node->id; 
    $date_posted = $item-node->taken_at_timestamp;
    $comments = $item->node->edge_media_to_comment->count;
    $likes = $item->node->edge_liked_by->count;
    $image = $item->node->display_url;
    $content = $item->node->edge_media_to_caption->edges[0]->node->text;
    // etc etc ....
}

最近发生的变化中的主要内容是graphqledge_owner_to_timeline_media

看起来他们将在2018年12月终止针对非``商业''客户的API访问,因此请在可能的情况下充分利用它。

希望它可以帮助某人;)


这对我有帮助,我只想向客户显示最新的instagram帖子。谢谢!
weston deboer

1
instagram.com/username/?__a=1现在出现错误:拒绝访问www.instagram.com您无权查看此页面。HTTP ERROR 403还有其他想法吗?
Hese

1
是的Instagram现在已经消除了这一点。“为了不断提高Instagram用户的隐私和安全性,我们正在加速淘汰Instagram API平台,并立即生效以下更改。我们了解这可能会影响您的业务或服务,感谢您在确保平台安全方面的支持。这些功能将立即被禁用(之前设置为2018年7月31日或2018年12月11日弃用)
香料

如果我所读的内容正确,将不再可能从任何“非商业”帐户中检索图像或数据。他们完全杀死了平台API。我猜就是那样了... instagram.com/developer/changelog
spice

1
@james_tookey不会成为伴侣。由于其新的隐私限制,它将不再能够查询或检索个人帐户的用户/数据,而只能用于企业帐户。基本上,他们只是取消了个人帐户的所有API使用。
香料

7

JSFiddle

Javascript:

$(document).ready(function(){

    var username = "leomessi";
    var max_num_items = 5;

    var jqxhr = $.ajax( "https://www.instagram.com/"+username+"/?__a=1" ).done(function() {
        //alert( "success" );
    }).fail(function() {
        //alert( "error" );
    }).always(function(data) {
        //alert( "complete" )
        items = data.graphql.user.edge_owner_to_timeline_media.edges;
        $.each(items, function(n, item) {
            if( (n+1) <= max_num_items )
            {
                var data_li = "<li><a target='_blank' href='https://www.instagram.com/p/"+item.node.shortcode+"'><img src='" + item.node.thumbnail_src + "'/></a></li>";
                $("ul.instagram").append(data_li);
            }
        });

    });

});

HTML:

<ul class="instagram">
</ul>

CSS:

ul.instagram {
    list-style: none;
}

ul.instagram li {
  float: left;
}

ul.instagram li img {
    height: 100px;
}

5

只想添加到@ 350D答案,因为这让我很难理解。

接下来是我的代码逻辑:

首次调用API时,我仅调用https://www.instagram.com/_vull_ /media/。收到响应时,我检查的布尔值more_available。如果为真,则从数组中获取最后一张照片,获取其ID,然后再次调用Instagram API https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433

这里要知道的重要一点是,此ID是数组中最后一张图片的ID。因此,当使用数组中图片的最后一个ID询问maxId时,您将获得下20张图片,依此类推。

希望这可以澄清事情。


4

如果您绕过Oauth,您可能不会知道他们是哪个instagram用户。话虽这么说,但有几种方法可以获取未经身份验证的instagram图像。

  1. Instagram的API可让您无需验证即可查看用户的最受欢迎图片。使用以下端点:这是链接

  2. Instagram在为标签提供rss feed 。

  3. Instagram用户页面是公共的,因此您可以将PHP与CURL一起使用来获取其页面,并使用DOM解析器在html中搜索所需的图像标签。


9
似乎已经过时了。
Burak Tokak 2015年

是否有可能绕过身份验证Instagram的
杰克

3

还有一个窍门,通过标签搜索照片:

GET https://www.instagram.com/graphql/query/?query_hash=3e7706b09c6184d5eafd8b032dbcf487&variables={"tag_name":"nature","first":25,"after":""}

哪里:

query_hash -永久值(我相信其17888483320059182的哈希值,以后可以更改)

tag_name -标题不言而喻

first -要获取的项目数量(我不知道为什么,但是此值不能按预期方式工作。返回的实际照片数量略大于该值乘以4.5(值25约为110,而值460约为460)。价值100))

after-最后一个项目的ID(如果您想从该ID获得项目)。end_cursorJSON响应的值可在此处使用。


您如何找到这个?
ekntrtmz


2

您可以使用此API来检索用户Instagram的公共信息:
https://api.lityapp.com/instagrams/thebrainscoop?limit=2

如果不设置的限制参数,该职位由默认为12限于

此您可以在代码中看到,api是在SpringBoot中使用HtmlUnit制作的:

public JSONObject getPublicInstagramByUserName(String userName, Integer limit) {
    String html;
    WebClient webClient = new WebClient();

    try {
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setJavaScriptEnabled(false);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getCookieManager().setCookiesEnabled(true);

        Page page = webClient.getPage("https://www.instagram.com/" + userName);
        WebResponse response = page.getWebResponse();

        html = response.getContentAsString();
    } catch (Exception ex) {
        ex.printStackTrace();

        throw new RuntimeException("Ocorreu um erro no Instagram");
    }

    String prefix = "static/bundles/es6/ProfilePageContainer.js";
    String sufix = "\"";
    String script = html.substring(html.indexOf(prefix));

    script = script.substring(0, script.indexOf(sufix));

    try {
        Page page = webClient.getPage("https://www.instagram.com/" + script);
        WebResponse response = page.getWebResponse();

        script = response.getContentAsString();
    } catch (Exception ex) {
        ex.printStackTrace();

        throw new RuntimeException("Ocorreu um erro no Instagram");
    }

    prefix = "l.pagination},queryId:\"";

    String queryHash = script.substring(script.indexOf(prefix) + prefix.length());

    queryHash = queryHash.substring(0, queryHash.indexOf(sufix));
    prefix = "<script type=\"text/javascript\">window._sharedData = ";
    sufix = ";</script>";
    html = html.substring(html.indexOf(prefix) + prefix.length());
    html = html.substring(0, html.indexOf(sufix));

    JSONObject json = new JSONObject(html);
    JSONObject entryData = json.getJSONObject("entry_data");
    JSONObject profilePage = (JSONObject) entryData.getJSONArray("ProfilePage").get(0);
    JSONObject graphql = profilePage.getJSONObject("graphql");
    JSONObject user = graphql.getJSONObject("user");
    JSONObject response = new JSONObject();

    response.put("id", user.getString("id"));
    response.put("username", user.getString("username"));
    response.put("fullName", user.getString("full_name"));
    response.put("followedBy", user.getJSONObject("edge_followed_by").getLong("count"));
    response.put("following", user.getJSONObject("edge_follow").getLong("count"));
    response.put("isBusinessAccount", user.getBoolean("is_business_account"));
    response.put("photoUrl", user.getString("profile_pic_url"));
    response.put("photoUrlHD", user.getString("profile_pic_url_hd"));

    JSONObject edgeOwnerToTimelineMedia = user.getJSONObject("edge_owner_to_timeline_media");
    JSONArray posts = new JSONArray();

    try {
        loadPublicInstagramPosts(webClient, queryHash, user.getString("id"), posts, edgeOwnerToTimelineMedia, limit == null ? 12 : limit);
    } catch (Exception ex) {
        ex.printStackTrace();

        throw new RuntimeException("Você fez muitas chamadas, tente mais tarde");
    }

    response.put("posts", posts);

    return response;
}

private void loadPublicInstagramPosts(WebClient webClient, String queryHash, String userId, JSONArray posts, JSONObject edgeOwnerToTimelineMedia, Integer limit) throws IOException {
    JSONArray edges = edgeOwnerToTimelineMedia.getJSONArray("edges");

    for (Object elem : edges) {
        if (limit != null && posts.length() == limit) {
            return;
        }

        JSONObject node = ((JSONObject) elem).getJSONObject("node");

        if (node.getBoolean("is_video")) {
            continue;
        }

        JSONObject post = new JSONObject();

        post.put("id", node.getString("id"));
        post.put("shortcode", node.getString("shortcode"));

        JSONArray captionEdges = node.getJSONObject("edge_media_to_caption").getJSONArray("edges");

        if (captionEdges.length() > 0) {
            JSONObject captionNode = ((JSONObject) captionEdges.get(0)).getJSONObject("node");

            post.put("caption", captionNode.getString("text"));
        } else {
            post.put("caption", (Object) null);
        }

        post.put("photoUrl", node.getString("display_url"));

        JSONObject dimensions = node.getJSONObject("dimensions");

        post.put("photoWidth", dimensions.getLong("width"));
        post.put("photoHeight", dimensions.getLong("height"));

        JSONArray thumbnailResources = node.getJSONArray("thumbnail_resources");
        JSONArray thumbnails = new JSONArray();

        for (Object elem2 : thumbnailResources) {
            JSONObject obj = (JSONObject) elem2;
            JSONObject thumbnail = new JSONObject();

            thumbnail.put("photoUrl", obj.getString("src"));
            thumbnail.put("photoWidth", obj.getLong("config_width"));
            thumbnail.put("photoHeight", obj.getLong("config_height"));
            thumbnails.put(thumbnail);
        }

        post.put("thumbnails", thumbnails);
        posts.put(post);
    }

    JSONObject pageInfo = edgeOwnerToTimelineMedia.getJSONObject("page_info");

    if (!pageInfo.getBoolean("has_next_page")) {
        return;
    }

    String endCursor = pageInfo.getString("end_cursor");
    String variables = "{\"id\":\"" + userId + "\",\"first\":12,\"after\":\"" + endCursor + "\"}";

    String url = "https://www.instagram.com/graphql/query/?query_hash=" + queryHash + "&variables=" + URLEncoder.encode(variables, "UTF-8");
    Page page = webClient.getPage(url);
    WebResponse response = page.getWebResponse();
    String content = response.getContentAsString();
    JSONObject json = new JSONObject(content);

    loadPublicInstagramPosts(webClient, queryHash, userId, posts, json.getJSONObject("data").getJSONObject("user").getJSONObject("edge_owner_to_timeline_media"), limit);
}


这是一个响应示例:

{
  "id": "290482318",
  "username": "thebrainscoop",
  "fullName": "Official Fan Page",
  "followedBy": 1023,
  "following": 6,
  "isBusinessAccount": false,
  "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/447ffd0262082f373acf3d467435f130/5C709C77/t51.2885-19/11351770_612904665516559_678168252_a.jpg",
  "photoUrlHD": "https://scontent-gru2-1.cdninstagram.com/vp/447ffd0262082f373acf3d467435f130/5C709C77/t51.2885-19/11351770_612904665516559_678168252_a.jpg",
  "posts": [
    {
      "id": "1430331382090378714",
      "shortcode": "BPZjtBUly3a",
      "caption": "If I have any active followers anymore; hello! I'm Brianna, and I created this account when I was just 12 years old to show my love for The Brain Scoop. I'm now nearly finished high school, and just rediscovered it. I just wanted to see if anyone is still active on here, and also correct some of my past mistakes - being a child at the time, I didn't realise I had to credit artists for their work, so I'm going to try to correct that post haste. Also; the font in my bio is horrendous. Why'd I think that was a good idea? Anyway, this is a beautiful artwork of the long-tailed pangolin by @chelsealinaeve . Check her out!",
      "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/ab823331376ca46136457f4654bf2880/5CAD48E4/t51.2885-15/e35/16110915_400942200241213_3503127351280009216_n.jpg",
      "photoWidth": 640,
      "photoHeight": 457,
      "thumbnails": [
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/43b195566d0ef2ad5f4663ff76d62d23/5C76D756/t51.2885-15/e35/c91.0.457.457/s150x150/16110915_400942200241213_3503127351280009216_n.jpg",
          "photoWidth": 150,
          "photoHeight": 150
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/ae39043a7ac050c56d741d8b4355c185/5C93971C/t51.2885-15/e35/c91.0.457.457/s240x240/16110915_400942200241213_3503127351280009216_n.jpg",
          "photoWidth": 240,
          "photoHeight": 240
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/ae7a22d09e3ef98d0a6bbf31d621a3b7/5CACBBA6/t51.2885-15/e35/c91.0.457.457/s320x320/16110915_400942200241213_3503127351280009216_n.jpg",
          "photoWidth": 320,
          "photoHeight": 320
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/1439dc72b70e7c0c0a3afcc30970bb13/5C8E2923/t51.2885-15/e35/c91.0.457.457/16110915_400942200241213_3503127351280009216_n.jpg",
          "photoWidth": 480,
          "photoHeight": 480
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/1439dc72b70e7c0c0a3afcc30970bb13/5C8E2923/t51.2885-15/e35/c91.0.457.457/16110915_400942200241213_3503127351280009216_n.jpg",
          "photoWidth": 640,
          "photoHeight": 640
        }
      ]
    },
    {
      "id": "442527661838057235",
      "shortcode": "YkLJBXJD8T",
      "caption": null,
      "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/dc94b38da679826b9ac94ccd2bcc4928/5C7CDF93/t51.2885-15/e15/11327349_860747310663863_2105199307_n.jpg",
      "photoWidth": 612,
      "photoHeight": 612,
      "thumbnails": [
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/c1153c6513c44a6463d897e14b2d8f06/5CB13ADD/t51.2885-15/e15/s150x150/11327349_860747310663863_2105199307_n.jpg",
          "photoWidth": 150,
          "photoHeight": 150
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/47e60ec8bca5a1382cd9ac562439d48c/5CAE6A82/t51.2885-15/e15/s240x240/11327349_860747310663863_2105199307_n.jpg",
          "photoWidth": 240,
          "photoHeight": 240
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/da0ee5b666ab40e4adc1119e2edca014/5CADCB59/t51.2885-15/e15/s320x320/11327349_860747310663863_2105199307_n.jpg",
          "photoWidth": 320,
          "photoHeight": 320
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/02ee23571322ea8d0992e81e72f80ef2/5C741048/t51.2885-15/e15/s480x480/11327349_860747310663863_2105199307_n.jpg",
          "photoWidth": 480,
          "photoHeight": 480
        },
        {
          "photoUrl": "https://scontent-gru2-1.cdninstagram.com/vp/dc94b38da679826b9ac94ccd2bcc4928/5C7CDF93/t51.2885-15/e15/11327349_860747310663863_2105199307_n.jpg",
          "photoWidth": 640,
          "photoHeight": 640
        }
      ]
    }
  ]
}

可以通过我的userid(PK)获取数据
SAURABH RATHOD

对不起,我尝试过@SAURABHRATHOD,但我没有找到一种方法。如果有人解决这个问题,我将感到非常高兴。感谢您的评论。
Ruan Barroso

2

我真的需要此功能,但对于Wordpress。我适合而且效果很好

<script>
    jQuery(function($){
        var name = "caririceara.comcariri";
        $.get("https://images"+~~(Math.random()*33)+"-focus-opensocial.googleusercontent.com/gadgets/proxy?container=none&url=https://www.instagram.com/" + name + "/", function(html) {
            if (html) {
                var regex = /_sharedData = ({.*);<\/script>/m,
                  json = JSON.parse(regex.exec(html)[1]),
                  edges = json.entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.edges;
              $.each(edges, function(n, edge) {
                   if (n <= 7){
                     var node = edge.node;
                    $('.img_ins').append('<a href="https://instagr.am/p/'+node.shortcode+'" target="_blank"><img src="'+node.thumbnail_src+'" width="150"></a>');
                   }
              });
            }
        });
    }); 
    </script>


1

下面的nodejs代码从Instagram页面抓取流行的图片。函数“ ScrapeInstagramPage”负责后期效果。

var request = require('parse5');
var request = require('request');
var rp      = require('request-promise');
var $       = require('cheerio'); // Basically jQuery for node.js 
const jsdom = require("jsdom");    
const { JSDOM } = jsdom;


function ScrapeInstagramPage (args) {
    dout("ScrapeInstagramPage for username -> " + args.username);
    var query_url = 'https://www.instagram.com/' + args.username + '/';

    var cookieString = '';

    var options = {
        url: query_url,
        method: 'GET',
        headers: {
            'x-requested-with' : 'XMLHttpRequest',
            'accept-language'  : 'en-US,en;q=0.8,pt;q=0.6,hi;q=0.4', 
            'User-Agent'       : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
            'referer'          : 'https://www.instagram.com/dress_blouse_designer/',
            'Cookie'           : cookieString,
            'Accept'           : '*/*',
            'Connection'       : 'keep-alive',
            'authority'        : 'www.instagram.com' 
        }
    };


    function dout (msg) {
        if (args.debug) {
            console.log(msg);
        }
    }

    function autoParse(body, response, resolveWithFullResponse) {
        // FIXME: The content type string could contain additional values like the charset. 
        // Consider using the `content-type` library for a robust comparison. 
        if (response.headers['content-type'] === 'application/json') {
            return JSON.parse(body);
        } else if (response.headers['content-type'] === 'text/html') {
            return $.load(body);
        } else {
            return body;
        }
    }

    options.transform = autoParse;


    rp(options)
        .then(function (autoParsedBody) {
            if (args.debug) {
                console.log("Responce of 'Get first user page': ");
                console.log(autoParsedBody);
                console.log("Creating JSDOM from above Responce...");
            }

            const dom = new JSDOM(autoParsedBody.html(), { runScripts: "dangerously" });
            if (args.debug) console.log(dom.window._sharedData); // full data doc form instagram for a page

            var user = dom.window._sharedData.entry_data.ProfilePage[0].user;
            if (args.debug) {
                console.log(user); // page user
                console.log(user.id); // user ID
                console.log(user.full_name); // user full_name
                console.log(user.username); // user username
                console.log(user.followed_by.count); // user followed_by
                console.log(user.profile_pic_url_hd); // user profile pic
                console.log(autoParsedBody.html());
            }

            if (user.is_private) {
                dout ("User account is PRIVATE");
            } else {
                dout ("User account is public");
                GetPostsFromUser(user.id, 5000, undefined);
            }
        })
        .catch(function (err) {
            console.log( "ERROR: " + err );
        });  

    var pop_posts = [];
    function GetPostsFromUser (user_id, first, end_cursor) {
        var end_cursor_str = "";
        if (end_cursor != undefined) {
            end_cursor_str = '&after=' + end_cursor;
        }

        options.url = 'https://www.instagram.com/graphql/query/?query_id=17880160963012870&id=' 
                        + user_id + '&first=' + first + end_cursor_str;

        rp(options)
            .then(function (autoParsedBody) {
                if (autoParsedBody.status === "ok") {
                    if (args.debug) console.log(autoParsedBody.data);
                    var posts = autoParsedBody.data.user.edge_owner_to_timeline_media;

                    // POSTS processing
                    if (posts.edges.length > 0) {
                        //console.log(posts.edges);
                        pop_posts = pop_posts.concat
                        (posts.edges.map(function(e) {
                            var d = new Date();
                            var now_seconds = d.getTime() / 1000;

                            var seconds_since_post = now_seconds - e.node.taken_at_timestamp;
                            //console.log("seconds_since_post: " + seconds_since_post);

                            var ageing = 10; // valuses (1-10]; big value means no ageing
                            var days_since_post = Math.floor(seconds_since_post/(24*60*60));
                            var df = (Math.log(ageing+days_since_post) / (Math.log(ageing)));
                            var likes_per_day = (e.node.edge_liked_by.count / df);
                            // console.log("likes: " + e.node.edge_liked_by.count);
                            //console.log("df: " + df);
                            //console.log("likes_per_day: " + likes_per_day);
                            //return (likes_per_day > 10 * 1000);
                            var obj = {};
                            obj.url = e.node.display_url;
                            obj.likes_per_day = likes_per_day;
                            obj.days_since_post = days_since_post;
                            obj.total_likes = e.node.edge_liked_by.count;
                            return obj;
                        }
                        ));

                        pop_posts.sort(function (b,a) {
                          if (a.likes_per_day < b.likes_per_day)
                            return -1;
                          if (a.likes_per_day > b.likes_per_day)
                            return 1;
                          return 0;
                        });

                        //console.log(pop_posts);

                        pop_posts.forEach(function (obj) {
                            console.log(obj.url);
                        });
                    }

                    if (posts.page_info.has_next_page) {
                        GetPostsFromUser(user_id, first, posts.page_info.end_cursor);
                    }
                } else {
                    console.log( "ERROR: Posts AJAX call not returned good..." );
                }
            })
            .catch(function (err) {
                console.log( "ERROR: " + err );
            }); 
    }
}


ScrapeInstagramPage ({username : "dress_blouse_designer", debug : false});

试试吧 在这里

示例:对于给定的URL'https: //www.instagram.com/dress_blouse_designer/ ',可以调用函数

ScrapeInstagramPage ({username : "dress_blouse_designer", debug : false});

我只能看到前12个帖子,如何才能获得所有帖子?
rahul gawale 18/12/26

0

使用简单的ajax调用并迭代图像路径即可使用。

        var name = "nasa";
        $.get("https://www.instagram.com/" + name + "/?__a=1", function (data, status) {
            console.log('IG_NODES', data.user.media.nodes);
            $.each(data.user.media.nodes, function (n, item) {
                console.log('ITEMS', item.display_src);
                $('body').append(
                    "<div class='col-md-4'><img class='img-fluid d-block' src='" + item.display_src + "'></div>"
                );
            });
        })

它对我有用,但仅在我登录Instagram时有效。
zundi

-1

这是一个PHP脚本,可下载图像并创建带有图像链接的html文件。信誉350D为php版本,这只是详细说明了。我建议您将其作为一项Cron工作,并根据需要经常解雇。截至2019年5月已通过验证

<?
$user = 'smena8m';
$igdata = file_get_contents('https://instagram.com/'.$user.'/');
preg_match('/_sharedData = ({.*);<\/script>/',$igdata,$matches);
$profile_data = json_decode($matches[1])->entry_data->ProfilePage[0]->graphql->user;
$html = '<div class="instagramBox" style="display:inline-grid;grid-template-columns:auto auto auto;">';
$i = 0;
$max = 9;
while($i<$max){
    $imglink = $profile_data->edge_owner_to_timeline_media->edges[$i]->node->shortcode;
    $img = $profile_data->edge_owner_to_timeline_media->edges[$i]->node->thumbnail_resources[0]->src;
    file_put_contents('ig'.$i.'.jpg',file_get_contents($img));
    $html .= '<a href="https://www.instagram.com/p/'.$imglink.'/" target="_blank"><img src="ig'.$i.'.jpg" /></a>';
    $i++;
}
$html .= '</div>';
$instagram = fopen('instagram.html','w');
fwrite($instagram,$html);
fclose($instagram);
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.