ฉันจะรับสื่อผู้ใช้จาก Instagram โดยไม่ต้องพิสูจน์ตัวตนในฐานะผู้ใช้ได้อย่างไร


175

ฉันพยายามใส่สื่อ Instagram ล่าสุดของผู้ใช้บนแถบด้านข้าง ฉันพยายามใช้ Instagram API เพื่อดึงข้อมูลสื่อ

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

เอกสารดังกล่าวบอกกับ GET https://api.instagram.com/v1/users/<user-id>/media/recent/แต่บอกว่าจะผ่านโทเค็นการเข้าถึง OAuth โทเค็นการเข้าถึงหมายถึงการอนุญาตให้ดำเนินการในนามของผู้ใช้ ฉันไม่ต้องการให้ผู้ใช้ลงชื่อเข้าใช้ Instagram เพื่อดูสิ่งนี้บนแถบด้านข้าง พวกเขาไม่จำเป็นต้องมีบัญชี Instagram

ตัวอย่างเช่นฉันสามารถไปที่http://instagram.com/thebrainscoopโดยไม่ต้องลงชื่อเข้าใช้ Instagram และดูรูปภาพ ฉันต้องการทำผ่าน 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."
  }
}

ดังนั้นนี่เป็นไปไม่ได้เหรอ? จะไม่มีวิธีดึงสื่อ (สาธารณะ) ล่าสุดของผู้ใช้โดยไม่ต้องให้ผู้ใช้ลงชื่อเข้าใช้บัญชี Instagram ผ่าน OAuth ก่อนหรือไม่


เป็นไปได้ด้วยปลั๊กอินนี้เพียงแค่เช็คเอาท์ซอร์สโค้ดของวิธีดึงสื่อสาธารณะล่าสุดของผู้ใช้โดยไม่ต้องขอให้ผู้ใช้ลงชื่อเข้าใช้บัญชี instagram ของเขาหรือเธอ : D smashballoon.com/instagram-feed/demo คุณเพียงแค่ต้องใช้รหัสลูกค้าไม่จำเป็นต้องใช้โทเค็นการเข้าถึง : D
jehzlau

คุณต้องรับรองความถูกต้องเพื่อให้พวกเขาสามารถติดตามและ จำกัด การดาวน์โหลดของคุณ (อัตรา ... ) เหมือนกับ API ขนาดใหญ่ทุกตัว มีการเปิดเผยต่อสาธารณะสำหรับผู้ใช้จริงและสาธารณะสำหรับการคัดลอกข้อมูล / บอทซึ่งโดยปกติจะไม่เหมือนกับที่ผู้ใช้จริงจะเห็นโฆษณาและใช้บริการโดยตรง
Christophe Roussy

1
วิธีการเหล่านี้ไม่ทำงานอีกต่อไป ดูstackoverflow.com/questions/49852080/…
Moradnejad

คำตอบ:


123

นี่มันสายไปแล้ว แต่ก็คุ้มถ้ามันช่วยใครซักคนเพราะฉันไม่เห็นมันในเอกสารของ Instagram

ในการดำเนินการ GET บนhttps://api.instagram.com/v1/users/<user-id>/media/recent/(ในเวลาปัจจุบันของการเขียน) คุณไม่จำเป็นต้องใช้โทเค็นการเข้าถึง OAuth

คุณสามารถแสดง https://api.instagram.com/v1/users/[USER ID]/media/recent/?client_id=[CLIENT ID]

[รหัสลูกค้า] จะเป็นรหัสลูกค้าที่ถูกต้องที่ลงทะเบียนในแอปผ่านการจัดการลูกค้า (ไม่เกี่ยวข้องกับผู้ใช้ใด ๆ ) คุณสามารถรับ [USER ID] จากชื่อผู้ใช้โดยดำเนินการตามคำขอค้นหาผู้ใช้ GET: https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]


9
ฉันคิดว่าพวกเขาอาจเปลี่ยนใจอีกครั้ง ฉันได้รับการตอบสนองข้อผิดพลาดแบบเดียวกับที่แสดงใน OP
James

35
สิ่งนี้ใช้ได้เฉพาะกับแอพที่สร้างขึ้นก่อนวันที่ 17 พฤศจิกายน 2015 และจะไม่ได้รับการสนับสนุนเลยหลังจากเดือนมิถุนายน 2016 หลังจากนั้นคุณจะต้องใช้ access_token oauth instagram.com/developer/changelog
Dax Fohl

