Instagram subir video desde la PC

8

Estoy tratando de automatizar el proceso de carga de videos / imágenes en instagram (sin usar una API privada). Por ahora automaticé la carga de imágenes y estoy tratando de hacer lo mismo para los videos. Estoy haciendo esto con electrony Nodejs.

para hacer clic en el botón de carga y seleccionar una imagen ejecuto este código que realmente funciona bien.

const fs = require('fs'),
      {remote} = require('electron'),
      clipboardy    = require('clipboardy'),
      BrowserWindow = remote.BrowserWindow;

const LOAD_IMAGE = '.UP43G',
      NEW_POST = '.glyphsSpriteNew_post__outline__24__grey_9.u-__7';

function get_files(path){
    return fs.readdirSync(path, { withFileTypes: true })
    .filter(dirent => dirent.isFile())
    .map(dirent => __dirname + '/../../' + path + '/' + dirent.name);
}

function randomRange(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

function createWindow (session_id, hidden) {
    win = new BrowserWindow({
        width: 500,
        height: 500
    });
    win.loadURL('https://www.instagram.com');
    return win;
}

////select the files to upload////

var files = UPLOAD_POST_FOLDER_CUSTOM
var file_to_upload = files[randomRange(0, files.length - 1)];

///////////////////////////////////////

function async upload_image(){
    // click the upload button on the page
    await electron_window.webContents.executeJavaScript(`
        async function click_upload_button(){
            let new_post_button = document.querySelector('${NEW_POST}');
            await sleep(1000);
            new_post_button.click()
        }
        click_upload_button();
    `);
    // write the path of the file and press enter in the file selector
    await sleep(500);
    let previous_clipboard = clipboardy.readSync();
    clipboardy.writeSync(file_to_upload);
    await fake_input.keyTap('l', 'control');
    await fake_input.keyTap('v', 'control');
    await fake_input.keyTap('enter');
    clipboardy.writeSync(previous_clipboard);       
    await sleep(2000);

}

Este código funciona bien para imágenes .jpg. El problema al que me enfrento es que durante la carga, cuando abre el selector de archivos para elegir algo para publicar , no reconoce los videos . Intenté todas las extensiones de video posibles.

También traté de escribir la ruta del archivo en el selector de archivos, en su lugar, selecciónelo manualmente y vi que si escribe un archivo .jpg/ .mp4no, muestra una advertencia, solo se permiten imágenes , en cambio, si escribe la ruta en un .jpgarchivo, carga la imagen y si le escribe un archivo .mp4, cierra el administrador de archivos y no hace nada, de esta manera ignora que está intentando cargar algo.

Reproducir

  • ir a instagram
  • hacer el inicio de sesión
  • haga clic F12para abrir las herramientas de desarrollo
  • haga clic CTRL + SHIFT + Mpara alternar la emulación del dispositivo
  • seleccione cualquier dispositivo o cambie el tamaño de la página para alternar la vista móvil del sitio
  • recargar el sitio
  • intenta subir algo haciendo clic en el +botón inferior .

(El video es de 6mb (<15mb que es el máximo) y 40 segundos (<60s que es el máximo)

Mat.C
fuente

Respuestas:

0

Creo que el cliente privado de API de Instagram hará un mejor trabajo que tu enfoque

lazyd3v
fuente
Quiero trabajar con el navegador directamente y no hacerlo con módulos de solicitud o algo así también porque cada vez que inicia sesión desde la API privada, envía un correo que dice que se ha realizado un nuevo acceso, etc. y eso es un poco aburrido
Mat.C
Puede almacenar datos de la sesión, reutilizarlos y no recibir correos electrónicos que se realizó el inicio de sesión. Aquí está el ejemplo github.com/dilame/instagram-private-api/blob/master/examples/…
lazyd3v
Además, su enfoque actual se basa en selectores css que contienen hashes y estoy 100% seguro de que cambian de vez en cuando y se aburrirá mucho más actualizando estos selectores
lazyd3v
¿también puede interactuar con las dos autenticaciones de fábrica?
Mat
1

Si desea publicar un video a través de la API, debe realizar los siguientes dos pasos:

  • crear un contenedor de objetos de medios utilizando el POST /{ig-user-id}/mediapunto final
  • publicar el contenedor con POST /{ig-user-id}/media_publish

Solicitud de ejemplo:

POST graph.facebook.com/89751400008469714/media
  ?media_type=VIDEO
  &video_url=https//www.example.com/videos/my-video.mov
  &caption=#myfirstvideo!

Intenta usar un archivo .mov . Si esto no soluciona el problema, puede verificar si su video tiene las siguientes características:

  • Velocidad de bits de video de 3.500 kbps
  • Códec H.264 / formato MP4
  • Duración de 3 a 60 segundos
  • Ancho máximo 1080 píxeles (1080P)
  • 29.96 cuadros por segundo
  • Códec de audio AAC a 44.1 kHz mono
muellerra
fuente
La solicitud de ejemplo devolverá la ID (por ejemplo, 012345) del contenedor. Luego tendrá que publicar esta ID con el siguiente ejemplo de código: POST graph.facebook.com/89751400008469714/media_publish? Creation_id = 012345
muellerra