如何使用API​​将图片发布到instagram


107

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

我也读过这个

如何使用PHP与Instagram共享链接和照片


2
无法通过API将图片发布到Instagram。
阿马尔·穆拉利

3
我不知道他们如何-blog.hootsuite.com/schedule-instagram-posts-in-hootsuite-做到了...(博客公告发布于8个小时前)
火星罗伯逊

1
@MichalStefanow我也认为这是一个好问题。该博客公告还包含Hootsuite的评论(在文章下方的评论部分),由于API的限制,没有实际直接发布到Instagram,最终发布必须在Instagram中完成。
thecommonthread

那2019年中期呢?有什么变化吗?
userlond

Answers:


81

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

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

看来您可以在PC上模拟instagram。

Bluestacks是一个模拟器,可让您在PC / Mac等上运行android应用。

我不确定它的运作情况如何。


57
好吧,如果没有办法,那么我不认为还有“另一种”方式。
2013年

1
@bart在@Ritu发布时,它确实做了instagram,但posts.so不是postso.com
Albzi

2
不幸的是,@ usama尚未正式发布,但我听说有传言说,如果您转到他们的网站并将其缩放为移动视图,则可以。虽然我自己没有尝试过
Albzi

1
@Albzi如果您使用的是Google Chrome浏览器;进入Instagram网站并右键单击并使用“检查”,它将调整大小并将标头更改为允许移动浏览器签名。您可能需要在“检查”中刷新一次Instagram页面,但这将允许您将网站用作移动设备并可以发布照片,而不能发布照片。然而; 这对API问题没有帮助。我希望能够将PHP的照片发布到Instagram,以显示我们团队的最终得分。
道森·欧文

1
有道理。@BrodaNoel,也许我应该将其更改为“官方”方式。
阿尔比(Albzi)

102

更新:

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!我写了一篇有关此的文章,并且已经做了很多次。在此处查看演示。


1
如果不使用电话,则无法使用上述代码登录。我刚刚在使用PC的本地主机中使用,并且收到了错误消息,例如****尝试登录时从服务器收到了空响应***如何解决该错误
Rabesh Lal Shrestha 2015年

1
已经有可以使用此代码制作的.net变体了吗?我不能使用PHP,此代码的.NET版本将非常有用!
Yosoyke 2015年

1
我能够在新的Instagram帐户上成功运行脚本。
loretoparisi

2
如果要获取status isnt okay,请确保CURL有权制作cookies.txt文件。chmod 777 /directory将这样做(请小心)。我从您的脚本中收到一条成功消息,但该帖子未显示在instagram上。这仍然有效吗?
kmoney12'2013-4-9

8
代码可以正常工作,但是guid和deviceid每次都会更改,并且instagram在发布成功后会禁止我的帐户。照片也被删除了。
Alp Altunel

27

更新 现在可以:

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

内容发布API是Instagram Graph API终结点的子集,可让您发布媒体对象。使用此API发布媒体对象是一个两步过程-首先创建一个媒体对象容器,然后将该容器发布到您的企业帐户上。


22
值得注意的是:“ Content Publishing API仅在Facebook Marketing Partners和Instagram Partners的封闭测试版中。我们目前不接受新申请人。”
威廉·里德

这仅适用于企业帐户吗?
Suncatcher

这个答案如何?这是不可能的,此API仅适用于合作伙伴...
Matej J

1
它说找不到页面!
Mohamed Imran

12

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)清楚地表明,他们仅向该API的Facebook营销合作伙伴或Instagram合作伙伴开放该API。

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

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

Content Publishing API仅在Facebook Marketing Partners和Instagram Partners的封闭测试版中。我们目前不接受新申请人。

但这是您要执行的操作:

你有一张照片在...

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

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

您可以使用/user/mediaedge这样创建容器:

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


谢谢,但是我可以在其中创建应用程序,例如我们可以在Facebook开发人员区域中为Facebook创建应用程序。
usama

这段代码给出了一个错误-“应用程序无权进行此API调用。”?这些技术公司完全没有道理。他们如何要求使用来自某些首选合作伙伴,而不是制作自己的应用。
阿米特·卡雷

8

我尝试使用IFTTT和许多其他服务,但都是在做事,或者是从Instagram发布到另一个平台而不是Instagram。我阅读了更多内容,发现Instagram到目前为止尚未提供任何此类API。

使用蓝色堆栈再次涉及繁重的安装和仅手动操作。

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

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

您会注意到UI的更改以及在Instagram上发帖的选项。您的生活现在很轻松。如果您可以找到任何一种简单的方法,请告诉我。

在此处输入图片说明

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

工作截图

在此处输入图片说明


