Bagaimana saya bisa mendapatkan media pengguna dari Instagram tanpa mengautentikasi sebagai pengguna?

175

Saya mencoba menempatkan media Instagram terbaru pengguna di sidebar. Saya mencoba menggunakan API Instagram untuk mengambil media.

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

Dokumentasi mengatakan kepada GET https://api.instagram.com/v1/users/<user-id>/media/recent/, tetapi dikatakan untuk melewati token akses OAuth. Token akses mewakili otorisasi untuk bertindak atas nama pengguna. Saya tidak ingin pengguna masuk ke Instagram untuk melihat ini di sidebar. Mereka bahkan tidak perlu memiliki akun Instagram.

Misalnya, saya bisa mengunjungi http://instagram.com/thebrainscoop tanpa login ke Instagram dan melihat foto. Saya ingin melakukannya melalui API.

Di Instagram API, permintaan yang tidak diautentikasi pengguna melewati a client_idbukannya access_token. Jika saya mencobanya, saya mendapatkan:

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

Jadi, apakah ini tidak mungkin? Apakah tidak ada cara untuk mengambil media terbaru (publik) pengguna tanpa meminta pengguna untuk login ke akun Instagram melalui OAuth terlebih dahulu?

Peeja
sumber
Mungkin dengan plugin ini, cukup cek kode sumber tentang cara mereka mengambil media publik terbaru pengguna tanpa meminta pengguna untuk masuk ke akun instagramnya. : D smashballoon.com/instagram-feed/demo Anda hanya perlu id klien, tidak perlu token akses. : D
jehzlau
Anda perlu mengauthasi agar mereka dapat melacak Anda dan membatasi unduhan Anda (tarif ...) seperti setiap API besar. Ada publik untuk pengguna nyata dan publik untuk scrappers / bot, yang biasanya tidak sama dengan pengguna nyata akan melihat iklan dan langsung menggunakan layanan ini.
Christophe Roussy
1
Tidak satu pun dari metode ini yang berfungsi lagi. Lihat stackoverflow.com/questions/49852080/…
Moradnejad

Jawaban:

123

Ini terlambat, tetapi bermanfaat jika itu membantu seseorang karena saya tidak melihatnya di dokumentasi Instagram.

Untuk menjalankan GET https://api.instagram.com/v1/users/<user-id>/media/recent/ (saat ini penulisan) Anda sebenarnya tidak perlu token akses OAuth.

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

[ID KLIEN] akan menjadi id klien yang sah yang terdaftar di aplikasi melalui mengelola klien (tidak terkait dengan pengguna apa pun). Anda bisa mendapatkan [ID PENGGUNA] dari nama pengguna dengan melakukan permintaan pencarian pengguna GET: https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]

Ersan J Sano
sumber
9
Saya pikir mereka mungkin berubah pikiran lagi. Saya mendapatkan respons kesalahan yang sama seperti yang ditunjukkan dalam OP
James
35
Ini hanya berlaku pada aplikasi yang dibuat sebelum 17 November 2015, dan tidak akan didukung sama sekali setelah Juni 2016. Setelah itu Anda akan memerlukan access_token otomatis. instagram.com/developer/changelog
Dax Fohl
211
Ini sangat bodoh dan menjengkelkan. Mengapa mereka memaksa token akses hanya untuk menampilkan gambar yang sudah umum ? Saya hampir tidak berusaha membilasnya untuk setiap pengguna di dunia, saya hanya ingin menampilkan insta terbaru klien tanpa harus menghabiskan waktu berjam-jam untuk mengacaukannya. Gah!
Matt Fletcher
8
Batas tingkat @Cabus, sobat.
Walf
20
@MattFletcher sekarang lebih bodoh lagi, seseorang harus melalui peninjauan izin aplikasi, dan tidak yakin apakah ini layak karena kasus penggunaan ini "menunjukkan umpan klien di halaman web mereka sendiri" bukan salah satu kasus penggunaan. Duh, pembatasan ini payah.
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>

Anda dapat mengunduh umpan foto pengguna Instagram apa pun dalam format JSON menggunakan di ?__a=1sebelah alamat laman landas seperti ini . Tidak perlu mendapatkan id pengguna atau mendaftar aplikasi, tidak ada token, tidak ada oAuth.

min_iddan max_idvariabel dapat digunakan untuk pagination, di sini adalah contoh

