如何在没有Instagram API的情况下获取来自instagram的所有帖子的公共用户

时间:2018-05-30 22:22:34

标签: javascript instagram instagram-api

我试图从Instagram获取公开用户帖子,我几乎尝试了所有可能的链接,但每次我收到403错误。

  1. https://www.instagram.com/graphql/query/?query_hash=ded47faa9a1aaded10161a2ff32abb6b&variables={"tag_name":"{user-name}","first":25,"after":""}

  2. https://www.instagram.com/{user-name}/?__a=1

  3. https://www.instagram.com/{user-name}/media

     $.ajax({
        url: URL,
        type: "GET",
        success: function(data) {
           console.log('Success!' ,data);
        },
        error: function (response) {
           console.log('ERROR!', response);
        }
     });
    
  4. 以上是我试图获取数据的链接。正如我所读到的Instagram正在改变协议,那么在没有使用Instagram API和不使用后端的情况下仍然有办法让公众用户获得所有帖子吗?谢谢你:))

5 个答案:

答案 0 :(得分:0)

只加载12希望有人修复它。

<?php
$username = "john";
$url = "https://www.instagram.com/".$username;
 $html = file_get_contents($url); 
$html = strstr($html,'window._sharedData = ')   ;
$html = explode("</script>", $html);
$html = $html[0];
$html = str_replace("window._sharedData = ","",$html);
$html = strstr($html,'"edge_owner_to_timeline_media');
$html = explode(',"edge_saved_media"',$html);
$html = '{'.$html[0].'}';

$html = json_decode($html,true);

for ($i=0; $i < 100; $i++) { 
$pos[$i] = $html['edge_owner_to_timeline_media']['edges'][$i]['node']['display_url'];
echo '<img src="'.$pos[$i].'" ><br>';
 }

&GT;

答案 1 :(得分:0)

你得到403因为你没有有效的会话。 Web应用程序会话存储为Cookie(当您浏览instagram.com时,会有一个sessionid cookie)。

您需要在请求的标题中包含会话Cookie

获取有效请求的所有标头的简单方法是转到开发人员工具的“网络”部分,然后复制请求标头或其他格式。

另一种方法是使用GreasemonkeyTampermonkey脚本。将直接从浏览器执行并使用当前会话。

答案 2 :(得分:0)

您的第二个解决方案应该起作用。尝试访问以下网址:https://www.instagram.com/instagram/?__a=1

我制作了一个使用此方法的jquery插件:https://github.com/kasperlegarth/instastory.js

答案 3 :(得分:0)

PHP解决方案

您可以将其添加到某处,它将从用户处提取12条最新帖子,并以阵列形式返回照片的链接。 这是一个实现

function getPosts($profile) {
    $base = "https://instagram.com/";
    $end = "/?__a=1";
    $ls = array();
    $content = file_get_contents($base.$profile.$end);
    if (strpos($content, "is_private\":false") !== false) {
        return array(true, array());
    }
    $split = "config_height\":320},{\"src\":\"";
    while (strpos($content, $split) !== false) {
        $part = @explode($split, $content, 2)[1];
        $p = @explode("\"", $part, 2)[0];
        $content = str_replace($split.$p, "", $content);
        array_push($ls, $p);
    }
    return array(false, $ls);
}
$x = getPosts("najemi.cz");
$isPrivate = $x[0];
$posts = $x[1]
if ($isPrivate) {
    echo "Sorry, this account is private";
}else{
    foreach($posts as $post) {
        echo "<img src=\"$post\">";
    }
}

这将在HTML中用于显示帐户的12条最新帖子。您可以通过添加和删除显示的内容来根据需要定制它,但是除此之外,可以使用任何存在的用户名来调用该函数。

使用AJAX的javascript解决方案

此解决方案需要访问将返回结果的php文件

Javascript如下

function display(array1) {
    array1.forEach(element => console.log(element));
}
var username = "najemi.cz";
$.ajax({
    url: "./getPosts.php?p=" + username,
    type: "GET",
    success: function(data) {
        display(data.split("\n"));
    },
    error: function (response) {
        console.log('ERROR!', response);
    }
});

名为“ getPosts.php”的php文件将包含:

<?php
function getPosts($profile) {
    $base = "https://instagram.com/";
    $end = "/?__a=1";
    $ls = array();
    $content = file_get_contents($base.$profile.$end);
    if (strpos($content, "is_private\":false") !== false) {
        return array(true, array());
    }
    $split = "config_height\":320},{\"src\":\"";
    while (strpos($content, $split) !== false) {
        $part = @explode($split, $content, 2)[1];
        $p = @explode("\"", $part, 2)[0];
        $content = str_replace($split.$p, "", $content);
        array_push($ls, $p);
    }
    return array(false, $ls);
}
if(isset($_GET['p'])){$p = $_GET['p'];}
$x = getPosts($p);
$isPrivate = $x[0];
$posts = $x[1]
if ($isPrivate) {
    echo "Sorry, this account is private";
}else{
    foreach($posts as $post) {
        echo "$post\n";
    }
}
?>

答案 4 :(得分:0)

只需使用一些 CSS 选择器,您就可以做到。将此代码粘贴到您的 chrome 控制台中,您将获得某个用户的所有帖子(无需登录 instagram):

var allLinks = document.getElementsByTagName("a")
var allPosts = []
for (var i = 0; i<allLinks.length; i++){
    var isPost = allLinks[i].parentNode.className.indexOf("v1Nh3")>-1;
    if (isPost)
        allPosts.push(allLinks[i].href)
}

console.log(allPosts)

最后,如果您想改进这一点,请添加一些分页并重复相同的代码。