211
นี่มันช่างงี่เง่าและน่ารำคาญ ทำไมพวกเขาจะบังคับให้เข้าถึงโทเค็นเพียงเพื่อแสดงภาพที่มีอยู่แล้วของประชาชน ? ฉันแทบจะไม่ต้องล้างพวกเขาให้กับผู้ใช้ทุกคนในโลกนี้ฉันแค่ต้องการแสดงอินสแตนซ์ล่าสุดของลูกค้าโดยไม่ต้องเสียเวลายุ่งกับมัน Gah!
Matt Fletcher

8
@Cabus จำกัด อัตราคู่ครอง
Walf

20
@MattFletcher ยิ่งโง่มากตอนนี้ต้องผ่านการตรวจสอบการอนุญาตของแอพและไม่แน่ใจว่าเป็นไปได้หรือไม่เพราะกรณีการใช้งานนี้ "การแสดงฟีดของลูกค้าในหน้าเว็บของตัวเอง" ไม่ใช่หนึ่งในกรณีการใช้งาน ดุข้อ จำกัด เหล่านี้ดูด
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>

คุณสามารถดาวน์โหลดภาพใด ๆ ฟีด Instagram ของผู้ใช้ในรูปแบบ JSON ใช้?__a=1ถัดจากที่อยู่หน้า Landing Page เช่นนี้ ไม่จำเป็นต้องได้รับรหัสผู้ใช้หรือลงทะเบียนแอปไม่มีโทเค็นไม่มี oAuth

min_idและmax_idตัวแปรสามารถใช้สำหรับการแบ่งหน้านี่คือตัวอย่าง

YQLอาจไม่ทำงานที่นี่ภายใน iframe snipped ดังนั้นคุณสามารถตรวจสอบด้วยตนเองได้ในYQL Console

เมษายน 2018 อัปเดต: หลังจากอัปเดตอินสตาแกรมล่าสุดคุณไม่สามารถทำได้ในฝั่งไคลเอ็นต์ (จาวาสคริปต์) เนื่องจากส่วนหัวที่กำหนดเองสำหรับคำขอที่ลงชื่อไม่สามารถตั้งค่าได้ด้วยจาวาสคริปต์เนื่องจากCORS Access-Control-Allow-Headersข้อ จำกัด มันก็ยังคงเป็นไปได้ที่จะทำนี้ผ่านทางphpหรือวิธีการด้านเซิร์ฟเวอร์อื่น ๆ ที่มีลายเซ็นที่เหมาะสมขึ้นอยู่กับrhx_gis, csrf_tokenและพารามิเตอร์คำขอ คุณสามารถอ่านเพิ่มเติมได้ที่นี่

มกราคม 2019 UPDATE: YQL ปลดเกษียณดังนั้นโปรดตรวจสอบการอัปเดตล่าสุดของฉันด้วย Google Image Proxy เป็นพรCORSอกซีสำหรับหน้า Instagram! ดังนั้นช่วงเวลาเชิงลบเท่านั้น - การแบ่งหน้าไม่สามารถใช้ได้กับวิธีนี้

PHP สารละลาย:

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

14
@ 350D คุณพบสิ่งนี้ได้อย่างไร ฉันหาที่ใดก็ได้ในเอกสารของพวกเขาไม่พบ ฉันแค่ต้องการอ่านเพิ่มเติมเกี่ยวกับสิ่งที่เป็นไปได้กับจุดสิ้นสุดนี้ (ภาพสี่เหลี่ยมจัตุรัส EG เทียบกับที่ไม่ใช่สี่เหลี่ยมจัตุรัสไม่ว่าจะมีแผนจะสิ้นสุดในเดือนมิถุนายน ฯลฯ ) - ขอบคุณ!
Phil Johnston

8
@Phil Johnston เพียงแค่การวิจัย😀นำอันนี้ไปอีกอันหนึ่ง - คุณสามารถเพิ่ม / media /? size = L ถัดจาก URL หน้า Landing Page ของภาพถ่ายและรับภาพความละเอียดเต็ม
350D

9
@ user2659694 ในที่สุดฉันก็พบวิธีแก้ปัญหาเพื่อให้ได้หน้าถัดไปด้วยวิธีนี้คุณสามารถใช้ / media /? max_id = [MAX_ID]
Reza

