Comment publier des photos sur Instagram à l'aide de l'API

109

Je suis en train de créer une application php qui doit publier l'image téléchargée par l'utilisateur directement sur Instagram, mais après une recherche rapide, j'ai trouvé qu'il n'y avait pas une telle fonction dans l'API: (et cela me semble bizarre ... car ils devraient en fournir une. Je Je ne sais pas s'il existe un autre moyen (à l'exception des applications pour Android et iOS) pour télécharger une image en utilisant php. Veuillez me donner une idée s'il y a une possibilité.

J'ai aussi lu ceci,

Comment partager un lien et une photo avec Instagram en utilisant PHP

Altaf Hussain
la source
2
Il n'est pas possible de publier des photos sur Instagram via l'API.
Amal Murali
3
Je me demande comment ils - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite - font-le ... (l'annonce du blog a été postée il y a 8 heures)
Mars Robertson
1
@MichalStefanow Je pensais que c'était aussi une bonne question. Cette annonce de blog contient également un commentaire de Hootsuite (dans la section des commentaires sous l'article) indiquant qu'il n'y a pas de publication directe sur Instagram en raison des limites de l'API et que la publication finale doit être effectuée sur Instagram.
thecommonthread
Et la mi-2019? Y a-t-il des changements?
userlond

Réponses:

81

Si vous lisez le lien que vous avez partagé, la réponse acceptée est:

Vous ne pouvez pas publier de photos sur Instagram via l'API.

Il semble que vous puissiez émuler Instagram sur PC.

Bluestacks est un émulateur qui vous permet d'exécuter des applications Android sur votre PC / Mac, etc.

Je ne sais pas si cela fonctionne bien.

Albzi
la source
58
Eh bien, s'il n'y a AUCUN moyen de le faire, alors je ne suppose pas qu'il y ait une «autre» façon.
Albzi le
1
@bart au moment de la publication de @Ritu, il a fait instagram et posts.sone l' était paspostso.com
Albzi
2
@usama malheureusement pas officiellement, mais j'ai entendu des rumeurs selon lesquelles si vous accédez à leur site Web et que vous le réduisez en vue mobile, vous le pouvez.
Je n'ai
1
@Albzi Si vous utilisez Google Chrome; est arrivé sur le site Instagram et faites un clic droit et utilisez le "Inspecter", il redimensionnera et changera l'en-tête en une signature de navigateur mobile permettant. Vous devrez peut-être actualiser la page Instagram une fois dans «Inspecter», mais cela vous permettra d'utiliser le site Web comme un mobile et de publier des photos et autres. Toutefois; cela n'aide pas avec la question de l'API. J'aimerais pouvoir publier une photo de PHP sur Instagram montrant le score final de nos équipes.
Dawson Irvine
1
Bon point. @BrodaNoel, je devrais peut-être changer cela en une manière non officielle.
Albzi
102

Mettre à jour:

Instagram interdit maintenant les comptes et supprime les images en fonction de cette méthode. Veuillez utiliser avec prudence.


Il semble que tous ceux qui ont répondu à cette question avec quelque chose du genre ont it can't be donequelque peu raison. Officiellement, vous ne pouvez pas publier une photo sur Instagram avec leur API. Cependant, si vous procédez à l'ingénierie inverse de l'API, vous le pouvez.

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";
                    }
                }
            }
        }
    }
}

Copiez et collez simplement le code ci-dessus dans votre éditeur de texte, modifiez les quelques variables en conséquence et VOILA! J'ai écrit un article à ce sujet et je l'ai fait plusieurs fois. Voir une démo ici .

