Come pubblicare immagini su Instagram utilizzando l'API


109

Sto costruendo un'applicazione php che deve pubblicare l'immagine caricata dall'utente direttamente su Instagram, ma dopo una rapida ricerca ho scoperto che non esiste una tale funzione nell'API :( e sembra strano ... perché dovrebbero fornirne una. Non sono sicuro che ci sia un altro modo (eccetto le app per Android e iOS) per caricare le immagini usando php. Per favore, dammi qualche idea se c'è qualche possibilità.

Ho letto anche questo,

Come faccio a condividere un collegamento e una foto con Instagram utilizzando PHP


2
Non è possibile pubblicare immagini su Instagram tramite l'API.
Amal Murali

3
Mi chiedo come abbiano fatto - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite - (l'annuncio del blog è stato pubblicato 8 ore fa)
Mars Robertson il

1
@MichalStefanow Anche io ho pensato che fosse una buona domanda. Quell'annuncio del blog ha anche un commento da Hootsuite (nella sezione commenti sotto l'articolo) che non esiste una pubblicazione diretta effettiva su Instagram a causa dei limiti dell'API e la pubblicazione finale deve essere eseguita su Instagram.
thread comune

E la metà del 2019? Ci sono cambiamenti?
userlond

Risposte:


81

Se leggi il link che hai condiviso, la risposta accettata è:

Non puoi pubblicare immagini su Instagram tramite l'API.

Sembra che tu possa emulare Instagram su PC però.

Bluestacks è un emulatore che ti consente di eseguire app Android sul tuo PC / Mac, ecc.

Non sono sicuro di quanto bene funzioni però.


58
Ebbene, se NON c'è modo di farlo, allora non suppongo che ci sia un modo "altro".
Albzi

1
@bart al momento della pubblicazione di @Ritu, faceva instagram e posts.sonon erapostso.com
Albzi

2
@usama sfortunatamente non ufficialmente, ma ho sentito voci secondo cui se vai sul loro sito web e ridimensionalo alla visualizzazione mobile puoi farlo. Non l'ho provato io stesso però
Albzi

1
@Albzi Se utilizzi Google Chrome; raggiunto il sito Web di Instagram e fare clic con il pulsante destro del mouse e utilizzare "Inspect", ridimensionerà e cambierà l'intestazione in una firma del browser mobile che lo consente. Potrebbe essere necessario aggiornare la pagina Instagram una volta in "Ispeziona", ma ti consentirà di utilizzare il sito Web come un cellulare e di pubblicare foto e cosa no. Però; questo non aiuta con la domanda API. Mi piacerebbe poter pubblicare una foto da PHP su Instagram che mostra il punteggio finale dei nostri team.
Dawson Irvine,

1
Punto valido. @BrodaNoel, forse dovrei cambiarlo in modo non "ufficiale".
Albzi

102

Aggiornare:

Instagram ora sta vietando gli account e rimuovendo le immagini in base a questo metodo. Si prega di utilizzare con cautela.


Sembra che tutti coloro che hanno risposto a questa domanda con qualcosa sulla falsariga di it can't be donesiano in qualche modo corretti. Ufficialmente, non puoi pubblicare una foto su Instagram con la loro API. Tuttavia, se decodifichi l'API, puoi farlo.

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

Basta copiare e incollare il codice sopra nel tuo editor di testo, modificare le poche variabili di conseguenza e VOILA! Ho scritto un articolo su questo e l'ho fatto molte volte. Guarda una demo qui .


1
Impossibile accedere utilizzando il codice sopra senza utilizzare il telefono. Ho appena usato localhost utilizzando PC e ho appena ricevuto un messaggio di errore come **** Risposta vuota ricevuta dal server durante il tentativo di accesso *** come risolvere l'errore
Rabesh Lal Shrestha

1
Esiste già una variante .net funzionante composta da questo codice? Non posso lavorare con PHP e una versione .NET di questo codice sarebbe davvero utile!
Yosoyke

1
Sono stato in grado di eseguire lo script con successo su un nuovo account Instagram.
loretoparisi

2
Se stai ricevendo status isnt okay, assicurati che CURL abbia i permessi per creare un file cookies.txt. chmod 777 /directorylo farà (stai attento). Ricevo un messaggio di successo dal tuo script, ma il post non viene visualizzato su Instagram. Funziona ancora?
kmoney12

8
Il codice funziona bene ma il guid e il deviceid cambiano ogni volta e Instagram ha BANNATO il mio account dopo un singolo post riuscito. anche la foto è stata rimossa.
Alp Altunel

27

AGGIORNAMENTO Ora è possibile:

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

L'API di pubblicazione dei contenuti è un sottoinsieme di endpoint dell'API del grafico di Instagram che ti consentono di pubblicare oggetti multimediali. La pubblicazione di oggetti multimediali con questa API è un processo in due fasi: si crea prima un contenitore di oggetti multimediali, quindi si pubblica il contenitore sul proprio account aziendale.


22
Vale la pena notare che "L'API Content Publishing è in beta chiusa solo con i partner di marketing di Facebook e i partner di Instagram. Non accettiamo nuovi candidati in questo momento."
William Reed

È applicabile solo per gli account aziendali?
Suncatcher

Come è questa una risposta? Non è possibile, questa API è solo per i partner ...
Matej J

1
Dice pagina non trovata!
Mohamed Imran

12

Instagram ora consente alle aziende di pianificare i propri post, utilizzando i nuovi endpoint di Content Publishing Beta.

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

Tuttavia, questo post sul blog - https://business.instagram.com/blog/instagram-api-features-updates - chiarisce che stanno aprendo quell'API solo ai loro partner di marketing di Facebook o partner di Instagram.

Per iniziare con la pianificazione dei post, collabora con uno dei nostri partner di marketing di Facebook o partner di Instagram.

Questo collegamento da Facebook - https://developers.facebook.com/docs/instagram-api/content-publishing - lo elenca come una beta chiusa.

L'API di pubblicazione dei contenuti è in beta chiusa solo con i partner di marketing di Facebook e i partner di Instagram. Non stiamo accettando nuovi candidati in questo momento.

Ma è così che lo faresti:

Hai una foto a ...

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

Vuoi pubblicarlo con l'hashtag "#BronzFonz".

Puoi usare il /user/mediabordo per creare il contenitore in questo modo:

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

Ciò restituirebbe un ID contenitore (diciamo 17889455560051444), che pubblicheresti quindi utilizzando il bordo / user / media_publish, in questo modo:

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

Questo esempio tratto dalla documentazione .


Grazie ma dove posso creare l'app per questo come possiamo creare app per Facebook nell'area sviluppatori di Facebook.
usama

Questo codice restituisce un errore: "L'applicazione non è in grado di effettuare questa chiamata API."? Questa è una totale assurdità da parte di queste società tecnologiche. Come possono chiedere a use di venire tramite alcuni partner preferiti e non creare la nostra app.
Amit Khare

8

Ho provato a utilizzare IFTTT e molti altri servizi ma tutti stavano facendo cose o postando da Instagram su un'altra piattaforma non su Instagram. Ho letto di più per scoprire che Instagram non fornisce alcuna API di questo tipo al momento.

L'utilizzo dello stack blu implica di nuovo un'installazione pesante e l'esecuzione di operazioni solo manuali.

Tuttavia, puoi utilizzare il tuo Google Chrome sulla versione desktop per creare un post su Instagram. Ha bisogno di un po 'di aggiustamento.

  1. Apri il tuo Chrome e naviga su Instagram.com
  2. Vai a ispezionare l'elemento facendo clic con il pulsante destro del mouse su Chrome.
  3. Dal menu a discesa in alto a destra degli strumenti per sviluppatori, seleziona più strumenti.
  4. Selezionare ulteriormente le condizioni di rete.
  5. Nella sezione di selezione della rete, vedere la seconda sezione denominata agente utente.
  6. Deseleziona Seleziona automaticamente e seleziona Chrome per Android dall'elenco dell'agente utente specificato.
  7. Aggiorna la tua pagina Instagram.com.

Noterai un cambiamento nell'interfaccia utente e l'opzione per creare un post su Instagram. La tua vita ora è facile. Fammi sapere un modo più semplice se riesci a trovarne uno.

inserisci qui la descrizione dell'immagine

Ho scritto su https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html .

Screenshot di lavoro

inserisci qui la descrizione dell'immagine


Ma non puoi pubblicare nulla.
Aarvy

1
Ho appena pubblicato utilizzando lo stesso metodo. Funziona assolutamente bene. Vedi screenshot in aggiornamento.
Dheeraj Thedijje,

5

Per gli utenti che trovano questa domanda, puoi passare le foto al flusso di condivisione di Instagram (dalla tua app alla schermata dei filtri) su iPhone utilizzando gli hook di iPhone: http://help.instagram.com/355896521173347 Oltre a questo, attualmente non esiste modo nella versione 1 dell'api.


1
@ Ritu interessante. Deve essere possibile allora, ma non sembra che l'API lo consenta. Grazie per la condivisione, voglio approfondire.
Amru E.

1
Mi chiedevo anche come lo stiano facendo, per favore condividi se otterrai qualcosa di rilevante.
Ritu

2
Sembra che la maggior parte dei client non autorizzati stia effettuando il reverse engineering dell'API decrittografando e monitorando il traffico SSL dall'app al server. Questo è almeno il caso di Snapchat. Potrebbe essere lo stesso qui.
Amru E.

Anche l'app Flume per Mac pubblica sul tuo feed
Joshua - Pendo


0

Se ha un'interfaccia utente, ha una "API". Usiamo il seguente esempio: Voglio pubblicare l'immagine che uso in qualsiasi nuovo post sul blog che creo. Supponiamo che sia Wordpress.

  1. Crea un servizio che monitori costantemente il tuo blog tramite RSS.
  2. Quando viene pubblicato un nuovo post sul blog, scarica l'immagine.
  3. (Facoltativo) Utilizza un'API di terze parti per applicare alcune sovrapposizioni e quant'altro alla tua immagine.
  4. Posiziona la foto in una posizione nota sul tuo PC o server.
  5. Configura Chrome (leggi sopra) in modo da poter utilizzare il browser come un cellulare.
  6. Utilizzando Selenium (o qualsiasi altra di quelle librerie), simula l'intero processo di pubblicazione su Instagram.
  7. Fatto. Dovresti averlo.

0

Per chi è alla ricerca di una soluzione sulla pubblicazione di Instagram utilizzando AWS lambda e burattinaio ( cromo-AWS-lambda ). Notato che questa soluzione ti consente di pubblicare solo 1 foto per ogni post . Se non stai usando lambda, sostituisci semplicemente chrome-aws-lambdacon puppeteer.

Per il primo lancio di lambda, è normale che non funzioni perché instagram rileva "Tentativo di accesso sospetto" . Vai alla pagina Instagram usando il tuo PC e approvala , tutto dovrebbe andare bene.

Ecco il mio codice, sentiti libero di ottimizzarlo:

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

deve essere il percorso del file locale, se è url, scaricalo prima nella cartella / tmp .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.