3
หากคุณลงชื่อเข้าใช้บัญชี Instagram ด้วยตัวเอง ลองทำในไม่ระบุตัวตนใน Chrome หรือคล้ายกันและคุณจะเห็นการตอบสนอง JSON ไม่มีรายการ ฉันพยายามรวมสิ่งนี้ไว้ในสคริปต์เพื่อรับรายการ URL บนเว็บเซิร์ฟเวอร์และต้องกลับไปใช้วิธีการอนุญาตแบบเดิม
Ryan Zink

9
@RyanZink คุณลองใช้บัญชีส่วนตัวเหรอ? มันใช้ได้สำหรับฉันออกจากระบบหรือไม่ระบุตัวตนในบัญชีสาธารณะ
ryan

41

11.11.2017
ตั้งแต่ Instagram เปลี่ยนวิธีที่พวกเขาให้ข้อมูลนี้ไม่มีวิธีการใด ๆ ที่ใช้งานได้ในปัจจุบัน นี่เป็นวิธีใหม่ในการรับสื่อของผู้ใช้:
GET https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
ที่ไหน:
query_id- ค่าถาวร: 17888483320059182 (หมายเหตุมันอาจจะเปลี่ยนแปลงไปในอนาคต)
id- รหัสของผู้ใช้ อาจมาพร้อมกับรายชื่อผู้ใช้ ในการรับรายชื่อผู้ใช้คุณสามารถใช้คำขอต่อไปนี้: GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
first- จำนวนรายการที่จะได้รับ
after- id ของไอเท็มสุดท้ายถ้าคุณต้องการรับไอเท็มจาก id นั้น


คุณช่วยกรุณาบอกให้ฉันทราบว่าจะรับ query_id และ id ของผู้ใช้ได้จากที่ไหน?
Vijaysinh Parmar

2
@VijaysinhParmar ตามที่ฉันพูดถึงquery_idเป็นค่าถาวร นั่นหมายความว่าเป็น17888483320059182เสมอ(อย่างน้อยนอกอินสตาแกรมจะเปลี่ยน) id of user - คือ id ของผู้ใช้ (แก้ไขคำตอบของฉันนิดหน่อย)
Footniko

1
ฉันจำไม่ได้ว่าอยู่ที่ไหนสักแห่งบนอินเทอร์เน็ต แต่ฉันไม่มีความสัมพันธ์กับ Instagram ดังนั้นในกรณีที่มีการเปลี่ยนแปลงฉันจะไม่สามารถบอกคุณใหม่ได้ :(
Footniko

1
สงสัยว่านโยบาย จำกัด อัตราของวิธีนี้คืออะไร
kkzxak47

1
หากใครมีปัญหาเกี่ยวกับการร้องขอ URL นี้ผ่านการร้องขอ CURL คุณจะต้องได้รับส่วนหัวคำขอคุกกี้ (แท็บเครือข่ายเปิดหลังจากเรียกใช้ url คัดลอกส่วนหัวของคุกกี้และวางลงในส่วนหัวคำขอ curl หากคุณไม่ทำเช่นนี้ คุณจะได้รับข้อผิดพลาดถูกปฏิเสธการเข้าถึง 403)
Anders

40

ฉันสามารถรับสื่อล่าสุดของผู้ใช้โดยใช้ API ต่อไปนี้โดยไม่มีการรับรองความถูกต้อง (รวมถึงคำอธิบายรายการที่ชอบจำนวนความคิดเห็น)

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

เช่น

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

1
สิ่งนี้ใช้ได้กับฉันด้วยเช่นกัน แต่เมื่อ "is_video = true" ไม่มี URL วิดีโอในข้อมูล
didikee

4
ใช่คุณสามารถรับรูปขนาดย่อ (ไม่ใช่วิดีโอเอง) - โชคไม่ดีที่ฉันไม่พบเอกสารที่เป็นทางการสำหรับเรื่องนี้และฉันไม่รู้ว่า API นี้เลิกใช้แล้วหรือสนับสนุนนานเท่าใด
Michael

8
ตั้งแต่วันที่ 2018-04-13 สิ่งนี้ดูเหมือนจะไม่ทำงานอีกต่อไป อาจเป็นเพราะเรื่องอื้อฉาวข้อมูล Cambridge Analytica ล่าสุดของ Facebook พวกเขากำลังทำให้สิ่งต่าง ๆ ลดลงเป็นตัน คำแนะนำอื่น ๆ สำหรับการรับข้อมูลผู้ใช้ขั้นพื้นฐานโดยไม่มีการตรวจสอบ?
BakerStreetSystems

2
ใช่มีบางครั้งที่ API นี้ไม่ทำงาน - แต่ตอนนี้มันกลับมาอีกครั้ง
ไมเคิล

4
มันใช้งานได้สำหรับฉัน แต่เมื่อฉันลงชื่อเข้าใช้ Instagram เท่านั้น
zundi

16

เมื่อสัปดาห์ที่แล้ว Instagram ปิดการใช้งาน/media/URL ฉันได้ทำการแก้ปัญหาซึ่งใช้งานได้ดีในตอนนี้

เพื่อแก้ไขปัญหาของทุกคนในหัวข้อนี้ฉันเขียนสิ่งนี้: https://github.com/whizzzkid/instagram-reverse-proxy

ให้ข้อมูลสาธารณะทั้งหมดของ instagram โดยใช้จุดปลายต่อไปนี้:

รับสื่อผู้ใช้:

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

รับสื่อผู้ใช้ที่มีจำนวน จำกัด :

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

ใช้ JSONP:

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

proxy API ยังผนวก URL หน้าถัดไปและหน้าก่อนหน้าเข้ากับการตอบสนองดังนั้นคุณไม่จำเป็นต้องคำนวณสิ่งนั้นเมื่อสิ้นสุด

หวังว่าพวกคุณจะชอบมัน!

ขอบคุณที่ @ 350D สำหรับการจำสิ่งนี้ :)


