如何使用API 将图片发布到Instagram

问题描述 投票:84回答:7

我正在构建一个需要将用户上传的图片直接发布到Instagram上的php应用程序,但经过快速搜索后我发现API中没有这样的功能:(感觉很奇怪...因为它们应该提供一个。我我不确定是否有任何其他方式(除了Android和iOS的应用程序)使用php上传图片。如果有任何可能性,请给我任何想法。

我也读过这个,

How do I share a link and photo with Instagram using PHP

谢谢

php instagram
7个回答
69
投票

如果您阅读了您分享的链接,则接受的答案是:

您无法通过API将图片发布到Instagram。

看来你可以在PC上模仿Instagram。

Bluestacks是一个模拟器,它允许您在PC / Mac等上运行Android应用程序。

我不确定它的效果如何。


91
投票

更新:

Instagram现在禁止帐户并根据此方法删除图像。请谨慎使用。


似乎每个用it can't be done的方式回答这个问题的人都是正确的。正式地说,你不能用他们的API将照片发布到Instagram。但是,如果您对API进行反向工程,则可以。

function SendRequest($url, $post, $post_data, $user_agent, $cookies) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://i.instagram.com/api/v1/'.$url);
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    if($post) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    }

    if($cookies) {
        curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');            
    } else {
        curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    }

    $response = curl_exec($ch);
    $http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

   return array($http, $response);
}

function GenerateGuid() {
     return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', 
            mt_rand(0, 65535), 
            mt_rand(0, 65535), 
            mt_rand(0, 65535), 
            mt_rand(16384, 20479), 
            mt_rand(32768, 49151), 
            mt_rand(0, 65535), 
            mt_rand(0, 65535), 
            mt_rand(0, 65535));
}

function GenerateUserAgent() {  
     $resolutions = array('720x1280', '320x480', '480x800', '1024x768', '1280x720', '768x1024', '480x320');
     $versions = array('GT-N7000', 'SM-N9000', 'GT-I9220', 'GT-I9100');
     $dpis = array('120', '160', '320', '240');

     $ver = $versions[array_rand($versions)];
     $dpi = $dpis[array_rand($dpis)];
     $res = $resolutions[array_rand($resolutions)];

     return 'Instagram 4.'.mt_rand(1,2).'.'.mt_rand(0,2).' Android ('.mt_rand(10,11).'/'.mt_rand(1,3).'.'.mt_rand(3,5).'.'.mt_rand(0,5).'; '.$dpi.'; '.$res.'; samsung; '.$ver.'; '.$ver.'; smdkc210; en_US)';
 }

function GenerateSignature($data) {
     return hash_hmac('sha256', $data, 'b4a23f5e39b5929e0666ac5de94c89d1618a2916');
}

function GetPostData($filename) {
    if(!$filename) {
        echo "The image doesn't exist ".$filename;
    } else {
        $post_data = array('device_timestamp' => time(), 
                        'photo' => '@'.$filename);
        return $post_data;
    }
}


// Set the username and password of the account that you wish to post a photo to
$username = 'ig_username';
$password = 'ig_password';

// Set the path to the file that you wish to post.
// This must be jpeg format and it must be a perfect square
$filename = 'pictures/test.jpg';

// Set the caption for the photo
$caption = "Test caption";

// Define the user agent
$agent = GenerateUserAgent();

// Define the GuID
$guid = GenerateGuid();

// Set the devide ID
$device_id = "android-".$guid;

/* LOG IN */
// You must be logged in to the account that you wish to post a photo too
// Set all of the parameters in the string, and then sign it with their API key using SHA-256
$data ='{"device_id":"'.$device_id.'","guid":"'.$guid.'","username":"'.$username.'","password":"'.$password.'","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}';
$sig = GenerateSignature($data);
$data = 'signed_body='.$sig.'.'.urlencode($data).'&ig_sig_key_version=4';
$login = SendRequest('accounts/login/', true, $data, $agent, false);