YQLmungkin tidak berfungsi di sini di dalam iframe terpotong, jadi Anda selalu dapat memeriksanya secara manual di YQL Console

PEMBARUAN APRIL 2018: Setelah pembaruan instagram terbaru Anda tidak dapat melakukan ini di sisi klien (javascript) karena header khusus untuk permintaan yang ditandatangani tidak dapat ditetapkan dengan javascript karena CORS Access-Control-Allow-Headerspembatasan. Masih mungkin untuk melakukan ini melalui phpatau metode sisi server lain dengan tanda tangan yang tepat berdasarkan rhx_gis, csrf_tokendan parameter permintaan. Anda dapat membaca lebih lanjut di sini .

JANUARI 2019 PEMBARUAN: YQL sudah pensiun, jadi, periksa pembaruan terakhir saya dengan Google Image Proxy sebagai CORSproxy untuk halaman Instagram! Maka hanya momen negatif - pagination tidak tersedia dengan metode ini.

PHP larutan:

    $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;
350D
sumber
14
@ 350D Bagaimana Anda menemukan ini? Saya tidak dapat menemukannya di mana pun di dokumentasi mereka. Saya hanya ingin membaca lebih lanjut tentang apa yang mungkin dengan titik akhir ini (gambar persegi EG vs non-persegi, apakah ini memiliki rencana untuk berakhir pada bulan Juni, dll) - Terima kasih!
Phil Johnston
8
@ Philip Johnston Hanya sebuah penelitian 😀 Ambil ini yang lain - Anda dapat menambahkan / media /? Size = L di sebelah URL halaman pendaratan foto dan dapatkan foto resolusi FULL.
350D
9
@ user2659694 Saya akhirnya menemukan solusi untuk mendapatkan halaman berikutnya dengan metode ini Anda dapat menggunakan / media /? max_id = [MAX_ID]
Reza
3
FYI ini tampaknya hanya berfungsi jika Anda masuk ke akun Instagram sendiri. Coba lakukan di Penyamaran di Chrome atau yang serupa dan Anda akan melihat respons JSON tidak mengandung item. Saya mencoba memasukkan ini ke dalam skrip untuk mendapatkan daftar URL di server web dan harus kembali ke metode otorisasi lama.
Ryan Zink
9
@RyanZink Anda mencoba akun pribadi? itu berfungsi baik untuk saya logout atau penyamaran di akun publik.
ryan
41

11.11.2017
Karena Instagram mengubah cara mereka menyediakan data ini, tidak ada metode di atas yang berfungsi saat ini. Berikut ini cara baru untuk mendapatkan media pengguna:
DAPATKAN https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
Di mana:
query_id- nilai permanen: 17888483320059182 (perhatikan bahwa mungkin akan berubah di masa mendatang).
id- id pengguna. Itu mungkin datang dengan daftar pengguna. Untuk mendapatkan daftar pengguna, Anda dapat menggunakan permintaan berikut: GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
first- jumlah item yang akan didapat.
after- id dari item terakhir jika Anda ingin mendapatkan item dari id itu.