1
@rex จนกว่าพวกเขาจะเปลี่ยนวิธีการทำงานของพวกเขาในตอนท้ายเราดี! พวกเขาไม่ได้สนใจในช่วง 3 ปีที่ผ่านมาอาจเป็นไปได้ว่าพวกเขาจะไม่ได้อยู่ในอันดับ 3 ต่อไป
whizzzkid

3
@whizzzkid โชคไม่ดีที่พวกเขาเปลี่ยนมัน ฉันเห็นว่าคุณคิดว่าปลายทางของผู้ใช้จะทำสิ่งต่าง ๆ แต่มีข้อ จำกัด สำหรับคำขอที่ไม่ได้ลงชื่อเข้าใช้ ความคิดใด ๆ
โนบิลิก

1
@nobilik การแก้ปัญหาอยู่ในสถานที่igpi.ga/whizzzkid/media?count=3และigpi.ga/graphql/query/?user_id=1606740656&count=3ควรส่งคืนข้อมูลของคุณ โปรดจำไว้ว่าผู้อ้างอิงที่ไม่ได้กำหนดจะถูกปิดการใช้งานสำหรับ URL เหล่านี้
whizzzkid

1
@whizzzkid - ทำงานได้แล้ว! ขอบคุณมาก - คุณเป็นนักวิชาการและสุภาพบุรุษ!
James Trickey

1
ฉันได้รับข้อผิดพลาด "ผู้อ้างอิงถูกปฏิเสธการเข้าถึง" บางทีนี่อาจใช้ไม่ได้อีกต่อไป?
khalid13

14

Instagram API ต้องการการรับรองความถูกต้องของผู้ใช้ผ่าน OAuth เพื่อเข้าถึงสื่อปลายทางล่าสุดสำหรับผู้ใช้ ดูเหมือนจะไม่มีวิธีอื่นใดในขณะนี้ที่จะได้รับสื่อทั้งหมดสำหรับผู้ใช้


4
หากฉันต้องการแสดงสื่อของตัวเองในเว็บไซต์ของฉันทำไมฉันถึงต้องการให้ทุกคนที่ต้องการเห็นมันมีบัญชี Instagram
ninjasense

5
ninjasense - ฉันไม่คิดว่ามันจะทำงานอย่างไร ฉันคิดว่าเว็บไซต์ของคุณจะต้องมีรหัสเล็กน้อยในนั้นซึ่งจะสอบถาม Instagram API ด้วยข้อมูลประจำตัว oauth ของคุณให้เพื่อดึงในสื่อของคุณ จากนั้นคุณจะแสดงสื่อของคุณต่อผู้ใช้เว็บไซต์ของคุณ ไซต์ของคุณจะเป็นสิ่งเดียวที่จำเป็นในการรับรองความถูกต้องกับ Instagram
Bill Rawlinson

