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

Posted

技术标签:

【中文标题】如何在没有 instagram API 的情况下从 instagram 获取公共用户的所有帖子【英文标题】:How to get public user all posts from instagram, without instagram API 【发布时间】:2018-11-09 20:46:45 【问题描述】:

我试图从 Instagram 上的公共用户帐户获取帖子,我尝试了几乎所有可能的方法,但它们都返回 403 错误(访问被拒绝)。

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

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

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

以上是我尝试获取数据的链接。正如我所读到的 Instagram 正在改变他们的协议,还有没有其他方法可以在不使用 Instagram API 和后端代码的情况下从任何公共用户那里获取帖子列表?

谢谢

【问题讨论】:

You don't have authorization to view this page. HTTP ERROR 403 并拒绝访问,它不公开。 什么是不公开的?抱歉没明白。我正在尝试做的是让公共用户在没有后端或 instagram API 的情况下发布所有帖子。 Instagram 已更改协议,我不知道是否还有机会获得此数据。 访问被拒绝,它可能只对注册用户是“公开的”,无论如何,如果你想在不使用 API 的情况下访问帖子,你可以做一个爬虫。 抱歉,您能否更具体地说明一下“制作刮刀”是什么意思?谢谢。 我制作了爬虫并获得了前 12 个帖子,但是否有可能获得所有页面?有什么建议 ?谢谢。 【参考方案1】:

您的第二个解决方案应该有效。尝试访问此网址:

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

它包含用户可从其页面获得的所有信息,包括 12 个最新的帖子,大小不一。作为旁注,它不包含关注者或关注列表

我做了一个使用这种方法的jquery插件:

https://github.com/kasperlegarth/instastory.js

【讨论】:

为什么我不能从邮递员那里得到任何想法?【参考方案2】:

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

您需要在请求的标头中包含会话 cookie

获取有效请求的所有标头的一种简单方法是转到开发者工具的网络部分并复制请求标头或其他格式。

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

【讨论】:

我也尝试过,我将 cookie 放入我的请求标头,但结果相同,也许我做错了什么。如果你有时间,你能给我一个工作例子吗?谢谢你。【参考方案3】:

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】:

只需使用一些 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)

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

【讨论】:

以上是关于如何在没有 instagram API 的情况下从 instagram 获取公共用户的所有帖子的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有用户身份验证的情况下从 Spotify 或任何其他 API 获取歌曲预览

如何在没有 Web 源模块的情况下从 Oracle APEX 中的 API 获取数据

如何在没有 API 的情况下获取 Instagram 中标签的所有图像?

如何在没有用户交互的情况下获取 instagram access_token(新 api)?

如何在没有用户登录的情况下访问 Instagram Basic Display API?

如何在没有api的情况下阅读Instagram图像和用户