Footniko
sumber
Bisakah Anda memberi tahu saya dari mana mendapatkan query_id dan id pengguna?
Vijaysinh Parmar
2
@VijaysinhParmar seperti yang saya sebutkan, query_idadalah nilai permanen. Itu berarti selalu 17888483320059182 (setidaknya kecuali Instagram mengubahnya). id pengguna - adalah id pengguna (diedit jawaban saya sedikit)
Footniko
1
Saya tidak ingat persisnya, di suatu tempat di internet. Tetapi saya tidak memiliki hubungan dengan Instagram, jadi jika itu berubah saya tidak akan dapat memberi tahu Anda yang baru :(
Footniko
1
Bertanya-tanya apa kebijakan pembatasan tingkat dari pendekatan ini?
kkzxak47
1
Jika ada yang memiliki masalah dengan meminta URL ini melalui permintaan CURL, maka Anda perlu mendapatkan tajuk permintaan cookie (buka tab Networks, setelah menjalankan url, salin tajuk cookie dan tempel ke tajuk permintaan ikal. Jika Anda tidak melakukan ini, Anda akan mendapatkan kesalahan 403 akses ditolak).
Anders
39

Saya bisa mendapatkan media terbaru dari pengguna menggunakan API berikut tanpa otentikasi (termasuk deskripsi, suka, jumlah komentar).

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

Misalnya

https://www.instagram.com/{username}/?__a=1
Michael
sumber
1
ini juga bekerja untuk saya.tapi ketika "is_video = true", tidak ada url video dalam data.
didikee
4
Benar, Anda hanya bisa mendapatkan thumbnail (bukan video itu sendiri) - sayangnya, saya tidak menemukan dokumentasi resmi untuk ini dan saya tidak tahu apakah API ini sudah usang atau berapa lama akan didukung.
Michael
8
Pada 2018-04-13, ini tampaknya tidak berfungsi lagi. Mungkin karena skandal data Cambridge Analytica terbaru Facebook, mereka memperketat banyak hal. Adakah saran lain untuk mendapatkan data pengguna dasar tanpa autentikasi?
BakerStreetSystems
2
Ya, ada saatnya API ini tidak berfungsi - Tapi sekarang kembali lagi
Michael
4
Itu bekerja untuk saya, tetapi hanya ketika saya masuk ke Instagram.
zundi
16

Sampai minggu lalu, Instagram menonaktifkan /media/url, saya menerapkan solusi, yang berfungsi cukup baik untuk saat ini.

Untuk mengatasi masalah semua orang di utas ini, saya menulis ini: https://github.com/whizzzkid/instagram-reverse-proxy

Ini menyediakan semua data publik instagram menggunakan titik akhir berikut:

Dapatkan media pengguna:

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

Dapatkan media pengguna dengan jumlah batas:

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

Gunakan JSONP:

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

API proksi juga menambahkan halaman berikutnya dan URL halaman sebelumnya ke respons sehingga Anda tidak perlu menghitungnya di akhir.

Semoga kalian menyukainya!

Terima kasih kepada @ 350D untuk mengetahui hal ini :)

whizzzkid
sumber
1
@rex sampai mereka mengubah cara kerja pada akhirnya, kami baik! Mereka tidak repot-repot dalam 3 tahun terakhir, mungkin mereka tidak akan dalam 3 tahun berikutnya.
whizzzkid
3
@ Whizzzkid Nasib buruk, mereka mengubahnya. Saya melihat bahwa Anda berpikir titik akhir pengguna akan melakukan hal-hal tersebut, tetapi ada batasan untuk permintaan pengguna yang tidak masuk. Ada ide?
nobilik
1
@nobilik solusinya sudah ada, igpi.ga/whizzzkid/media?count=3 dan igpi.ga/graphql/query/?user_id=1606740656&count=3 sebaiknya mengembalikan data Anda. Ingat, perujuk yang tidak ditentukan dinonaktifkan untuk url ini.
whizzzkid
1
@ whizzzkid - Sudah bekerja! Terima kasih banyak - Anda seorang sarjana dan pria terhormat!
James Trickey
1
Saya mendapatkan kesalahan "pengarah ditolak akses". Mungkin ini tidak berfungsi lagi?
khalid13
14

Instagram API membutuhkan otentikasi pengguna melalui OAuth untuk mengakses titik akhir media terbaru untuk pengguna. Tampaknya tidak ada cara lain sekarang untuk mendapatkan semua media untuk pengguna.

Bill Rollins
sumber
4
Ini tidak masuk akal, jika saya ingin menampilkan media saya sendiri di situs web saya sendiri, mengapa saya perlu semua orang yang ingin melihatnya memiliki akun Instagram?
ninjasense
5
ninjasense - Saya tidak berpikir itu cara kerjanya. Saya pikir situs web Anda perlu memiliki sedikit kode di dalamnya yang akan menanyakan API Instagram dengan kredensial Anda yang disediakan untuk menarik media Anda. Anda kemudian akan menunjukkan media Anda kepada pengguna situs Anda. Situs Anda akan menjadi satu-satunya hal yang perlu diautentikasi dengan Instagram.
Bill Rawlinson
9

Jika Anda mencari cara untuk menghasilkan token akses untuk digunakan pada satu akun, Anda dapat mencoba ini -> https://coderwall.com/p/cfgneq .

Saya membutuhkan cara untuk menggunakan api instagram untuk mengambil semua media terbaru untuk akun tertentu.