9

หากคุณกำลังมองหาวิธีการสร้างการเข้าถึงโทเค็นสำหรับการใช้งานในบัญชีเดียวที่คุณสามารถลองนี้ -> https://coderwall.com/p/cfgneq

ฉันต้องการวิธีใช้ instagram api เพื่อคว้าสื่อล่าสุดทั้งหมดสำหรับบัญชีใดบัญชีหนึ่งโดยเฉพาะ


5
นี่คือสิ่งที่ฉันทำในท้ายที่สุด: สร้างบัญชีใหม่เข้าถึงโทเค็นและเก็บโทเค็นนั้นในเซิร์ฟเวอร์ของฉันที่อยู่ถัดจากรหัส API นี่เป็นวิธีแก้ปัญหาที่ไม่ดีสำหรับแอพ JS เนื่องจากต้องมีการส่งโทเค็นการเข้าถึงของคุณไปยังผู้ใช้ (ซึ่งฉันได้เห็นโค้ดตัวอย่างจำนวนมาก) โชคดีสำหรับฉันฉันสามารถทำได้ฝั่งเซิร์ฟเวอร์
Peeja

4
@CraigHeneveld คุณทำยังไงถึงรักษาหมวกให้เข้าถึงอยู่เสมอ? ยังไม่หมดอายุกับคุณเหรอ?
Ryan Ore

โทเค็นหมดอายุหรือไม่
Monitus

หากหน่วยความจำของฉันให้บริการฉันรหัสจะหมดอายุก็ต่อเมื่อคุณเปลี่ยนรหัสผ่าน นี่เป็นอีกหัวข้อในเรื่อง -> stackoverflow.com/questions/22753170/…
Craig Heneveld

เราจะได้รับรูปถ่ายของผู้ใช้หลายคนได้อย่างไร? เช่นเดียวกับที่เราสามารถส่งรหัสผู้ใช้หลายคนแยกด้วย ","
Aadil Keshwani

9

นี่คือโซลูชันราง มันเป็นประตูหลังซึ่งจริงๆแล้วเป็นประตูหน้า

# 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'

วิธีนี้ใช้ได้ผลสำหรับฉัน แต่ฉันมีปัญหากับมัน หลังจากโหลดข้อมูลเซิร์ฟเวอร์ rails ของฉัน (ใช้ Rails 5.0.0, Puma 3.6.0 server) รีสตาร์ทอย่างลึกลับ ... มีวิธีแก้ปัญหาใดบ้าง
Luis Eduardo Rojas Cabrera

8

ต้องขอบคุณสคีมา API ที่เปลี่ยนแปลง (และออกแบบมาอย่างน่ากลัว) ของ Instagram ส่วนใหญ่ข้างต้นจะไม่สามารถใช้งานได้ในเดือนเมษายน 2018

นี่คือเส้นทางล่าสุดในการเข้าถึงข้อมูลโพสต์แต่ละรายการหากคุณทำการสืบค้น API โดยตรงโดยใช้https://www.instagram.com/username/?__a=1วิธีการ

สมมติว่าข้อมูลที่ส่งคืน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

ดูเหมือนว่าพวกเขากำลังจะถูกฆ่าเข้าถึง API ออกนี้สำหรับผู้ที่ไม่ใช่ลูกค้าธุรกิจในธันวาคม 2018เพื่อให้มากที่สุดของมันขณะที่คุณสามารถ

หวังว่ามันจะช่วยให้ใครบางคน;)


สิ่งนี้ช่วยฉันฉันแค่ต้องการแสดงโพสต์ Instagram ล่าสุดสำหรับลูกค้า ขอบคุณ!
weston deboer

1
instagram.com/username/?__a=1ให้ข้อผิดพลาดในขณะนี้: การเข้าถึง www.instagram.com ถูกปฏิเสธคุณไม่ได้รับอนุญาตให้ดูหน้านี้ HTTP ERROR 403 มีความคิดอื่นใดอีกหรือไม่
Hese

