Instagram Video vom PC hochladen

8

Ich versuche, den Prozess des Hochladens von Videos / Bildern auf Instagram zu automatisieren (ohne eine private API zu verwenden). Im Moment habe ich das Hochladen von Bildern automatisiert und ich versuche das Gleiche für die Videos zu tun. Ich mache das mit electronund Nodejs.

Um auf die Schaltfläche zum Hochladen zu klicken und ein Bild auszuwählen, führe ich diesen Code aus, der tatsächlich gut funktioniert.

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

}

Dieser Code funktioniert gut für Bilder .jpg. Das Problem, mit dem ich konfrontiert bin, ist, dass beim Hochladen beim Öffnen der Dateiauswahl für die Auswahl eines Beitrags die Videos nicht erkannt werden . Ich habe alle möglichen Videoerweiterungen ausprobiert.

Ich habe auch versucht, den Dateipfad in die Dateiauswahl zu schreiben, stattdessen ihn manuell auszuwählen, und ich habe gesehen, dass beim Schreiben einer Nicht- .jpg/ .mp4Datei eine Warnung angezeigt wird, dass nur Bilder zulässig sind. Wenn Sie den Pfad zu einer .jpgDatei schreiben, wird das Bild hochgeladen und wenn Sie eine Datei darauf schreiben, .mp4wird der Dateimanager geschlossen und nichts unternommen. Dadurch wird ignoriert, dass Sie versuchen, etwas hochzuladen.

Fortpflanzen

  • Gehe zu Instagram
  • Mach den Login
  • Klicken Sie hier, F12um die Entwickler-Tools zu öffnen
  • Klicken Sie hier, CTRL + SHIFT + Mum die Geräteemulation umzuschalten
  • Wählen Sie ein Gerät aus oder ändern Sie die Größe der Seite, um die mobile Ansicht der Site umzuschalten
  • Laden Sie die Site neu
  • Versuchen Sie, etwas hochzuladen, indem Sie auf die untere +Schaltfläche klicken .

(Das Video ist 6 MB (maximal <15 MB) und 40 Sekunden (maximal <60 Sekunden)

Mat.C.
quelle

Antworten:

0

Ich denke, Instagram Private API Client wird bessere Arbeit leisten als Ihr Ansatz

lazyd3v
quelle
Ich möchte direkt mit dem Browser arbeiten und nicht mit Anforderungsmodulen oder Ähnlichem arbeiten, auch weil jedes Mal, wenn Sie sich von der privaten API aus anmelden, eine E-Mail gesendet wird, die besagt, dass ein neuer Zugriff erfolgt ist, und das ist ein bisschen langweilig
Mat.C
Sie können Sitzungsdaten speichern, wiederverwenden und keine E-Mails erhalten, bei denen die Anmeldung durchgeführt wurde. Hier ist das Beispiel github.com/dilame/instagram-private-api/blob/master/examples/…
lazyd3v
Außerdem basiert Ihr aktueller Ansatz auf CSS-Selektoren, die Hashes enthalten, und ich bin zu 100% sicher, dass sie sich von Zeit zu Zeit ändern, und Sie werden sich viel mehr langweilen, wenn Sie diese Selektoren aktualisieren
lazyd3v
Kann es auch mit den beiden Werksauthentifizierungen interagieren?
Mat.C
1

Wenn Sie ein Video über die API veröffentlichen möchten, müssen Sie die folgenden zwei Schritte ausführen:

  • Erstellen Sie mithilfe des POST /{ig-user-id}/mediaEndpunkts einen Medienobjektcontainer
  • Veröffentlichen Sie den Container mit POST /{ig-user-id}/media_publish

Beispielanforderung:

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

Versuchen Sie es mit einer .mov- Datei. Wenn das Problem dadurch nicht behoben wird, können Sie überprüfen, ob Ihr Video die folgenden Eigenschaften aufweist:

  • Video-Bitrate von 3.500 kbps
  • H.264 Codec / MP4 Format
  • Dauer 3 bis 60 Sekunden
  • maximale Breite 1080 Pixel (1080P)
  • 29,96 Bilder pro Sekunde
  • AAC-Audio-Codec bei 44,1 kHz Mono
muellerra
quelle
Die Beispielanforderung gibt die ID (z. B. 012345) des Containers zurück. Dann müssen Sie diese ID mit dem folgenden Codebeispiel veröffentlichen: POST graph.facebook.com/89751400008469714/media_publish? Creation_id = 012345
muellerra