2016-06-03 21 views
1

Ich versuche, einen Wrapper für die Netflix-Webseite in Qt mit QWebEngine zu schreiben, so dass ich meine Fernbedienung verwenden kann, um zu navigieren. Für diejenigen, die nicht wussten, kann die Netflix-Website nicht einmal mit den Pfeiltasten navigiert werden ...Anmelden bei der Netflix-Website mit JavaScript

Also, jedenfalls habe ich QWebChannel verwendet, um etwas JavaScript-Code in die Webseite zu injizieren, und (visuell

document.getElementsByName("email")[0].value = "%1"; 
document.getElementsByName("password")[0].value = "%2"; 
document.getElementsByClassName("btn login-button btn-submit btn-small")[0].click(); 

das funktioniert (ich kann die Felder gefüllt sehe mit dem, was ich biete für %1 und %2, und die Taste gedrückt wird programmatisch), mit Ausnahme von einem wichtigen Thema: die relevanten Elemente ändern, zumindest) die Ergebnisse in den Nachrichten unter den Eingabeformularen, die mir sagen "Bitte geben Sie eine gültige E-Mail." und "Ihr Passwort muss zwischen 4 und 60 Zeichen enthalten.". Diese sagen mir, dass das Einstellen der Werte der HTML-Elemente nicht die gleiche Wirkung hat wie das manuelle Eintippen der Werte. Könnte mir jemand helfen, herauszufinden, warum das nicht funktioniert und wie ich es zum Laufen bringen kann? Ich möchte mich auf einfaches JavaScript beschränken, es scheint eine einfach genug Aufgabe zu sein, ohne z.B. jQuery oder eine andere Javascript-Bibliothek.

Ich verstehe, dass dies eine schreckliche Möglichkeit ist, die ganze Netflix-on-a-HTPC-Sache zu nähern, aber ich möchte nicht durch z. Flix2Kodis Python, um herauszufinden, was sie tun (das scheint mir viel anfälliger für schlechte Brüche als das Endergebnis, das ich anstrebe).

+0

Warum DOM-Manipulation nachahmen, wenn Sie nur die HTTP-Anmeldeanforderung nachahmen können? Oder ist die Browser-Automatisierung Teil der Anforderung? – lux

+0

@lux Das Anmelden bei Netflix ist nicht so trivial wie das Senden des Benutzernamens und des Kennworts in einer HTTP-Anmeldeanforderung (siehe zB [hier] (http://stackoverflow.com/questions/32337821/) oder die HTTP POST- und GET-Anfragen indem ich mich selbst anmelde. Abgesehen davon möchte ich die Webseite wirklich komplett umhüllen, ich werde nicht alle Elemente von der Webseite extrahieren und sie in meine eigene UI einfügen. Es wird nicht einfach sein, aber Ich hoffe, dass das Senden von Tastendrücken (und das Aufrechterhalten einer Art von Status) flexibler ist als das Hardcodieren der Hälfte ihrer Webseitenstruktur in meiner App. – rubenvb

+0

Ah, Gotcha Ich hatte Glück, mit Hilfe von Gurken Selenium-Skripten zu navigieren, die im Grunde nur Bildschirm-Scrapes sind. Aber das klingt wie ein Bär. Gl! – lux

Antwort

0

Das Eingabefeld für die E-Mail verwendet eine Art HTML5 und ReactJS Validierungsmix.
Es scheint jedoch wie ReactJS Validierung kann nicht mit der dynamischen Wertänderung, also habe ich versucht, einen Weg zu finden, um es zu deaktivieren, was ich nicht direkt, aber ich vermute, dass es eine Art von Ereignishandler zum Formular hinzufügen muss so Ich kam mit dieser:

var validatingForm = document.getElementsByClassName("simple-login-form")[0]; 
var nonValidatingForm = document.getElementsByClassName("simple-login-form")[0].cloneNode(true); 
validatingForm.parentNode.replaceChild(nonValidatingForm, validatingForm); 

die alle Event-Handler und damit ReactJS Validierung loswird. Jetzt können Sie Ihren Wert mit Ihrem Code festgelegt:

document.getElementsByName("email")[0].value = "%1"; 
document.getElementsByClassName("btn login-button btn-submit btn-small")[0].click(); 

Beachten Sie, dass HTML5 noch die Eingänge Validierung, so müssen Sie eine E-Mail Adresse zur Verfügung stellen, wenn Sie davon loswerden wollen den Eingangstyp zu setzen zu Text vor Änderung des Wertes:

document.getElementsByName("email")[0].setAttribute("type", "text"); 

jedoch die nächste Seite nach klicken auf die Schaltfläche für das Passwort fragt, so dass Sie es finden, dort zu bieten, da ich nicht ein Weg, um dieses gefunden haben.

Buuuuuttt könnten Sie das Passwort nicht in Ihrem Browser gespeichert haben, lassen Sie es tun, es ist AutoFill Arbeit und feuern nur das Click Event?