1
Yep Instagram ได้ฆ่าสิ่งนี้ออกแล้ว "เพื่อปรับปรุงความเป็นส่วนตัวและความปลอดภัยของผู้ใช้ Instagram อย่างต่อเนื่องเรากำลังเร่งการเลิกใช้แพลตฟอร์ม Instagram API ทำให้การเปลี่ยนแปลงต่อไปนี้มีผลทันทีเราเข้าใจว่าสิ่งนี้อาจส่งผลกระทบต่อธุรกิจหรือบริการของคุณและเราขอขอบคุณการสนับสนุนของคุณ ความสามารถเหล่านี้จะถูกปิดใช้งานทันที (ตั้งค่าไว้ก่อนหน้าสำหรับวันที่ 31 กรกฎาคม 2018 หรือ 11 ธันวาคม 2018) "
เครื่องเทศ

หากสิ่งที่ฉันอ่านถูกต้องจะไม่สามารถเรียกคืนรูปภาพหรือข้อมูลจากบัญชี "ที่ไม่ใช่ธุรกิจ" ได้อีกต่อไป พวกเขาฆ่าแพลตฟอร์ม API โดยสิ้นเชิง ฉันเดาว่าเป็นอย่างนั้น ... instagram.com/developer/changelog
spice

1
@james_tookey ไม่น่าจะเป็นเพื่อนได้ เนื่องจากข้อ จำกัด ด้านความเป็นส่วนตัวใหม่พวกเขาจะไม่สามารถสืบค้นหรือดึงข้อมูลผู้ใช้ / ข้อมูลบัญชีส่วนตัวได้อีกต่อไป โดยพื้นฐานแล้วพวกเขาเพิ่งฆ่าการใช้ API ทั้งหมดสำหรับบัญชีส่วนตัว
เครื่องเทศ

7

JSFiddle

javascript:

$(document).ready(function(){

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

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

    });

});

HTML:

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

CSS:

ul.instagram {
    list-style: none;
}

ul.instagram li {
  float: left;
}

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

5

เพียงต้องการเพิ่มใน @ 350D คำตอบเนื่องจากมันยากสำหรับฉันที่จะเข้าใจ

ตรรกะของฉันในรหัสถัดไป:

เมื่อโทร API https://www.instagram.com/_vull_ /media/เป็นครั้งแรกที่ฉันโทรเท่านั้น เมื่อฉันได้รับการตอบกลับฉันจะตรวจสอบค่าบูลีนmore_availableเป็น หากความจริงที่ฉันได้รับภาพที่ผ่านมาจากแถวที่ได้รับ ID และแล้วโทร Instagram API อีกครั้ง https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433แต่คราวนี้

สิ่งสำคัญที่ควรทราบที่นี่รหัสนี้คือรหัสของรูปภาพสุดท้ายในอาร์เรย์ ดังนั้นเมื่อขอ maxId ที่มี id สุดท้ายของรูปภาพในอาร์เรย์คุณจะได้ 20 ภาพถัดไปและอื่น ๆ

หวังว่านี่จะอธิบายสิ่งต่าง ๆ


4

หากคุณเลี่ยงผ่าน Oauth คุณอาจไม่ทราบว่ามีผู้ใช้ Instagram คนใด ที่ถูกกล่าวว่ามีไม่กี่วิธีในการรับภาพ Instagram โดยไม่ต้องมีการตรวจสอบ

  1. API ของ Instagram ช่วยให้คุณสามารถดูภาพยอดนิยมของผู้ใช้โดยไม่ต้องตรวจสอบสิทธิ์ ใช้จุดสิ้นสุดต่อไปนี้: นี่คือลิงค์

  2. Instagram ให้ฟีด RSS สำหรับแท็กที่นี้

  3. หน้าผู้ใช้ Instagram เป็นแบบสาธารณะดังนั้นคุณสามารถใช้ PHP กับ CURL เพื่อรับหน้าและตัวแยกวิเคราะห์ DOM เพื่อค้นหา html สำหรับแท็กรูปภาพที่คุณต้องการ


9
ดูเหมือนจะล้าสมัย
Burak Tokak

เป็นไปได้ไหมที่จะข้ามการตรวจสอบสิทธิ์สำหรับ instagram
JAck

3

อีกหนึ่งเคล็ดลับค้นหาภาพถ่ายโดยแฮชแท็ก:

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

ที่ไหน:

query_hash - ค่าถาวร (ฉันเชื่อว่าแฮชของ 17888483320059182 สามารถเปลี่ยนแปลงได้ในอนาคต)