if(strpos($login[1], "Sorry, an error occurred while processing this request.")) {
    echo "Request failed, there's a chance that this proxy/ip is blocked";
} else {            
    if(empty($login[1])) {
        echo "Empty response received from the server while trying to login";
    } else {            
        // Decode the array that is returned
        $obj = @json_decode($login[1], true);

        if(empty($obj)) {
            echo "Could not decode the response: ".$body;
        } else {
            // Post the picture
            $data = GetPostData($filename);
            $post = SendRequest('media/upload/', true, $data, $agent, true);    

            if(empty($post[1])) {
                 echo "Empty response received from the server while trying to post the image";
            } else {
                // Decode the response 
                $obj = @json_decode($post[1], true);

                if(empty($obj)) {
                    echo "Could not decode the response";
                } else {
                    $status = $obj['status'];

                    if($status == 'ok') {
                        // Remove and line breaks from the caption
                        $caption = preg_replace("/\r|\n/", "", $caption);

                        $media_id = $obj['media_id'];
                        $device_id = "android-".$guid;
                        $data = '{"device_id":"'.$device_id.'","guid":"'.$guid.'","media_id":"'.$media_id.'","caption":"'.trim($caption).'","device_timestamp":"'.time().'","source_type":"5","filter_type":"0","extra":"{}","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}';   
                        $sig = GenerateSignature($data);
                        $new_data = 'signed_body='.$sig.'.'.urlencode($data).'&ig_sig_key_version=4';

                       // Now, configure the photo
                       $conf = SendRequest('media/configure/', true, $new_data, $agent, true);

                       if(empty($conf[1])) {
                           echo "Empty response received from the server while trying to configure the image";
                       } else {
                           if(strpos($conf[1], "login_required")) {
                                echo "You are not logged in. There's a chance that the account is banned";
                            } else {
                                $obj = @json_decode($conf[1], true);
                                $status = $obj['status'];

                                if($status != 'fail') {
                                    echo "Success";
                                } else {
                                    echo 'Fail';
                                }
                            }
                        }
                    } else {
                        echo "Status isn't okay";
                    }
                }
            }
        }
    }
}

只需在文本编辑器中复制并粘贴上面的代码,相应地更改几个变量和VOILA!我写了一篇关于这个问题的article,我已经多次完成了。查看演示here


10
投票

更新现在可以:

https://developers.facebook.com/docs/instagram-api/content-publishing

Content Publishing API是Instagram Graph API端点的子集,允许您发布媒体对象。使用此API发布媒体对象分为两个步骤 - 首先创建媒体对象容器,然后在您的企业帐户上发布容器。


5
投票

对于发现此问题的用户,您可以使用iPhone挂钩将照片传递到iPhone上的Instagram共享流程(从您的应用程序到过滤器屏幕):http://help.instagram.com/355896521173347除此之外,api版本1中目前还没有办法。


4
投票

Instagram现在允许企业使用新的Content Publishing Beta端点安排他们的帖子。

https://developers.facebook.com/blog/post/2018/01/30/instagram-graph-api-updates/

然而,这篇博客文章 - https://business.instagram.com/blog/instagram-api-features-updates - 明确表示他们只是向他们的Facebook营销合作伙伴或Instagram合作伙伴开放该API。

要开始安排帖子,请与我们的Facebook营销合作伙伴或Instagram合作伙伴合作。

来自Facebook的这个链接 - https://developers.facebook.com/docs/instagram-api/content-publishing - 将其列为封闭测试版。

Content Publishing API仅与Facebook营销合作伙伴和Instagram合作伙伴进行内测。我们目前不接受新申请人。

但这就是你要做的:

你有一张照片......

https://www.example.com/images/bronz-fonz.jpg

您想要使用#BronzFonz标签发布它。

您可以使用/user/media边创建容器,如下所示:

POST graph.facebook.com 
  /17841400008460056/media?
    image_url=https%3A%2F%2Fwww.example.com%2Fimages%2Fbronz-fonz.jpg&
    caption=%23BronzFonz

这将返回一个容器ID(假设为17889455560051444),然后您将使用/ user / media_publish边缘发布,如下所示:

POST graph.facebook.com
  /17841405822304914/media_publish
    ?creation_id=17889455560051444

这个例子来自docs


2
投票

我尝试使用IFTTT和许多其他服务,但都是在做事或从Instagram发布到另一个平台而不是Instagram。我读了更多,发现Instagram现在没有提供任何这样的API。

使用蓝色堆栈再次涉及大量安装和仅手动操作。

但是,您可以使用桌面版Google Chrome浏览器在Instagram上发布帖子。它需要一点调整。

  1. 打开你的chrome并浏览Instagram.com
  2. 通过右键单击chrome来检查元素。
  3. 从开发人员工具的右上角菜单下拉列表中,选择更多工具。
  4. 进一步选择网络条件。
  5. 在网络选择部分,请参阅名为user agent的第二部分。
  6. 取消选中自动选择,然后从给定用户代理列表中选择适用于Android的chrome。
  7. 刷新Instagram.com页面。

您会注意到UI的变化以及在Instagram上发布帖子的选项。你现在的生活很轻松。如果你能找到任何一个,请告诉我一个更简单的方法。

enter image description here

我在https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html上写过它。

© www.soinside.com 2019 - 2024. All rights reserved.