Kullanıcı kimliği doğrulanmadan bir kullanıcının medyasını Instagram'dan nasıl alabilirim?


175

Bir kullanıcının son Instagram medyasını bir kenar çubuğuna koymaya çalışıyorum. Medyayı almak için Instagram API'sını kullanmaya çalışıyorum.

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

Belgeler GET'e söylüyor https://api.instagram.com/v1/users/<user-id>/media/recent/, ancak bir OAuth erişim belirtecini geçtiğini söylüyor. Bir erişim belirteci, kullanıcı adına hareket etme yetkisini temsil eder. Kullanıcıların bunu kenar çubuğunda görmek için Instagram'a giriş yapmasını istemiyorum. Instagram hesabı olması bile gerekmez.

Örneğin, Instagram'a giriş yapmadan ve fotoğrafları görmeden http://instagram.com/thebrainscoop adresine gidebilirim . Bunu API ile yapmak istiyorum.

Instagram API'sında, kullanıcı kimliği doğrulanmamış istekler client_idyerine access_token. Eğer bunu denersem, alırım:

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

Peki, bu mümkün değil mi? Bir kullanıcıdan önce bir Instagram hesabına giriş yapmasını istemeden bir kullanıcının en son (herkese açık) medyasını getirmenin bir yolu yok mu?


Bu eklenti ile mümkündür, bir kullanıcıdan instagram hesabına giriş yapmasını istemeden bir kullanıcının en son kamu medyasını nasıl getirdiklerinin kaynak kodunu kontrol edin. : D smashballoon.com/instagram-feed/demo Sadece bir müşteri kimliğine ihtiyacınız var, erişim belirtecine gerek yok. : D
jehzlau

Her büyük API gibi sizi izleyebilmeleri ve indirmelerinizi (ücretler ...) sınırlayabilmeleri için kimlik doğrulamanız gerekir. Gerçek kullanıcılar için herkese açık ve sıyırıcılar / botlar için genel olan, genellikle gerçek kullanıcıların reklamları göreceği ve hizmeti doğrudan kullanacağı ile aynı değildir.
Christophe Roussy

1
Bu yöntemlerin hiçbiri artık çalışmıyor. Bkz. Stackoverflow.com/questions/49852080/…
Moradnejad

Yanıtlar:


123

Bu geç, ama Instagram'ın belgelerinde görmediğim gibi birine yardımcı olursa faydalıdır.

GET'i https://api.instagram.com/v1/users/<user-id>/media/recent/(şu anda yazarken) gerçekleştirmek için aslında OAuth erişim belirtecine ihtiyacınız yoktur.

Yapabilirsin https://api.instagram.com/v1/users/[USER ID]/media/recent/?client_id=[CLIENT ID]

[İSTEMCİ KİMLİĞİ], yönetim istemcileri aracılığıyla uygulamada kayıtlı geçerli müşteri kimliği olacaktır (kullanıcıyla hiçbir şekilde ilişkili değildir). GET kullanıcıları arama isteği gerçekleştirerek kullanıcı adından [USER ID] alabilirsiniz: https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]


9
Bence yine fikirlerini değiştirmiş olabilirler. OP'de gösterildiği gibi aynı hata yanıtını alıyorum
James

35
Bu yalnızca 17 Kasım 2015'ten önce oluşturulan uygulamalarda geçerlidir ve Haziran 2016'dan sonra desteklenmeyecektir. Bundan sonra oauth access_token'a ihtiyacınız olacaktır. instagram.com/developer/changelog
Dax Fohl

211
Bu çok aptalca ve rahatsız edici. Neden zaten açık olan görüntüleri görüntülemek için bir erişim belirtecini zorlarlar ? Onları dünyadaki her kullanıcı için durulamaya çalışmıyorum, sadece bir müşterinin en son insta'sunu saatlerce uğraşmak zorunda kalmadan görüntülemek istiyorum. Gah!
Matt Fletcher

8
@ Kabin hızı sınırları, dostum.
Walf

20
@MattFletcher artık daha aptalca, uygulama izni incelemesinden geçmeli ve bu uygulamanın "müşterinin kendi web sayfasında kendi özet akışını göstermesi" kullanım durumlarından biri olmadığı için mümkün olup olmadığından emin değilim. Duh, bu kısıtlamalar berbat.
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>

