127 votes

Comment publier des photos sur instagram en utilisant l'API

Je construis une application php qui doit poster la photo téléchargée par l'utilisateur directement sur Instagram, mais après une recherche rapide, j'ai trouvé qu'il n'y a pas de telle fonction dans l'API :( et ça fait bizarre... parce qu'ils devraient en fournir une. Je ne suis pas sûr qu'il y ait un autre moyen (à part les applications pour Android et iOS) de télécharger une photo en utilisant php. Merci de me donner une idée s'il y a une possibilité.

J'ai également lu ceci ,

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

106voto

Lance Points 4208

Mise à jour :

Instagram bannit désormais les comptes et supprime les images sur la base de cette méthode. Veuillez l'utiliser avec prudence.


Il semble que tous ceux qui ont répondu à cette question aient dit quelque chose du genre it can't be done est plutôt correct. Officiellement, vous ne pouvez pas publier une photo sur Instagram avec leur API. Cependant, si vous faites de 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";
                    }
                }
            }
        }
    }
}

Il suffit de copier et de coller le code ci-dessus dans votre éditeur de texte, de modifier les quelques variables en conséquence et VOILA ! J'ai écrit un article à ce sujet et je l'ai fait de nombreuses fois. Voir une démo aquí .

99voto

Albzi Points 13492

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.

Instagram a maintenant dit ceci :

Vous pouvez désormais publier votre contenu à l'aide des API d'Instagram (Nouveau) effets à partir de 26 janvier 2021 !

https://developers.facebook.com/blog/post/2021/01/26/introducing-instagram-content-publishing-api/

J'espère que vous aurez un peu de chance ici.

28voto

Tom Roggero Points 2581

UPDATE C'est désormais possible :

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

L'API de publication de contenu est un sous-ensemble de points de terminaison de l'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 vous publiez le conteneur sur votre compte professionnel.

14voto

Joshua Dance Points 937

Instagram permet désormais aux entreprises de programmer leurs posts, en utilisant les nouveaux points de terminaison de la bêta de la publication de contenu.

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

Cependant, ce billet de blog - https://business.instagram.com/blog/instagram-api-features-updates - indique clairement qu'elle n'ouvre cette API qu'à ses partenaires marketing Facebook ou Instagram.

Pour commencer à programmer 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 bêta fermée.

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

Mais c'est comme ça que vous le feriez :

Vous avez une photo à...

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

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

Vous pourriez utiliser le /user/media 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é du docs .

11voto

Dheeraj Thedijje Points 799

J'ai essayé d'utiliser IFTTT et de nombreux autres services mais tous faisaient des choses ou postaient d'Instagram vers une autre plateforme et non vers Instagram. J'ai lu davantage pour découvrir qu'Instagram ne fournit pas une telle API pour le moment.

L'utilisation de la pile bleue implique à nouveau une installation lourde et des opérations manuelles.

Cependant, vous pouvez utiliser votre Google Chrome sur la version de bureau pour faire un post sur Instagram. Cela nécessite une petite mise au point.

  1. Ouvrez votre chrome et naviguez sur Instagram.com
  2. Allez dans l'élément d'inspection en faisant un clic droit sur le chrome.
  3. Dans le menu Corener en haut à droite, cliquez sur Outils de développement, puis sélectionnez Autres outils.
  4. Sélectionnez en outre les conditions du réseau.
  5. Dans la section de sélection du réseau, voir la deuxième section nommée agent utilisateur.
  6. Décochez sélectionnez automatiquement et sélectionnez chrome pour Android à partir de la liste de l'agent utilisateur donné.
  7. Rafraîchissez votre page Instagram.com.

Vous remarquerez un changement d'interface utilisateur et l'option de faire un post sur Instagram. Votre vie est maintenant facile. Faites-moi part d'un moyen plus facile si vous en trouvez un.

enter image description here

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

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X