Cómo publicar imágenes en instagram usando API

109

Estoy creando una aplicación php que necesita publicar la imagen cargada por el usuario directamente en Instagram, pero después de una búsqueda rápida descubrí que no existe tal función en la API :( y se siente raro ... porque deberían proporcionar una. No estoy seguro de si hay alguna otra forma (excepto las aplicaciones para Android e iOS) para cargar imágenes usando php. Por favor, dame algún tipo de idea si hay alguna posibilidad.

También leí esto,

¿Cómo comparto un enlace y una foto con Instagram usando PHP?

Altaf Hussain
fuente
2
No es posible publicar imágenes en Instagram a través de la API.
Amal Murali
3
Me pregunto cómo lo hacen - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite - (el anuncio del blog se publicó hace 8 horas)
Mars Robertson
1
@MichalStefanow También pensé que era una buena pregunta. Ese anuncio de blog también tiene un comentario de Hootsuite (en la sección de comentarios debajo del artículo) de que no hay una publicación directa real en Instagram debido a los límites de API y la publicación final debe realizarse en Instagram.
thecommonthread
¿Y a mediados de 2019? ¿Hay cambios?
userlond

Respuestas:

81

Si lees el enlace que compartiste, la respuesta aceptada es:

No puede publicar imágenes en Instagram a través de la API.

Sin embargo, parece que puedes emular Instagram en PC.

Bluestacks es un emulador que le permite ejecutar aplicaciones de Android en su PC / Mac, etc.

Sin embargo, no estoy seguro de qué tan bien funciona.

Albzi
fuente
58
Bueno, si NO hay forma de hacerlo, entonces supongo que no hay "otra" forma.
Albzi
1
@bart en el momento de la publicación de @Ritu, sí hizo Instagram y posts.sono lo fuepostso.com
Albzi
2
@usama desafortunadamente no oficialmente, pero he escuchado rumores de que si vas a su sitio web y lo reduces a la vista móvil, puedes hacerlo. Aunque no lo probé yo mismo
Albzi
1
@Albzi Si usa Google Chrome; Llegué al sitio web de Instagram y haga clic derecho y use el botón "Inspeccionar"; cambiará el tamaño y cambiará el encabezado a una firma del navegador móvil que lo permita. Es posible que tenga que actualizar la página de Instagram una vez en "Inspeccionar", pero le permitirá utilizar el sitio web como un dispositivo móvil y puede publicar fotos y otras cosas. Sin embargo; esto no ayuda con la pregunta de la API. Me encantaría poder publicar una foto desde PHP en Instagram mostrando la puntuación final de nuestros equipos.
Dawson Irvine
1
Punto justo. @BrodaNoel, tal vez debería cambiar eso a ninguna forma 'oficial'.
Albzi
102

Actualizar:

Instagram ahora está prohibiendo las cuentas y eliminando las imágenes según este método. Úselo con precaución.


Parece que todos los que han respondido a esta pregunta con algo parecido a it can't be donetienen algo de razón. Oficialmente, no puedes publicar una foto en Instagram con su API. Sin embargo, si aplica ingeniería inversa a la API, puede hacerlo.

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

Simplemente copie y pegue el código anterior en su editor de texto, cambie las pocas variables en consecuencia y ¡VOILA! Escribí un artículo sobre esto y lo he hecho muchas veces. Vea una demostración aquí .

lanza
fuente
1
No se puede iniciar sesión con el código anterior sin usar el teléfono. Acabo de usar en localhost usando PC y recibí un mensaje de error como **** Respuesta vacía recibida del servidor al intentar iniciar sesión *** cómo resolver ese error
Rabesh Lal Shrestha
1
¿Existe ya una variante .net que funcione a partir de este código? ¡No puedo trabajar con PHP y una versión .NET de este código sería realmente útil!
Yosoyke
1
Pude ejecutar el script con éxito en una nueva cuenta de Instagram.
loretoparisi
2
Si está recibiendo status isnt okay, asegúrese de que CURL tenga permisos para crear un archivo cookies.txt. chmod 777 /directoryhará esto (tenga cuidado). Recibo un mensaje de éxito de su guión, pero la publicación no se muestra en Instagram. ¿Esto todavía funciona?
kmoney12
8
El código funciona bien, pero la guía y la identificación del dispositivo cambian cada vez e Instagram PROHIBE mi cuenta después de una sola publicación exitosa. la foto también se ha eliminado.
Alp Altunel
27

ACTUALIZAR Ahora es posible:

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

La API de publicación de contenido es un subconjunto de los puntos finales de la API Graph de Instagram que le permiten publicar objetos multimedia. La publicación de objetos multimedia con esta API es un proceso de dos pasos: primero crea un contenedor de objetos multimedia y luego publica el contenedor en su cuenta comercial.

Tom Roggero
fuente
22
Vale la pena señalar que "La API de publicación de contenido está en beta cerrada solo con los socios de marketing de Facebook y los socios de Instagram. No aceptamos nuevos solicitantes en este momento".
William Reed
¿Es esto aplicable solo para cuentas comerciales?
Suncatcher
¿Cómo es esta una respuesta? No es posible, esta API es solo para socios ...
Matej J
1
¡Dice página no encontrada!
Mohamed Imran
12

Instagram ahora permite a las empresas programar sus publicaciones, utilizando los nuevos puntos finales de Publicación de contenido Beta.

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

Sin embargo, esta publicación de blog, https://business.instagram.com/blog/instagram-api-features-updates , deja en claro que solo están abriendo esa API a sus socios de marketing de Facebook o socios de Instagram.

Para comenzar a programar publicaciones, trabaje con uno de nuestros socios de marketing de Facebook o socios de Instagram.

Este enlace de Facebook, https://developers.facebook.com/docs/instagram-api/content-publishing , lo enumera como una versión beta cerrada.

La API de publicación de contenido está en beta cerrada solo con socios de marketing de Facebook e Instagram. No aceptamos nuevos solicitantes en este momento.

Pero así es como lo harías:

Tienes una foto en ...

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

Quieres publicarlo con el hashtag "#BronzFonz".

Podría usar el /user/mediaborde para crear el contenedor de esta manera:

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

Esto devolvería un ID de contenedor (digamos 17889455560051444), que luego publicaría usando el borde / user / media_publish, así:

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

Este ejemplo de los docs .

Joshua Dance
fuente
Gracias, pero donde puedo crear la aplicación para esto, podemos crear una aplicación para Facebook en el área de desarrolladores de Facebook.
usama
Este código da un error: "La aplicación no tiene la capacidad para realizar esta llamada a la API". Esto no tiene sentido por parte de estas empresas de tecnología. ¿Cómo pueden pedirnos que vengan a través de algunos socios preferidos y no crear nuestra propia aplicación?
Amit Khare
8

Intenté usar IFTTT y muchos otros servicios, pero todos estaban haciendo cosas o publicaban desde Instagram en otra plataforma, no en Instagram. Leí más para encontrar que Instagram no proporciona ninguna API de este tipo a partir de ahora.

El uso de blue stack nuevamente implica una instalación pesada y hacer las cosas solo manualmente.

Sin embargo, puede usar su Google Chrome en la versión de escritorio para hacer una publicación en Instagram. Necesita un pequeño retoque.

  1. Abre tu Chrome y navega por Instagram.com
  2. Vaya a inspeccionar el elemento haciendo clic derecho en Chrome.
  3. En el menú desplegable de la parte superior derecha de las herramientas para desarrolladores, seleccione más herramientas.
  4. Seleccione más las condiciones de la red.
  5. En la sección de selección de red, consulte la segunda sección que se denomina agente de usuario.
  6. Desmarque Seleccionar automáticamente y seleccione Chrome para Android de la lista de agentes de usuario determinados.
  7. Actualiza tu página de Instagram.com.

Notarás un cambio en la interfaz de usuario y la opción de hacer una publicación en Instagram. Tu vida ahora es fácil. Avíseme una forma más fácil si puede encontrar alguna.

ingrese la descripción de la imagen aquí

Escribí en https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html al respecto.

Captura de pantalla de trabajo

ingrese la descripción de la imagen aquí

Dheeraj Thedijje
fuente
Pero no puedes publicar nada.
Aarvy
1
Acabo de publicar usando el mismo método. Está funcionando absolutamente bien. Ver captura de pantalla en la actualización.
Dheeraj Thedijje
5

Para los usuarios que encuentren esta pregunta, pueden pasar fotos al flujo de intercambio de Instagram (desde su aplicación a la pantalla de filtros) en iPhone usando ganchos de iPhone: http://help.instagram.com/355896521173347 Aparte de eso, actualmente no hay camino en la versión 1 de la api.

Amru E.
fuente
1
@Ritu interesante. Entonces debe ser posible, pero no parece que la API lo permita. Gracias por compartir, quiero investigarlo.
Amru E.
1
También me preguntaba cómo lo están haciendo, comparta si obtendrá algo relevante.
Ritu
2
Parece que la mayoría de los clientes no autorizados están aplicando ingeniería inversa a la API al descifrar y monitorear el tráfico SSL desde la aplicación al servidor. Este es el caso de Snapchat, al menos. Podría ser lo mismo aquí.
Amru E.
La aplicación Flume para Mac también publica en su feed
Joshua - Pendo
0

Si tiene una interfaz de usuario, tiene una "API". Usemos el siguiente ejemplo: Quiero publicar la imagen que uso en cualquier nueva publicación de blog que cree. Supongamos que es Wordpress.

  1. Cree un servicio que supervise constantemente su blog a través de RSS.
  2. Cuando se publique una nueva publicación en el blog, descargue la imagen.
  3. (Opcional) Utilice una API de terceros para aplicar algunas superposiciones y otras cosas a su imagen.
  4. Coloque la foto en un lugar conocido de su PC o servidor.
  5. Configure Chrome (lea más arriba) para que pueda usar el navegador como un dispositivo móvil.
  6. Usando Selenium (o cualquier otra de esas bibliotecas), simule todo el proceso de publicación en Instagram.
  7. Hecho. Deberías tenerlo.
Pepito Fernandez
fuente
0

Para cualquiera que esté buscando una solución para publicar en Instagram usando AWS lambda y puppeteer ( chrome-aws-lambda ). Observó que esta solución le permite publicar 1 foto solo para cada publicación . Si no está usando lambda, simplemente reemplácelo chrome-aws-lambdaconpuppeteer .

Para el primer lanzamiento de lambda, es normal que no funcione porque Instagram detecta “Intento de inicio de sesión sospechoso” . Simplemente vaya a la página de Instagram usando su PC y apruebe , todo debería estar bien.

Aquí está mi código, no dude en optimizarlo:

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

debe ser la ruta del archivo local, si es una URL, descárguelo primero en la carpeta / tmp .

Allen Wong
fuente