Herhangi bir Instagram kullanıcı fotoğrafı feed'ini, bunun gibi?__a=1 açılış sayfası adresinin yanında kullanarak JSON biçiminde indirebilirsiniz . Kullanıcı kimliği almanıza veya bir uygulamayı kaydetmenize gerek yok, jeton yok, oAuth yok.

min_idve max_iddeğişkenler sayfalama için kullanılabilir, işte örnek

YQLburada snip iframe içinde çalışmayabilir, böylece YQL Konsolu'nda her zaman manuel olarak kontrol edebilirsiniz

NİSAN 2018 GÜNCELLEME: En son instagram güncellemelerinden sonra, istemci tarafında (javascript) bunu yapamazsınız çünkü imzalı istek için özel başlıklar CORS Access-Control-Allow-Headerskısıtlamalar nedeniyle javascript ile ayarlanamaz . Hala mümkün ile bunu yapma phpdüzgün dayalı imzasıyla veya başka bir sunucu tarafı yönteminin rhx_gis, csrf_tokenve istek parametreleri. Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz .

OCAK 2019 GÜNCELLEME: YQL kullanımdan kaldırıldı, bu yüzden Google Image Proxy ile en son güncellememi CORSInstagram sayfası için proxy olarak kontrol edin ! O zaman sadece negatif moment - sayfalandırma bu yöntemle kullanılamaz.

PHP çözüm:

    $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 Bunu nasıl buldunuz? Belgelerinde hiçbir yerde bulamıyorum. Ben sadece bu uç nokta ile neler hakkında daha fazla okumak istiyorum (EG kare görüntüleri vs kare olmayan, bu Haziran ayında bitirmek için planları olup olmadığını, vb) - Teşekkürler!
Phil Johnston

8
@Phil Johnston Sadece bir araştırma 😀 Başka bir araştırma yapın - fotoğraf açılış sayfası URL'sinin yanına / media /? Size = L ekleyebilir ve TAM çözünürlükte fotoğraf alabilirsiniz.
350D

9
@ user2659694 Sonunda bu yöntemi kullanarak / media /? max_id = [MAX_ID]
Reza

3
Bilginize, bu yalnızca bir Instagram hesabına kendiniz giriş yapmışsanız işe yarar. Chrome veya benzerlerinde Gizli modda yapmayı deneyin; JSON yanıtında hiç öğe bulunmadığını görürsünüz. Bir web sunucusunda URL'lerin listesini almak için bir komut dosyasına dahil etmeye çalışıyordum ve eski yetkilendirme yöntemlerine geri dönmek zorunda kaldı.
Ryan Zink

9
@RyanZink Özel bir hesap mı deniyordunuz? Oturumu kapatmış veya herkese açık hesaplarda gizli çalışıyor.
ryan

41

11.11.2017
Instagram bu verileri sağlama şeklini değiştirdiğinden, yukarıdaki yöntemlerin hiçbiri günümüzde işe yaramıyor. Kullanıcının medyasını almanın yeni yolu:
GET https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
Nerede:
query_id- kalıcı değer: 17888483320059182 (gelecekte değiştirilebileceğini unutmayın).
id- kullanıcının kimliği. Kullanıcı listesi ile gelebilir. Kullanıcıların listesini almak için aşağıdaki isteği kullanabilirsiniz: GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
first- Alınacak eşya miktarı.
after- o kimlikten öğe almak istiyorsanız son öğenin kimliği.


Lütfen sorgu_kimliği ve kullanıcı kimliğini nereden edinebilir misiniz?
Vijaysinh Parmar

2
@VijaysinhParmar dediğim gibi query_idkalıcı bir değerdir. Bu her zaman 17888483320059182 olduğu anlamına gelir (en azından Instagram bunu değiştirmedikçe). kullanıcı kimliği - kullanıcının kimliği (cevabımı biraz düzenledi)
Footniko

1
Tam olarak hatırlamıyorum, internette bir yerlerde. Ama Instagram ile herhangi bir ilişkim yok, bu yüzden değişirse size
yenisini

1
Acaba bu yaklaşımın hız sınırlayıcı politikası nedir?
kkzxak47

1
Herhangi biri CURL isteği yoluyla bu URL'yi istemeyle ilgili sorun yaşıyorsa, çerez isteği başlığını almanız gerekir (URL'yi açtıktan sonra Ağlar sekmesini açın, çerez başlığını kopyalayın ve kıvırma isteği başlığına yapıştırın. Bunu yapmazsanız, 403 erişim reddedildi hatası alırsınız).
Anders

