Instagram enviar vídeo do pc

8

Estou tentando automatizar o processo de upload de vídeos / imagens no instagram (sem usar uma API privada). Por enquanto, automatizei o upload da imagem e estou tentando fazer o mesmo pelos vídeos. Eu estou fazendo isso com electrone Nodejs.

para clicar no botão de upload e selecionar uma imagem, eu executo esse código que realmente funciona bem.

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

}

Esse código funciona bem para imagens .jpg. O problema que estou enfrentando é que, durante o upload, quando ele abre o seletor de arquivos para escolher algo para publicar, ele não reconhece os vídeos . Eu tentei todas as extensões de vídeo possíveis.

Também tentei escrever o caminho do arquivo no seletor de arquivos, selecione-o manualmente e vi que, se você escrever um arquivo não .jpg/, .mp4ele mostra um aviso, apenas imagens são permitidas ; em vez disso, se você escrever o caminho para um .jpgarquivo, ele carrega a imagem e se você escrever um arquivo para .mp4ele, feche o gerenciador de arquivos e não faça nada, ignorando que você está tentando fazer o upload de algo.

Reproduzir

  • vá para o instagram
  • faça o login
  • clique F12para abrir as ferramentas de desenvolvimento
  • clique CTRL + SHIFT + Mpara alternar a emulação de dispositivo
  • selecione qualquer dispositivo ou redimensione a página para alternar a visualização móvel do site
  • recarregar o site
  • tente fazer o upload de algo clicando no +botão inferior .

(O vídeo tem 6mb (<15mb é o máximo) e 40segundos (<60s é o máximo)

Mat.C
fonte

Respostas:

0

Eu acho que o cliente da API privada do Instagram fará um trabalho melhor do que a sua abordagem

lazyd3v
fonte
Eu quero trabalhar com o navegador diretamente e não fazer com módulos de solicitação ou algo assim também, porque cada vez que você faz login na API privada, ele envia um e-mail dizendo que um novo acesso foi feito, etc. e isso é um pouco chato
Mat.C
Você pode armazenar dados da sessão, reutilizá-los e não receber e-mails de que o login foi realizado. Aqui está o exemplo github.com/dilame/instagram-private-api/blob/master/examples/…
lazyd3v
Além disso, sua estratégia atual se baseia em seletores css contendo hashes e eu estou 100% certo eles mudam ao longo do tempo e você será muito mais aborrecido atualização desses seletores
lazyd3v
ele também pode interagir com as duas autenticação de fábrica?
Mat.C
1

Se você deseja publicar um vídeo por meio da API, execute as duas etapas a seguir:

  • criar um contêiner de objeto de mídia usando o POST /{ig-user-id}/mediaterminal
  • publique o contêiner com POST /{ig-user-id}/media_publish

Solicitação de exemplo:

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

Tente usar um arquivo .mov . Se isso não resolver o problema, você pode verificar se o seu vídeo tem as seguintes características:

  • Taxa de bits do vídeo de 3.500 kbps
  • Codec H.264 / formato MP4
  • Duração de 3 a 60 segundos
  • largura máxima de 1080 pixels (1080P)
  • 29,96 quadros por segundo
  • Codec de áudio AAC em 44,1 kHz mono
muellerra
fonte
A solicitação de exemplo retornará o ID (por exemplo, 012345) do contêiner. Em seguida, você precisará publicar esse ID com o seguinte exemplo de código: POST graph.facebook.com/89751400008469714/media_publish? Creation_id = 012345
muellerra