Como postar fotos no instagram usando API

109

Estou construindo um aplicativo php que precisa postar a imagem enviada pelo usuário diretamente no Instagram, mas depois de uma rápida pesquisa, descobri que essa função não existe na API :( e parece estranho ... porque eles deveriam fornecer uma. Não tenho certeza se existe alguma outra maneira (exceto os aplicativos para Android e iOS) de fazer upload de imagens usando php. Por favor, me dê qualquer tipo de ideia, se houver alguma possibilidade.

Eu também li isso,

Como faço para compartilhar um link e uma foto com o Instagram usando PHP

Altaf Hussain
fonte
2
Não é possível postar fotos no Instagram via API.
Amal Murali
3
Eu me pergunto como eles - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite - fazem isso ... (o anúncio do blog foi postado 8 horas atrás)
Mars Robertson
1
@MichalStefanow Também achei uma boa pergunta. Esse anúncio do blog também tem um comentário da Hootsuite (na seção de comentários abaixo do artigo) de que não há postagem direta real no Instagram devido aos limites da API e a postagem final precisa ser feita no Instagram.
thecommonthread
E em meados de 2019? Há alguma mudança?
userlond

Respostas:

81

Se você leu o link que compartilhou, a resposta aceita é:

Você não pode postar fotos no Instagram por meio da API.

Parece que você pode emular o instagram no PC.

Bluestacks é um emulador que permite executar aplicativos Android em seu PC / Mac etc.

Não tenho certeza de como funciona bem.

Albzi
fonte
58
Bem, se NÃO há maneira de fazer isso, então eu não acho que haja "outra" maneira.
Albzi
1
@bart no momento da postagem de @Ritu, fazia instagram e posts.sonão erapostso.com
Albzi
2
@usama infelizmente não oficialmente, mas ouvi rumores de que se você acessar o site deles e reduzi-lo para visualização em dispositivos móveis, poderá. Mas não tentei sozinho
Albzi
1
@Albzi Se você usa o Google Chrome; acesse o site do Instagram e clique com o botão direito e use o "Inspecionar" que irá redimensionar e alterar o cabeçalho para uma assinatura do navegador móvel permitindo. Você pode ter que atualizar a página do Instagram uma vez em "Inspecionar", mas isso permitirá que você use o site como um dispositivo móvel e pode postar fotos e quais não. Contudo; isso não ajuda com a questão da API. Eu adoraria poder postar uma foto do PHP no Instagram mostrando o placar final de nossas equipes.
Dawson Irvine
1
Ponto justo. @BrodaNoel, talvez eu deva mudar isso para nenhum modo 'oficial'.
Albzi
102

Atualizar:

O Instagram agora está banindo contas e removendo as imagens com base neste método. Use com cuidado.


Parece que todos os que responderam a essa pergunta com algo como it can't be doneestá certo. Oficialmente, você não pode postar uma foto no Instagram com sua API. No entanto, se você fizer engenharia reversa da API, você pode.

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 copiar e colar o código acima em seu editor de texto, alterar as poucas variáveis ​​de acordo e VOILA! Escrevi um artigo sobre isso e já o fiz muitas vezes. Veja uma demonstração aqui .

Lança
fonte
1
Incapaz de fazer login usando o código acima sem usar o telefone. Acabei de usar no localhost usando PC e recebi uma mensagem de erro como **** Resposta vazia recebida do servidor ao tentar fazer o login *** como resolver esse erro
Rabesh Lal Shrestha
1
Já existe uma variante .net funcional feita desse código? Não consigo trabalhar com PHP e uma versão .NET deste código seria muito útil!
Yosoyke
1
Consegui executar o script com sucesso em uma nova conta do Instagram.
Loretoparisi
2
Se estiver recebendo status isnt okay, certifique-se de que o CURL tenha permissões para criar um arquivo cookies.txt. chmod 777 /directoryvai fazer isso (tenha cuidado). Estou recebendo uma mensagem de sucesso do seu script, mas o post não está aparecendo no instagram. Isso ainda funciona?
kmoney12
8
O código funciona bem, mas o guid e o deviceid mudam toda vez e o instagram BANHOU minha conta após uma única postagem bem-sucedida. a foto também foi removida.
Alp Altunel de
27

ATUALIZAÇÃO Agora é possível:

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

A API de publicação de conteúdo é um subconjunto de endpoints da API do Instagram Graph que permite a publicação de objetos de mídia. Publicar objetos de mídia com esta API é um processo de duas etapas - primeiro você cria um contêiner de objeto de mídia e, em seguida, publica o contêiner em sua conta comercial.

Tom Roggero
fonte
22
É importante notar que "A API de publicação de conteúdo está em beta fechado apenas com Facebook Marketing Partners e Instagram Partners. Não estamos aceitando novos candidatos no momento."
William Reed,
Isso é aplicável apenas para contas empresariais?
Suncatcher
Como isso é uma resposta? Não é possível, esta API é só para parceiros ...
Matej J
1
Diz que a página não foi encontrada!
Mohamed Imran
12

O Instagram agora permite que as empresas agendem suas postagens, usando os novos endpoints do Content Publishing Beta.

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

No entanto, esta postagem do blog - https://business.instagram.com/blog/instagram-api-features-updates - deixa claro que eles estão apenas abrindo essa API para seus parceiros de marketing do Facebook ou parceiros do Instagram.

Para começar a agendar postagens, trabalhe com um de nossos Facebook Marketing Partners ou Instagram Partners.

Este link do Facebook - https://developers.facebook.com/docs/instagram-api/content-publishing - lista-o como um beta fechado.

A API de publicação de conteúdo está em beta fechada apenas com Facebook Marketing Partners e Instagram Partners. Não estamos aceitando novos candidatos no momento.

Mas é assim que você faria:

Você tem uma foto em ...

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

Você deseja publicá-lo com a hashtag "#BronzFonz".

Você pode usar a /user/mediaborda para criar o contêiner assim:

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

Isso retornaria um ID de contêiner (digamos 17889455560051444), que você publicaria usando a borda / user / media_publish, como este:

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

Este exemplo da documentação .

Joshua Dance
fonte
Obrigado, mas onde posso criar o aplicativo para isso, podemos criar um aplicativo para o Facebook na área de desenvolvedor do Facebook.
usama
Este código fornece um erro - "O aplicativo não tem a capacidade de fazer esta chamada de API."? Isso não faz sentido dessas empresas de tecnologia. Como eles podem pedir para vir através de alguns parceiros preferenciais e não fazer nosso próprio aplicativo.
Amit Khare
8

Tentei usar o IFTTT e muitos outros serviços, mas todos estavam fazendo coisas ou postando do Instagram para outra plataforma, não para o Instagram. Eu li mais para descobrir que o Instagram não fornece tal API até agora.

Usar a pilha azul novamente envolve uma instalação pesada e fazer as coisas apenas manualmente.

No entanto, você pode usar o Google Chrome na versão desktop para fazer uma postagem no Instagram. Precisa de um pequeno ajuste.

  1. Abra o seu cromo e navegue no Instagram.com
  2. Vá para inspecionar o elemento clicando com o botão direito no cromo.
  3. No menu suspenso do canto superior direito do corener nas ferramentas de desenvolvedor, selecione mais ferramentas.
  4. Selecione outras condições de rede.
  5. Na seção de seleção de rede, consulte a segunda seção chamada agente do usuário.
  6. Desmarque selecionar automaticamente e selecione cromo para Android na lista de determinado agente do usuário.
  7. Atualize sua página Instagram.com.

Você notará uma mudança na IU e a opção de fazer uma postagem no Instagram. Sua vida agora é fácil. Deixe-me saber uma maneira mais fácil, se você encontrar algum

insira a descrição da imagem aqui

Escrevi em https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html sobre isso.

Captura de tela de trabalho

insira a descrição da imagem aqui

Dheeraj Thedijje
fonte
Mas você não pode postar nada.
Aarvy
1
Acabei de postar usando o mesmo método. Está funcionando perfeitamente bem. Veja a captura de tela na atualização.
Dheeraj Thedijje
5

Para os usuários que encontrarem esta pergunta, você pode passar as fotos para o fluxo de compartilhamento do instagram (do seu aplicativo para a tela de filtros) no iPhone usando os ganchos do iPhone: http://help.instagram.com/355896521173347 Além disso, atualmente não há forma na versão 1 da api.

Amru E.
fonte
1
@Ritu interessante. Deve ser possível então, mas não parece que a API permite. Obrigado por compartilhar, quero dar uma olhada nisso.
Amru E.
1
Eu também queria saber como eles estão fazendo isso, por favor, compartilhe se você conseguir algo relevante.
Ritu
2
Parece que a maioria dos clientes não autorizados está fazendo engenharia reversa da API, descriptografando e monitorando o tráfego SSL do aplicativo para o servidor. Esse é o caso do Snapchat, pelo menos. Pode ser o mesmo aqui.
Amru E.
O aplicativo Flume para Mac também posta no seu feed
Joshua - Pendo
0

Se tiver uma IU, tem uma "API". Vamos usar o seguinte exemplo: Quero publicar a foto que uso em qualquer nova postagem do blog que eu criar. Vamos supor que seja o Wordpress.

  1. Crie um serviço que monitore constantemente o seu blog via RSS.
  2. Quando uma nova postagem do blog for postada, baixe a imagem.
  3. (Opcional) Use uma API de terceiros para aplicar algumas sobreposições e outros enfeites em sua foto.
  4. Coloque a foto em um local conhecido no seu PC ou servidor.
  5. Configure o Chrome (leia acima) para que você possa usar o navegador como um celular.
  6. Usando o Selenium (ou qualquer outra dessas bibliotecas), simule todo o processo de postagem no Instagram.
  7. Feito. Você deveria ter.
Pepito Fernandez
fonte
0

Para quem está procurando por uma solução sobre como postar no Instagram usando AWS lambda e titereiro ( chrome-aws-lambda ). Observou que esta solução permite que você poste 1 foto para cada postagem apenas . Se você não estiver usando lambda, apenas substitua chrome-aws-lambdapor puppeteer.

Para o primeiro lançamento do lambda, é normal que não funcione porque o instagram detecta “Tentativa de login suspeita” . Basta ir para a página do instagram usando seu PC e aprová-la , tudo deve ficar bem.

Este é meu código, fique à vontade para otimizá-lo:

// 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 ser o caminho do arquivo local, se for url, faça o download para a pasta / tmp primeiro .

Allen Wong
fonte