Craig Heneveld
sumber
5
Ini kurang lebih yang saya lakukan pada akhirnya: membuat akun baru, membuat token akses untuk itu, dan menyimpan token itu di konfigurasi server saya di sebelah kunci API. Ini adalah solusi yang buruk untuk aplikasi JS, karena itu memerlukan pengiriman token akses Anda kepada pengguna (yang saya lihat banyak contoh kode lakukan). Beruntung bagi saya, saya bisa melakukannya di sisi server.
Peeja
4
@CraigHeneveld Bagaimana pendapat Anda tentang menjaga agar topi akses_token selalu diperbarui? Bukankah sudah kedaluwarsa pada Anda?
Ryan Ore
Apakah token itu kedaluwarsa?
Monitus
Jika ingatanku, kuncinya hanya berakhir jika Anda mengubah kata sandi Anda. Berikut adalah utas lain tentang masalah ini -> stackoverflow.com/questions/22753170/…
Craig Heneveld
Bagaimana kami bisa mendapatkan beberapa foto pengguna ?? Seperti bisakah kita melewati beberapa id pengguna yang dipisahkan oleh ","?
Aadil Keshwani
9

Inilah solusi rel. Ini semacam pintu belakang, yang sebenarnya adalah pintu depan.

# 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

Objek yang Anda dapatkan bervariasi tergantung pada apakah itu pencarian pengguna atau pencarian tag. Saya mendapatkan data seperti ini:

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

Saya kemudian mendapatkan halaman hasil lain dengan membuat url dengan cara berikut:

  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'
Benjamin Talisman
sumber
solusi ini bekerja untuk saya, tetapi saya mengalami beberapa masalah dengannya. Setelah memuat data, server rails saya (menggunakan Rails 5.0.0, server Puma 3.6.0) restart tanpa dapat dijelaskan ... Adakah solusi yang mungkin?
Luis Eduardo Rojas Cabrera
8

Berkat skema API Instagram yang terus berubah (dan dirancang dengan mengerikan), sebagian besar di atas tidak akan berfungsi lagi pada April 2018.

Berikut ini jalur terbaru untuk mengakses data setiap posting jika Anda menanyakan API mereka secara langsung menggunakan https://www.instagram.com/username/?__a=1metode ini.

Dengan asumsi JSONdata yang dikembalikan adalah $dataAnda dapat mengulangi setiap hasil menggunakan contoh jalur berikut:

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

Hal utama dalam perubahan terbaru ini adalah graphqldanedge_owner_to_timeline_media .

Sepertinya mereka akan mematikan akses API ini untuk pelanggan yang bukan 'bisnis' pada bulan Desember 2018 jadi manfaatkan semaksimal mungkin.

Semoga ini bisa membantu seseorang;)

membumbui
sumber
Ini hanya membantu saya, saya hanya ingin menunjukkan posting instagram terbaru untuk klien. Terima kasih!
weston deboer
1
instagram.com/username/?__a=1 memberi kesalahan sekarang: Akses ke www.instagram.com ditolak Anda tidak memiliki otorisasi untuk melihat halaman ini. HTTP ERROR 403 ada ide lain?
Ini
1
Yep Instagram sekarang telah mematikan ini. "Untuk terus meningkatkan privasi dan keamanan pengguna Instagram, kami mempercepat penghentian Platform API Instagram, membuat perubahan berikut segera berlaku. Kami memahami bahwa ini dapat memengaruhi bisnis atau layanan Anda, dan kami menghargai dukungan Anda dalam menjaga keamanan platform kami. Kemampuan ini akan dinonaktifkan segera (sebelumnya ditetapkan untuk 31 Juli 2018 atau 11 Desember 2018 penghentian). "
spice
Jika yang saya baca sudah benar, tidak mungkin lagi mengambil gambar atau data dari akun "non-bisnis" apa pun. Mereka benar-benar mematikan platform API. Saya kira itulah yang kemudian ... instagram.com/developer/changelog
rempah
1
@james_tookey tidak akan mungkin sobat. Karena pembatasan privasi baru mereka, maka tidak akan lagi dapat meminta atau mengambil pengguna / data akun pribadi, hanya bisnis. Pada dasarnya mereka baru saja membunuh semua penggunaan API untuk akun pribadi.
rempah
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;
}
Leo
sumber
5

Hanya ingin menambahkan jawaban @ 350D, karena sulit bagi saya untuk mengerti.

Logika saya dalam kode adalah sebagai berikut:

Saat memanggil API pertama kali, saya hanya menelepon https://www.instagram.com/_vull_ /media/. Ketika saya menerima respons, saya memeriksa nilai boolean dari more_available. Jika ini benar, saya mendapatkan foto terakhir dari array, mendapatkan id-nya dan memanggil Instagram API lagi tapi kali ini https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433 .