但是您不能发布任何内容。
到达Aarvy

1
我刚刚使用相同的方法发布。一切正常。请参阅更新中的屏幕截图。
Dheeraj Thedijje

5

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


1
@Ritu有趣。那时一定有可能,但是API似乎不支持它。感谢您的分享,我想研究一下。
Amru E.

1
我也想知道他们的做法,如果您能得到一些相关的信息,请分享。
Ritu

2
似乎大多数未授权的客户端通过解密和监视从应用程序到服务器的SSL流量来对API进行反向工程。至少Snapchat就是这种情况。这里可能是一样的。
Amru E.

Mac的Flume App也会发布到您的供稿中
约书亚


0

如果具有UI,则具有“ API”。让我们使用以下示例:我想发布在我创建的任何新博客文章中使用的图片。假设是Wordpress。

  1. 创建一个通过RSS不断监视您的博客的服务。
  2. 发布新的博客文章后,下载图片。
  3. (可选)使用第三方API向您的图片添加一些叠加层。
  4. 将照片放在PC或服务器上的知名位置。
  5. 配置Chrome(如上所述),以便您可以将浏览器用作移动设备。
  6. 使用Selenium(或任何其他这些库),模拟在Instagram上发布的整个过程。
  7. 做完了 你应该有它。

0

对于正在寻找有关使用AWS lambdapuppeteerchrome-aws-lambda)发布到Instagram的解决方案的任何人。请注意,此解决方案仅允许您为每个帖子发布1张照片。如果您不使用lambda,则只需替换chrome-aws-lambdapuppeteer

对于首次启动lambda,由于instagram检测到“可疑登录尝试”,因此通常无法正常工作。只需使用您的PC进入instagram页面并批准它,一切就可以了。

这是我的代码,随时对其进行优化:

// instagram.js
const chromium = require('chrome-aws-lambda');

const username = process.env.IG_USERNAME;
const password = process.env.IG_PASSWORD;

module.exports.post = async function(fileToUpload, caption){
    const browser = await chromium.puppeteer.launch({
        args: [...chromium.args, '--window-size=520,700'],
        defaultViewport: chromium.defaultViewport,
        executablePath: await chromium.executablePath,
        headless: false,
        ignoreHTTPSErrors: true,
    });
    const page = await browser.newPage();
    await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) FxiOS/7.5b3349 Mobile/14F89 Safari/603.2.4');
    await page.goto('https://www.instagram.com/', {waitUntil: 'networkidle2'});
    
    const [buttonLogIn] = await page.$x("//button[contains(., 'Log In')]");
    if (buttonLogIn) {
        await buttonLogIn.click();
    }

    await page.waitFor('input[name="username"]');
    await page.type('input[name="username"]', username)
    await page.type('input[name="password"]', password)
    await page.click('form button[type="submit"]');

    await page.waitFor(3000);
    const [buttonSaveInfo] = await page.$x("//button[contains(., 'Not Now')]");
    if (buttonSaveInfo) {
        await buttonSaveInfo.click();
    }

    await page.waitFor(3000);
    const [buttonNotificationNotNow] = await page.$x("//button[contains(., 'Not Now')]");
    const [buttonNotificationCancel] = await page.$x("//button[contains(., 'Cancel')]");
    if (buttonNotificationNotNow) {
        await buttonNotificationNotNow.click();
    } else if (buttonNotificationCancel) {
        await buttonNotificationCancel.click(); 
    }

    await page.waitFor('form[enctype="multipart/form-data"]');
    const inputUploadHandle = await page.$('form[enctype="multipart/form-data"] input[type=file]');

    await page.waitFor(5000);
    const [buttonPopUpNotNow] = await page.$x("//button[contains(., 'Not Now')]");
    const [buttonPopUpCancel] = await page.$x("//button[contains(., 'Cancel')]");
    if (buttonPopUpNotNow) {
        await buttonPopUpNotNow.click();
    } else if (buttonPopUpCancel) {
        await buttonPopUpCancel.click(); 
    }

    await page.click('[data-testid="new-post-button"]')
    await inputUploadHandle.uploadFile(fileToUpload);

    await page.waitFor(3000);
    const [buttonNext] = await page.$x("//button[contains(., 'Next')]");
    await buttonNext.click();

    await page.waitFor(3000);
    await page.type('textarea', caption);

    const [buttonShare] = await page.$x("//button[contains(., 'Share')]");
    await buttonShare.click();
    await page.waitFor(3000);

    return true;
};
// handler.js

await instagram.post('/tmp/image.png', '#text');

它必须是本地文件路径,如果是url,请首先将其下载到/ tmp文件夹

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.