Programing

사용자 인증없이 Instagram에서 사용자 미디어를 얻으려면 어떻게해야합니까?

crosscheck 2020. 5. 29. 07:57
반응형

사용자 인증없이 Instagram에서 사용자 미디어를 얻으려면 어떻게해야합니까?


사용자의 최근 Instagram 미디어를 사이드 바에 넣으려고합니다. Instagram API를 사용하여 미디어를 가져 오려고합니다.

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

설명서에는 GET https://api.instagram.com/v1/users/<user-id>/media/recent/이 있지만 OAuth 액세스 토큰을 전달한다고 나와 있습니다. 액세스 토큰은 사용자를 대신하여 행동 할 수있는 권한을 나타냅니다. 사이드 바에서 이것을 볼 수 있도록 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의 문서에서 보지 못해서 누군가를 돕는다면 늦었지만 가치가 있습니다.

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]

[CLIENT ID]는 클라이언트 관리 (사용자와 무관)를 통해 앱에 등록 된 유효한 클라이언트 ID입니다. GET 사용자 검색 요청을 수행하여 username에서 [USER ID]를 얻을 수 있습니다.https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]


var name = "smena8m";
$.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) {
          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>

이와 같은?__a=1 방문 페이지 주소 옆을 사용하여 Instagram 사용자 사진 피드를 JSON 형식으로 다운로드 할 수 있습니다 . 사용자 ID를 얻거나 앱을 등록 할 필요가 없으며 토큰이나 oAuth가 없습니다.

min_idmax_id변수 매김에 사용될 수 있으며, 여기에서

YQL잠긴 iframe 내부에서 작동하지 않을 수 있으므로 YQL 콘솔 에서 언제든지 수동으로 확인할 수 있습니다

2018 년 4 월 업데이트 : 최신 인스 타 그램 업데이트 후 서명 된 요청에 대한 사용자 정의 헤더를 CORS Access-Control-Allow-Headers제한 으로 인해 자바 스크립트로 설정할 수 없으므로 클라이언트 측 (자바 스크립트) 에서이 작업을 수행 할 수 없습니다 . 가능성은 여전히 통해이를 수행하는 php적절한 서명에 기초하여 또는 다른 서버 측에있어서 rhx_gis, csrf_token요청 파라미터. 자세한 내용은 여기를 참조 하십시오 .

2019 년 1 월 업데이트 : YQL이 종료되었으므로 CORSInstagram 페이지의 프록시로 Google 이미지 프록시를 사용한 최신 업데이트를 확인 하십시오! 그런 다음이 방법으로는 부정적인 순간 만 – 페이지 매김을 사용할 수 없습니다.

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;

11.11.2017
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입니다.


인증없이 다음 API를 사용하여 사용자의 최신 미디어를 얻을 수있었습니다 (설명, 좋아요, 댓글 수 포함).

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

예 :

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

지난 주에 Instagram은 /media/URL을 비활성화 했으며 해결 방법을 구현했으며 현재로서는 잘 작동합니다.

이 스레드에서 모든 사람의 문제를 해결하기 위해 다음과 같이 썼습니다 : https://github.com/whizzzkid/instagram-reverse-proxy

다음 엔드 포인트를 사용하여 인스 타 그램의 모든 공개 데이터를 제공합니다.

사용자 미디어 가져 오기 :

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에게 감사합니다 :)


Instagram API는 사용자의 최신 미디어 엔드 포인트에 액세스하려면 OAuth를 통한 사용자 인증이 필요합니다. 현재 사용자를위한 모든 미디어를 얻는 다른 방법은 없습니다.


단일 계정에서 사용하기 위해 액세스 토큰을 생성하는 방법을 찾고 있다면 https://coderwall.com/p/cfgneq를 시도 하십시오 .

인스 타 그램 API를 사용하여 특정 계정의 모든 최신 미디어를 가져 오는 방법이 필요했습니다.


다음은 레일 솔루션입니다. 백도어의 일종인데, 실제로는 정문입니다.

# 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

그런 다음 다음과 같은 방법으로 URL을 구성하여 다른 결과 페이지를 얻습니다.

  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'

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입니다.

DEC 2018 에서 비 '비즈니스'고객을 위해이 API 액세스를 중단 할 것으로 보이므로 최대한 활용하십시오.

그것이 누군가를 돕기를 바랍니다.)


내가 이해하기 어려웠 기 때문에 @ 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 개의 그림 등이 표시됩니다.

이것이 명확하게되기를 바랍니다.


JSFiddle

자바 스크립트 :

$(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;
}

Oauth를 무시하면 인스 타 그램 사용자가 누구인지 모를 것입니다. 그것은 인증없이 인스 타 그램 이미지를 얻는 몇 가지 방법이 있다고합니다.

  1. Instagram의 API를 사용하면 인증하지 않고도 사용자에게 가장 인기있는 이미지를 볼 수 있습니다. 다음 엔드 포인트 사용 : 여기 링크

  2. Instagram 은이 태그에 대한 RSS 피드를 제공합니다 .

  3. Instagram 사용자 페이지는 공개되어 있으므로 CURL과 함께 PHP를 사용하여 페이지를 가져오고 DOM 파서는 HTML에서 원하는 이미지 태그를 검색 할 수 있습니다.


또 하나의 트릭, 해시 태그로 사진 검색 :

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)보다 약간 큽니다. 값 100))

after-해당 ID에서 항목을 가져 오려는 경우 마지막 항목의 ID입니다. end_cursorJSON 응답의 값을 여기에서 사용할 수 있습니다.


글쎄, /?__a=1지금까지 작업이 중단되었으므로 curl을 사용 하고 로그인 할 필요없이 인스 타 그램 페이지 액세스를 생성 하는 것이 더 좋습니다 .


당신은 인스 타 그램 사용자의 공개 정보를 검색하기 위해이 API를 사용할 수 있습니다
https://api.lityapp.com/instagrams/thebrainscoop?limit=2을

당신이 제한 매개 변수를 설정하지 않으면 게시물은 기본적으로 12에서 제한된다

이 api는 코드에서 볼 수 있듯이 HtmlUnit을 사용하여 SpringBoot에서 작성되었습니다.

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
        }
      ]
    }
  ]
}

나는이 기능이 정말로 필요했지만 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>

아래 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});

이것은 간단한 아약스 호출과 반복 이미지 경로를 사용하여 작동합니다.

        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>"
                );
            });
        })

다음은 이미지를 다운로드하고 이미지 링크가 포함 된 html 파일을 생성하는 PHP 스크립트입니다. PHP 버전에 대한 크레딧 350D, 이것은 정교합니다 .. 이것은 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);
?>

참고 URL : https://stackoverflow.com/questions/17373886/how-can-i-get-a-users-media-from-instagram-without-authenticating-as-a-user

반응형