40

Kimlik doğrulama olmadan (açıklama, beğeni, yorum sayısı dahil) aşağıdaki API'yı kullanarak bir kullanıcının en son medyasını alabildim.

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

Örneğin

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

1
bu da benim için çalıştı. ama "is_video = true" olduğunda, verilerde video URL'si yok.
didikee

4
Doğru, sadece küçük resimleri (videonun kendisi değil) alabilirsiniz - ne yazık ki, bunun için resmi bir belge bulamadım ve bu API'nın kullanımdan kaldırılması veya ne kadar süre destekleneceği konusunda hiçbir fikrim yok.
Michael

8
2018-04-13 itibariyle, bu artık çalışmıyor gibi görünüyor. Belki de Facebook'un en yeni Cambridge Analytica veri skandalı nedeniyle, bir ton kadar sıkılaştırıyorlar. Kimlik doğrulama olmadan temel kullanıcı verilerini almak için başka önerileriniz var mı?
BakerStreetSystems

2
Evet, bu API'nın çalışmadığı bir zaman vardı - Ama şimdi tekrar geri döndü
Michael

4
Benim için çalıştı, ama sadece Instagram'da oturum açtığımda.
zundi

16

Geçen hafta itibarıyla Instagram /media/URL'leri devre dışı bıraktı, şimdilik iyi çalışan bir geçici çözüm uyguladım.

Bu konudaki herkesin sorunlarını çözmek için şunu yazdım: https://github.com/whizzzkid/instagram-reverse-proxy

Aşağıdaki uç noktaları kullanarak instagramın tüm genel verilerini sağlar:

Kullanıcı medyası alın:

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

Limit sayımına sahip kullanıcı medyası edinin:

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

JSONP kullanın:

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

Proxy API, yanıta sonraki sayfa ve önceki sayfa URL'lerini de ekler, böylece bunu sonunda hesaplamanız gerekmez.

Umarım beğenirsiniz!

@ 350D bu tespit için teşekkürler :)


1
@rex, işlerin sonunda nasıl çalıştığını değiştirene kadar iyiyiz! Son 3 yılda rahatsız etmediler, muhtemelen sonraki 3'te olmayacaklar.
whizzzkid

3
@whizzzkid Kötü şans, değiştirirler. Kullanıcı uç noktasının işleri yapacağını düşündüğünüzü gördüm, ancak oturum açmamış kullanıcı istekleri için sınırlar var. Herhangi bir fikir?
nobilik

1
@nobilik geçici çözüm mevcuttur, igpi.ga/whizzzkid/media?count=3 ve igpi.ga/graphql/query/?user_id=1606740656&count=3 her ikisi de size veri döndürmelidir. Unutmayın, bu URL'ler için tanımlanmamış yönlendirmeler devre dışı bırakıldı.
whizzzkid

1
@whizzzkid - Çalıştı! Çok teşekkürler - siz bir bilgin ve bir beyefendisiniz!
James Trickey

1
"Yönlendiren erişim reddedildi" hatası alıyorum. Belki bu artık işe yaramıyor?
khalid13

14

Instagram API, bir kullanıcının en son medya uç noktasına erişmek için OAuth aracılığıyla kullanıcı kimlik doğrulaması gerektirir. Şu anda bir kullanıcı için tüm ortamları almanın başka bir yolu yok gibi görünüyor.


4
Bu bir anlam ifade etmiyor, eğer kendi medyamı kendi web sitemde göstermek istiyorsam, neden instagram hesabına sahip olmasını isteyen herkese ihtiyacım var?
ninjasense

5
ninjasense - Böyle çalıştığını sanmıyorum. Web sitenizin, Instagram API'nızı medyanıza çekmek için sağlanan oauth kimlik bilgilerinizle sorgulayabilecek bir koda sahip olması gerektiğini düşünüyorum. Ardından medyanızı sitenizin herhangi bir kullanıcısına gösterirsiniz. Siteniz Instagram ile kimlik doğrulaması yapmak için gereken tek şey olurdu.
Bill Rawlinson

9

Tek bir hesapta kullanım için erişim belirteci oluşturmanın bir yolunu arıyorsanız, bunu deneyebilirsiniz -> https://coderwall.com/p/cfgneq .

Belirli bir hesap için en son medyayı almak için instagram api'yi kullanmanın bir yoluna ihtiyacım vardı.