Hal penting yang perlu diketahui di sini, Id ini adalah Id dari gambar terakhir dalam array. Jadi ketika meminta maxId dengan id terakhir dari gambar dalam array, Anda akan mendapatkan 20 gambar berikutnya, dan seterusnya.

Semoga ini memperjelas hal.

Vulovic Vukasin
sumber
4

Jika Anda melewati Oauth, Anda mungkin tidak akan tahu pengguna instagram mana mereka. Itu dikatakan ada beberapa cara untuk mendapatkan gambar instagram tanpa otentikasi.

  1. API Instagram memungkinkan Anda melihat gambar paling populer pengguna tanpa mengautentikasi. Menggunakan titik akhir berikut: Berikut ini tautannya

  2. Instagram menyediakan rss feed untuk tag di sini .

  3. Halaman pengguna Instagram bersifat publik, sehingga Anda dapat menggunakan PHP dengan CURL untuk mendapatkan halaman mereka dan pengurai DOM untuk mencari html untuk tag gambar yang Anda inginkan.

Dorian Damon
sumber
9
Sepertinya sudah ketinggalan zaman.
Burak Tokak
apakah mungkin untuk mem-bypass autentikasi untuk instagram
JAck
3

Satu trik lagi, cari foto dengan tagar:

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

Dimana:

query_hash - nilai permanen (saya percaya hash-nya 17888483320059182, dapat diubah di masa depan)

tag_name - judul berbicara sendiri

first - jumlah item yang didapat (saya tidak tahu mengapa, tetapi nilai ini tidak berfungsi seperti yang diharapkan. Jumlah foto yang dikembalikan sebenarnya sedikit lebih besar dari nilai dikalikan 4,5 (sekitar 110 untuk nilai 25, dan sekitar 460 untuk nilai 100))

after- id dari item terakhir jika Anda ingin mendapatkan item dari id itu. Nilai dari end_cursorrespons JSON dapat digunakan di sini.

kara4k
sumber
Bagaimana Anda menemukan ini?
ekntrtmz
2

Anda dapat menggunakan API ini untuk mengambil info publik dari pengguna instagram:
https://api.lityapp.com/instagrams/thebrainscoop?limit=2

Jika Anda tidak menetapkan parameter batas, posting dibatasi pada 12 secara default.

Ini api dibuat di SpringBoot dengan HtmlUnit seperti yang Anda lihat dalam kode:

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


Ini adalah contoh respons:

{
  "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
        }
      ]
    }
  ]
}
Ruan Barroso
sumber
bisakah saya mendapatkan data dengan userid (pk)
SAURABH RATHOD
Maaf @SAURABHRATHOD saya sudah mencoba tetapi saya belum menemukan cara untuk melakukan ini. Saya akan sangat senang jika seseorang menyelesaikan ini. Terima kasih atas komentarnya.
Ruan Barroso
2

Saya benar-benar membutuhkan fungsi ini tetapi untuk Wordpress. Saya cocok dan itu bekerja dengan sempurna

<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>
Karra Max
sumber
1

Kode simpul di bawah ini menghapus Gambar populer dari Halaman Instagram. Fungsi 'ScrapeInstagramPage' menangani efek pasca penuaan.

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

Coba di sini

Contoh: Untuk diberikan URL ' https://www.instagram.com/dress_blouse_designer/ ' orang dapat memanggil fungsi

ScrapeInstagramPage ({username : "dress_blouse_designer", debug : false});
Wisnu Kanwar
sumber
Saya hanya dapat melihat 12 posting pertama, bagaimana saya bisa mendapatkan semuanya?
rahul gawale
0

Ini bekerja menggunakan panggilan ajax sederhana dan iterating path gambar.

        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>"
                );
            });
        })
Evin Weissenberg
sumber
Itu bekerja untuk saya, tetapi hanya ketika saya masuk ke Instagram.
zundi
-1

Berikut ini adalah skrip php yang mengunduh gambar dan membuat file html dengan tautan pada gambar. Kredit 350D untuk versi php, ini hanya diuraikan .. Saya akan menyarankan menempatkan ini adalah pekerjaan cron dan menembak namun sering Anda butuhkan. Diverifikasi bekerja pada Mei 2019 .

<?
$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);
?>
drooh
sumber