tag_name - ชื่อพูดสำหรับตัวเอง

first - จำนวนไอเท็มที่จะได้รับ (ฉันไม่ทราบสาเหตุ แต่ค่านี้ใช้งานไม่ได้ตามที่คาดไว้จำนวนจริงของภาพถ่ายที่ส่งคืนมีขนาดใหญ่กว่าค่าคูณเล็กน้อย 4.5 (ประมาณ 110 สำหรับค่า 25 และประมาณ 460 สำหรับ ค่า 100))

after- id ของไอเท็มสุดท้ายถ้าคุณต้องการรับไอเท็มจาก id นั้น ค่าของการend_cursorตอบกลับจาก JSON สามารถใช้ได้ที่นี่


คุณพบสิ่งนี้ได้อย่างไร
ekntrtmz


3

หากคุณต้องการค้นหาผู้ใช้โดยไม่ต้องมี clientID และโทเค็นการเข้าถึง:

1: หากคุณต้องการค้นหาผู้ใช้ทุกคนที่มีชื่อคล้ายกับคำค้นหา:

แทนที่ SeachName ด้วยข้อความที่คุณต้องการค้นหา:

https://www.instagram.com/web/search/topsearch/?query=SearchName

2: หากคุณต้องการค้นหาชื่อผู้ใช้ที่แน่นอน:

แทนที่ชื่อผู้ใช้ด้วยชื่อการค้นหาที่คุณต้องการ:

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


2

คุณสามารถใช้ API นี้เพื่อดึงข้อมูลสาธารณะของผู้ใช้ instagram:
https://api.lityapp.com/instagrams/thebrainscoop?limit=2

หากคุณไม่ได้ตั้งค่าพารามิเตอร์ จำกัด การโพสต์จะถูก จำกัด ที่ 12 ตามค่าเริ่มต้น

นี้ API ถูกสร้างใน SpringBoot ด้วย HtmlUnit ตามที่คุณเห็นในโค้ด:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    response.put("posts", posts);

    return response;
}

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

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

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

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

        JSONObject post = new JSONObject();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


มันเป็นตัวอย่างของการตอบสนอง:

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

ฉันสามารถรับข้อมูลโดยหมายเลขผู้ใช้ (pk)
SAURABH RATHOD

ขออภัย @SAURABHRATHOD ฉันพยายามแล้ว แต่ฉันไม่พบวิธีในการทำเช่นนี้ ฉันจะยินดีมากถ้ามีคนแก้ปัญหานี้ ขอบคุณสำหรับความคิดเห็น
Ruan Barroso

2

ฉันต้องการฟังก์ชั่นนี้จริงๆ แต่สำหรับ Wordpress ฉันพอดีและมันทำงานได้อย่างสมบูรณ์

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

1

โค้ด nodejs ด้านล่างจะกำหนดรูปภาพที่เป็นที่นิยมจากหน้า Instagram ฟังก์ชั่น 'ScrapeInstagramPage' จะดูแลผลกระทบของริ้วรอยก่อนวัย

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


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

    var cookieString = '';

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


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

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

    options.transform = autoParse;


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

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

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

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

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

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

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

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

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

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

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

                        //console.log(pop_posts);

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

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


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

ลองที่นี่

ตัวอย่าง: เพื่อรับ URL ' https://www.instagram.com/dress_blouse_designer/ ' URL หนึ่งอาจเรียกใช้ฟังก์ชัน

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

ฉันเห็นเฉพาะโพสต์ครั้งแรก 12 ฉันจะได้รับทั้งหมดได้อย่างไร
rahul gawale

0

การทำงานนี้ใช้การโทร ajax แบบง่ายและวนเส้นทางรูปภาพซ้ำ

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

มันใช้งานได้สำหรับฉัน แต่เมื่อฉันลงชื่อเข้าใช้ Instagram เท่านั้น
zundi

-1

นี่คือสคริปต์ php ที่ดาวน์โหลดรูปภาพและสร้างไฟล์ html พร้อมลิงก์ในรูปภาพ เครดิต 350D สำหรับรุ่น php นี่เป็นเพียงรายละเอียด .. ฉันขอแนะนำให้วางนี่เป็นงาน cron และยิง แต่คุณมักจะต้อง สอบการทำงานเป็นของพฤษภาคม 2019

<?
$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);
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.