Lance
la source
1
Impossible de se connecter en utilisant le code ci-dessus sans utiliser le téléphone. Je viens de l'utiliser dans localhost en utilisant un PC et je viens de recevoir un message d'erreur comme **** Réponse vide reçue du serveur en essayant de se connecter *** comment résoudre cette erreur
Rabesh Lal Shrestha
1
Existe-t-il déjà une variante .net fonctionnelle de ce code? Je ne peux pas travailler avec PHP et une version .NET de ce code serait vraiment utile!
Yosoyke
1
J'ai pu exécuter le script avec succès sur un nouveau compte Instagram.
loretoparisi
2
Si vous obtenez status isnt okay, assurez-vous que CURL dispose des autorisations nécessaires pour créer un fichier cookies.txt. chmod 777 /directoryfera ceci (soyez prudent). Je reçois un message de réussite de votre script, mais le message ne s'affiche pas sur instagram. Cela fonctionne-t-il toujours?
kmoney12
8
Le code fonctionne bien mais le guid et le deviceid changent à chaque fois et instagram a interdit mon compte après une seule publication réussie. la photo a également été supprimée.
Alp Altunel
27

MISE À JOUR Il est maintenant possible:

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

L'API de publication de contenu est un sous-ensemble de points de terminaison d'API Instagram Graph qui vous permet de publier des objets multimédias. La publication d'objets multimédias avec cette API est un processus en deux étapes: vous créez d'abord un conteneur d'objets multimédias, puis publiez le conteneur sur votre compte professionnel.

Tom Roggero
la source
22
Il convient de noter que "L'API de publication de contenu est en version bêta fermée avec les partenaires marketing Facebook et les partenaires Instagram uniquement. Nous n'acceptons pas de nouveaux candidats pour le moment."
William Reed
Cela s'applique-t-il uniquement aux comptes professionnels?
Suncatcher
Comment est-ce une réponse? Ce n'est pas possible, cette API est réservée aux partenaires ...
Matej J
1
Il indique que la page n'a pas été trouvée!
Mohamed Imran le
12

Instagram permet désormais aux entreprises de planifier leurs publications à l'aide des nouveaux points de terminaison de la publication de contenu bêta.

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

Cependant, cet article de blog - https://business.instagram.com/blog/instagram-api-features-updates - indique clairement qu'ils n'ouvrent cette API qu'à leurs partenaires marketing Facebook ou Instagram.

Pour commencer à planifier des publications, veuillez travailler avec l'un de nos partenaires marketing Facebook ou Instagram.

Ce lien de Facebook - https://developers.facebook.com/docs/instagram-api/content-publishing - le répertorie comme une version bêta fermée.

L'API de publication de contenu est en version bêta fermée avec les partenaires marketing Facebook et les partenaires Instagram uniquement. Nous n'acceptons pas de nouveaux candidats pour le moment.

Mais voici comment vous le feriez:

Vous avez une photo à ...

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

Vous souhaitez le publier avec le hashtag "#BronzFonz".

Vous pouvez utiliser le /user/mediabord pour créer le conteneur comme ceci:

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

Cela renverrait un ID de conteneur (disons 17889455560051444), que vous publieriez ensuite en utilisant le bord / user / media_publish, comme ceci:

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

Cet exemple tiré de la documentation .

Danse Joshua
la source
Merci, mais où je peux créer l'application pour cela, nous pouvons créer une application pour Facebook dans la zone des développeurs Facebook.
usama
Ce code donne une erreur - "L'application n'a pas la capacité de faire cet appel d'API."? Cela n'a aucun sens de la part de ces entreprises technologiques. Comment peuvent-ils demander à utiliser des partenaires privilégiés et ne pas créer notre propre application.
Amit Khare
8

J'ai essayé d'utiliser IFTTT et de nombreux autres services, mais tous faisaient des choses ou publiaient d'Instagram sur une autre plateforme pas sur Instagram. J'ai lu plus pour trouver qu'Instagram ne fournit aucune API de ce type pour le moment.

L'utilisation de la pile bleue implique à nouveau une installation lourde et ne fait les choses que manuellement.