5
Bu, sonunda yaptığım az çok şeydi: yeni bir hesap oluşturdu, onun için bir erişim belirteci oluşturdu ve bu belirteci API anahtarının yanındaki sunucu yapılandırmamda sakladı. Bu, JS uygulamaları için kötü bir çözümdür, çünkü erişim jetonunuzu kullanıcıya göndermeyi gerektirir (ki bu çok sayıda örnek kodun olduğunu gördüm). Neyse ki benim için bunu sunucu tarafında yapabilirim.
Peeja

4
@CraigHeneveld Şapka erişimini nasıl güncel tutuyorsunuz? Süresi geçmedi mi?
Ryan Ore

Simgenin süresi biraz doluyor mu?
Monitus

Hafızam bana hizmet ediyorsa, anahtar yalnızca parolanızı değiştirirseniz geçerliliğini kaybeder. İşte konuyla ilgili başka bir konu -> stackoverflow.com/questions/22753170/…
Craig Heneveld

Nasıl birden fazla kullanıcı fotoğrafı alabilirim? "," İle ayrılmış birden fazla kullanıcı kimliği geçirebilir miyiz?
Aadil Keshwani

9

İşte ray çözümleri. Aslında ön kapı olan bir tür arka kapı.

# 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

Geri aldığınız nesne, kullanıcı araması veya etiket araması olmasına bağlı olarak değişir. Ben böyle veri almak:

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

Daha sonra aşağıdaki şekilde bir url oluşturarak sonuçların başka bir sayfasını alıyorum:

  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'

bu çözüm benim için çalışıyor, ama bununla ilgili bazı sorunlar yaşıyorum. Verileri yükledikten sonra, raylar sunucum (Rails 5.0.0, Puma 3.6.0 sunucusu kullanarak) ucuz bir şekilde yeniden başlatılıyor ... Olası bir çözüm var mı?
Luis Eduardo Rojas Cabrera

8

Instagram'ın sürekli değişen (ve korkunç bir şekilde tasarlanmış) API şeması sayesinde yukarıdakilerin çoğu Nisan 2018'den itibaren çalışmayacak.

API'larını doğrudan https://www.instagram.com/username/?__a=1yöntemi kullanarak sorguluyorsanız, tek tek gönderi verilerine erişmenin en son yolu aşağıda verilmiştir .

Döndürülen JSONverileriniz, $dataaşağıdaki yol örneklerini kullanarak her bir sonuç arasında geçiş yapabileceğinizi varsayarsak :

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

Bu son değişiklikteki ana şeyler graphqlve edge_owner_to_timeline_media.

Görünüşe göre, Aralık 2018'de 'işletme dışı' müşteriler için bu API erişimini öldürecekler, bu yüzden mümkün olan en iyi şekilde yararlanın.

Umarım birine yardımcı olur;)


Bu bana yardımcı oldu, sadece bir müşteri için en son instagram yayınlarını göstermek istiyorum. Teşekkürler!
weston deboer

1
instagram.com/username/?__a=1 hata veriyor: www.instagram.com sitesine erişim reddedildi Bu sayfayı görüntüleme izniniz yok. HTTP HATA 403 başka fikir?
Hese

1
Yep Instagram şimdi bunu öldürdü. "Instagram kullanıcılarının gizliliğini ve güvenliğini sürekli olarak iyileştirmek için Instagram API Platformunun kullanımdan kaldırılmasını hızlandırıyoruz ve aşağıdaki değişiklikleri hemen etkili hale getiriyoruz. Bunun işinizi veya hizmetlerinizi etkileyebileceğini anlıyoruz ve platformumuzu güvende tutma desteğiniz için teşekkür ederiz. Bu özellikler hemen devre dışı bırakılacak (önceden 31 Temmuz 2018 veya 11 Aralık 2018 kullanımdan kaldırılma için ayarlanmıştır). "
baharat

Okuduğum şey doğruysa, artık herhangi bir "işletme dışı" hesaptan resim veya veri almak mümkün olmayacak. Platform API'sını tamamen öldürüyorlar. Sanırım bu o zaman ... instagram.com/developer/changelog
spice

1
@james_tookey mümkün olmayacak dostum. Yeni gizlilik kısıtlamaları nedeniyle, artık kişisel hesapların kullanıcılarını / verilerini sorgulayamayacak veya alamayacak. Temelde kişisel hesaplar için tüm API kullanımını öldürdüler.
baharat

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

