web-dev-qa-db-fra.com

Comment publier des photos sur Instagram en utilisant l'API

Je suis en train de construire une application php qui doit publier la photo téléchargée de l'utilisateur directement sur Instagram, mais après une recherche rapide, j'ai constaté qu'il n'existait aucune telle fonction dans l'API :( et ça fait bizarre ... parce qu'ils devraient en fournir un. I Je ne sais pas s'il existe un autre moyen (à l'exception des applications pour Android et iOS) de télécharger des images à l'aide de php. Veuillez me donner une idée de toute possibilité éventuelle.

J'ai aussi lu ceci,

Comment partager un lien et une photo avec Instagram avec PHP

Je vous remercie

81
Altaf Hussain

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 cependant 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.

68
Albzi

Mettre à jour:

Instagram interdit maintenant les comptes et supprime les images basées sur cette méthode. S'il vous plaît utiliser avec prudence.


Il semble que tous ceux qui ont répondu à cette question avec quelque chose du type it can't be done sont assez corrects. Officiellement, vous ne pouvez pas publier une photo sur Instagram avec leur API. Cependant, si vous procédez au reverse engineering 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 .

89
Lance

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 pour iPhone: http://help.instagram.com/355896521173347 Autre que cela, il n'y a actuellement aucun moyen dans la version 1 de l'API. 

5
Amru E.

UPDATE 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 de l'API de graphes Instagram 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 devez d'abord créer un conteneur d'objets multimédias, puis le publier sur votre compte professionnel.

5
Tom Roggero

Instagram permet désormais aux entreprises de planifier leurs publications en utilisant les nouveaux points de terminaison bêta de Content Publishing. 

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 à programmer des publications, veuillez travailler avec l’un de nos Partenaires marketing Facebook ou partenaires Instagram.

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

L'API de publication de contenu est en version bêta fermée avec Facebook Marketing Partenaires et partenaires Instagram uniquement. Nous n'acceptons pas de nouvelles candidats à ce moment.

Mais voici comment vous le feriez:

Vous avez une photo à ...

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

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

Vous pouvez utiliser le bord /user/media pour créer le conteneur de la manière suivante:

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 (par exemple, 17889455560051444), que vous publieriez ensuite à l'aide de/user/media_publish Edge, comme ceci:

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

Cet exemple tiré de docs .

3
Joshua Dance

Il n’existe pas d’API permettant de publier des photos sur instagram à l’aide d’API, mais il existe un moyen simple d’installer l’extension de Google "Agent utilisateur" qui convertira votre navigateur en version Android mobile chrome. Voici le lien d'extension https://chrome.google.com/webstore/detail/user-agent-switcher/clddifkhljcojbojppdojfeeikdkgiae?utm_source=chrome-ntp-icon

il suffit de cliquer sur l'icône d'extension et de choisir chrome pour Android et ouvrir Instagram.com.

0
Waheed Sabir

Encore plus simple si vous utilisez Concrete Social API . Notez que vous pouvez publier des images et des vidéos (meda_type peut être "image" ou "vidéo").

curl --request POST \
  --url https://concretesocial.io/1.0/publish \
  --data '{ "caption":"Wonderful",
            "media_type" : "image",
            "media_url" : "https://cdn.pixabay.com/photo/2018/10/28/16/11/landscape-3779159_1280.jpg", 
            "profiles" : ['5c21013a8c93b0050877659d']"}'                    

Divulgation complète - J'ai construit cette API :)

0
Chris Bovan

J'ai essayé d'utiliser IFTTT et de nombreux autres services, mais tous faisaient des choses ou publiaient depuis Instagram sur une autre plate-forme, mais pas sur Instagram. J'ai lu plus à fond Instagram trouvé ne fournit aucune telle API pour l'instant.

L'utilisation de la pile bleue implique à nouveau une installation lourde et une manipulation manuelle uniquement.

Cependant, vous pouvez utiliser votre Google Chrome sur la version de bureau pour publier un message sur Instagram. Il faut un peu Tweak.

  1. Ouvrez votre chrome et naviguez sur Instagram.com
  2. Accédez à l'élément en cliquant avec le bouton droit de la souris sur chrome.
  3. Dans le menu déroulant en haut à droite des outils de développement, sélectionnez plusieurs outils.
  4. Autres conditions de réseau sélectionnées.
  5. Dans la section de sélection du réseau, reportez-vous à la deuxième section nommée agent d'utilisateur.
  6. Désélectionnez select automatiquement, et sélectionnez chrome pour Android dans la liste des agents utilisateurs donnés.
  7. Actualisez votre page Instagram.com.

Vous remarquerez un changement dans l'interface utilisateur et la possibilité de publier un message sur Instagram… .. Votre vie est maintenant facile… .. Faites-moi savoir plus facilement si vous en trouvez. 

 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.

0
Dheeraj Thedijje