Cependant, vous pouvez utiliser votre Google Chrome sur la version de bureau pour publier une publication sur Instagram. Il a besoin d'un petit ajustement.

  1. Ouvrez votre chrome et parcourez Instagram.com
  2. Allez inspecter l'élément en faisant un clic droit sur chrome.
  3. Dans le menu déroulant en haut à droite des outils de développement, sélectionnez plus d'outil.
  4. Sélectionnez ensuite les conditions du réseau.
  5. Dans la section de sélection de réseau, voir la deuxième section nommée agent utilisateur.
  6. Décochez la case Sélectionner automatiquement et sélectionnez Chrome pour Android dans la liste de l'agent utilisateur donné.
  7. Actualisez votre page Instagram.com.

Vous remarquerez un changement dans l'interface utilisateur et la possibilité de publier une publication sur Instagram. Votre vie est maintenant facile. Faites-moi savoir un moyen plus simple si vous pouvez en trouver.

entrez la description de l'image ici

J'ai écrit sur https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html à ce sujet.

Capture d'écran de travail

entrez la description de l'image ici

Dheeraj Thedijje
la source
Mais vous ne pouvez rien poster.
Aarvy
1
Je viens de publier en utilisant la même méthode. Cela fonctionne parfaitement. Voir la capture d'écran dans la mise à jour.
Dheeraj Thedijje
5

Pour les utilisateurs qui trouvent cette question, vous pouvez transmettre des photos au flux de partage instagram (de votre application à l'écran des filtres) sur iPhone à l'aide de crochets iPhone: http://help.instagram.com/355896521173347 Autre que cela, il n'y a actuellement pas manière dans la version 1 de l'API.

Amru E.
la source
1
@Ritu intéressant. Cela doit être possible alors, mais il ne semble pas que l'API le permette. Merci pour le partage, je veux y réfléchir.
Amru E.
1
Je me demandais également comment ils le faisaient, veuillez partager si vous obtiendrez quelque chose de pertinent.
Ritu
2
Il semble que la plupart des clients non autorisés effectuent une rétro-ingénierie de l'API en déchiffrant et en surveillant le trafic SSL de l'application vers le serveur. C'est du moins le cas pour Snapchat. Cela pourrait être la même chose ici.
Amru E.
L'application Flume pour Mac publie également dans votre flux
Joshua - Pendo
0

S'il a une interface utilisateur, il a une "API". Prenons l'exemple suivant: Je souhaite publier la photo que j'utilise dans tout nouveau billet de blog que je crée. Supposons que c'est Wordpress.

  1. Créez un service qui surveille constamment votre blog via RSS.
  2. Lorsqu'un nouveau billet de blog est publié, téléchargez l'image.
  3. (Facultatif) Utilisez une API tierce pour appliquer des superpositions et autres à votre photo.
  4. Placez la photo dans un emplacement bien connu sur votre PC ou serveur.
  5. Configurez Chrome (lisez ci-dessus) pour pouvoir utiliser le navigateur comme un mobile.
  6. À l'aide de Selenium (ou de toute autre de ces bibliothèques), simulez l'ensemble du processus de publication sur Instagram.
  7. Terminé. Vous devriez l'avoir.
Pepito Fernandez
la source
0

Pour tous ceux qui recherchent une solution pour publier sur Instagram à l'aide d' AWS lambda et de puppeteer ( chrome-aws-lambda ). A noté que cette solution vous permet de publier 1 photo pour chaque publication uniquement . Si vous n'utilisez pas lambda, remplacez simplement chrome-aws-lambdapar puppeteer.

Pour le premier lancement de lambda, il est normal que cela ne fonctionne pas car instagram détecte une «tentative de connexion suspecte» . Accédez à la page instagram en utilisant votre PC et approuvez-le , tout devrait bien se passer .

Voici mon code, n'hésitez pas à l'optimiser:

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

il doit s'agir du chemin du fichier local, s'il s'agit d'une URL, téléchargez-le d'abord dans le dossier / tmp .

Allen Wong
la source
C'est une solution plutôt intéressante :) Merci.
Kristoffer Berg - EcodeAS il y a