更新[2015 年 3 月]:有关此解决方案的扩展和更新版本,请访问http://www.picssel.com/build-a-simple-instagram-api-case-study/
@ProllyGeek 的回答提供了一个很好的解决方法来抓取 Instagram 视频页面(当之无愧的赏金),但是它依赖于whateverorigin.org第三方服务,除非该服务最终变得不可用,否则它将正常工作。
由于最近在生产环境中已经发生在我身上,我不得不寻找更可靠的替代方案,因此我决定使用 phpfile_get_contents
从自己托管的 PHP 模块中抓取视频链接。
我基本上遵循@ProllyGeek 提出的相同逻辑,但翻译为 PHP,所以:
getVideoLink.php模块:
<?php
header('Content-Type: text/html; charset=utf-8');
function clean_input($data){
$data = trim($data);
$data = stripslashes($data);
$data = strip_tags($data);
$data = htmlspecialchars($data);
return $data;
};
$instalink = clean_input( $_GET['instalink'] );
if (!empty($instalink)) {
$response = clean_input( @ file_get_contents( $instalink ) );
$start_position = strpos( $response ,'video_url":"' ); // the start position
$start_positionlength = strlen('video_url":"'); // string length to trim before
$end_position = strpos($response ,'","usertags'); // the end position
$mp4_link = substr( $response, ( $start_position + $start_positionlength ), ( $end_position - ( $start_position + $start_positionlength ) ) );
echo $mp4_link;
};
?>
当然,您可能需要手动分析响应以了解您要查找的内容。
然后从我的主页对 PHP 模块进行 AJAX 调用:
var instaLink = "http://instagram.com/p/mOFsFhAp4f/"; // the Coca Cola video link
jQuery(document).ready(function ($) {
$.ajax({
url: "getVideoLink.php?instalink="+instaLink,
dataType : "html",
cache : false,
success : function (data) {
console.log(data); // returns http://distilleryvesper3-15.ak.instagram.com/b0ce80e6b91111e3a16a122b8b9af17f_101.mp4
},
error : function () {
console.log("error in ajax");
}
});
}); // ready
假设您的主机支持 php 以使用此方法。
编辑[2014 年 11 月 19 日]
我已经修改了getVideoLink.php模块(现在是getInstaLinkJSON.php)以实际从特定的 Instagram 媒体链接获取JSON信息,例如http://instagram.com/p/mOFsFhAp4f/
这比仅仅抓取视频的 URL 有用得多,也可以用于图像。
新的getInstaLinkJSON.php代码:
<?php
function clean_input($data){
$data = trim($data);
$data = strip_tags($data);
return $data;
};
// clean user input
function clean_input_all($data){
$data = trim($data);
$data = stripslashes($data);
$data = strip_tags($data);
$data = htmlspecialchars($data);
return $data;
};
$instaLink = clean_input_all( $_GET['instaLink'] );
if( !empty($instaLink) ){
header('Content-Type: application/json; charset=utf-8');
$response = clean_input( @ file_get_contents($instaLink) );
$response_length = strlen($response);
$start_position = strpos( $response ,'window._sharedData = ' ); // the start position
$start_positionlength = strlen('window._sharedData = '); // string length to trim before
$trimmed = trim( substr($response, ( $start_position + $start_positionlength ) ) ); // trim extra spaces and carriage returns
$jsondata = substr( $trimmed, 0, -1); // remove extra ";" added at the end of the javascript variable
echo $jsondata;
} elseif( empty($instaLink) ) {
die(); //only accepts instaLink as parameter
}
?>
我正在清理用户的输入和file_get_contents()
响应,但是我不会从最后一个中删除斜杠或HTML 字符,因为我将返回JSON响应。
然后 AJAX 调用:
var instaLink = "http://instagram.com/p/mOFsFhAp4f/"; // demo
jQuery.ajax({
url: "getInstaLinkJSON.php?instalink=" + instaLink,
dataType : "json", // important!!!
cache : false,
success : function ( response ) {
console.log( response ); // returns json
var media = response.entry_data.DesktopPPage[0].media;
// get the video URL
// media.is_video : returns true/false
if( media.is_video ){
console.log( media.video_url ); // returns http://distilleryvesper3-15.ak.instagram.com/b0ce80e6b91111e3a16a122b8b9af17f_101.mp4
}
},
error : function () {
console.log("error in ajax");
}
});
编辑[2020 年 5 月 20 日]
当前工作的PHP
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
function clean_input($data){
$data = trim($data);
$data = strip_tags($data);
return $data;
};
// clean user input
function clean_input_all($data){
$data = trim($data);
$data = stripslashes($data);
$data = strip_tags($data);
$data = htmlspecialchars($data);
return $data;
};
$instaLink = clean_input_all( $_GET['instaLink'] );
if( !empty($instaLink) ){
header('Content-Type: application/json; charset=utf-8');
$response = clean_input( @ file_get_contents($instaLink) );
$response_length = strlen($response);
$start_position = strpos( $response ,'window._sharedData = ' ); // the start position
$start_positionlength = strlen('window._sharedData = '); // string length to trim before
$trimmed = trim( substr($response, ( $start_position + $start_positionlength ) ) ); // trim extra spaces and carriage returns
$jsondata = substr( $trimmed, 0, -1); // remove extra ";" added at the end of the javascript variable
$jsondata = explode('window.__initialDataLoaded', $jsondata);
echo substr(trim($jsondata[0]), 0, -1);
} elseif( empty($instaLink) ) {
die(); //only accepts instaLink as parameter
}
?>