Anlamak benim için zor olduğu için sadece @ 350D cevabına eklemek istiyorum.

Sıradaki mantığım şu:

API'yı ilk kez ararken, yalnızca arıyorum https://www.instagram.com/_vull_ /media/. Yanıt aldığımda, boole değerini kontrol ediyorum more_available. Doğruysa, diziden son fotoğrafı alıyorum, kimliğini alıyorum ve daha sonra bu kez Instagram API'sini tekrar çağırıyorum https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433.

Burada bilinmesi gereken önemli şey, bu Kimlik dizideki son resmin Kimliği'dir. Dizideki resmin son kimliğiyle maxId istendiğinde, sonraki 20 resmi alacaksınız.

Umarım bu şeyleri açıklığa kavuşturur.


4

Oauth'u atlarsanız, muhtemelen hangi instagram kullanıcısı olduklarını bilemezsiniz. Bununla birlikte, kimlik doğrulaması olmadan instagram görüntülerini almanın birkaç yolu vardır.

  1. Instagram'ın API'sı, kullanıcının en popüler görüntülerini kimlik doğrulaması yapmadan görüntülemenizi sağlar. Aşağıdaki uç noktayı kullanarak: İşte bağlantı

  2. Instagram at etiketleri için rss beslemeleri sağlar bu .

  3. Instagram kullanıcı sayfaları herkese açıktır, bu nedenle sayfalarını almak için CURL ile PHP'yi ve html'de istediğiniz resim etiketlerini aramak için bir DOM ayrıştırıcısını kullanabilirsiniz.


9
Eski görünüyor.
Burak Tokak

instagram için kimlik doğrulamasını atlamak mümkün
JAck

3

Bir numara daha, hashtag'lere göre fotoğraf arayın:

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

Nerede:

query_hash - kalıcı değer (17888483320059182 karmasının olduğuna inanıyorum, gelecekte değiştirilebilir)

tag_name - başlık kendisini anlatır

first - Alınacak eşya miktarı (nedenini bilmiyorum, ancak bu değer beklendiği gibi çalışmıyor. Döndürülen fotoğrafların gerçek sayısı, 4.5 ile çarpılan değerden biraz daha fazladır (25 değeri için yaklaşık 110 ve değer 100))

after- o kimlikten öğe almak istiyorsanız son öğenin kimliği. Değeri end_cursorJSON yanıtından burada kullanılabilir.


Bunu nasıl buldun?
ekntrtmz



2

Sen instagram kullanıcının kamu bilgi almak için bu API kullanabilirsiniz:
https://api.lityapp.com/instagrams/thebrainscoop?limit=2

Eğer sınır parametresini ayarlayın yoksa, mesajlar varsayılan tarafından 12'de sınırlıdır

This Api, kodda gördüğünüz gibi HtmlUnit ile SpringBoot'ta yapıldı:

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


Bu bir yanıt örneğidir:

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

(pk) ile veri alabilir miyim
SAURABH RATHOD

Üzgünüm @ SAURABHRATHOD Denedim ama bunu yapmanın bir yolunu bulamadım. Birisi bunu çözerse çok memnun olurum. Yorum için teşekkürler.
Ruan Barroso

2

Bu işleve gerçekten ihtiyacım vardı ama Wordpress için. Uyuyorum ve mükemmel çalıştı

<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

Aşağıdaki nodejs kodu bir Instagram Sayfasından popüler Görüntüleri kazımaktadır. 'ScrapeInstagramPage' işlevi, yaşlanma sonrası etki ile ilgilenir.

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

Burada deneyin

Örnek: ' https://www.instagram.com/dress_blouse_designer/ ' URL'si için işlev çağırılabilir

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

Sadece ilk 12 gönderiyi görebiliyorum, hepsini nasıl alabilirim?
rahul gawale

0

Bu basit bir ajax çağrısı ve yinelenen görüntü yolları kullanarak çalışır.

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

Benim için çalıştı, ama sadece Instagram'da oturum açtığımda.
zundi

-1

İşte görüntüleri indiren ve resimlerdeki bağlantıları içeren bir html dosyası oluşturan bir php betiği. Php sürümü için Kredi 350D, bu sadece ayrıntılı .. Ben bu bir cron iş koyarak ve sık sık ihtiyacınız ancak ateş öneririz. Mayıs 2019 itibariyle çalışma doğrulandı .

<?
$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);
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.