Problem z logowaniem przy użyciu kontrolki Chrome

Problem z logowaniem przy użyciu kontrolki Chrome

Wątek przeniesiony 2024-06-25 09:32 z Inżynieria oprogramowania przez Ktos.

K7
  • Rejestracja:ponad 15 lat
  • Ostatnio:6 miesięcy
0

Mam problem z logowaniem na stronę
https://fleets.bolt.eu/v2/login

Delphi 10.4 community

Osadziłem Chrome na formie poprzez CEF4Delphi
działa, pokazuje się strona
następnie chcę się zalogować na powyższą stronę, ale to nie działa.

W przykładzie DOMVisitor dodaję własny przycisk i uzupełniam kod

Kopiuj
procedure TDOMVisitorFrm.Button1Click(Sender: TObject);
begin
  Chromium1.Browser.MainFrame.ExecuteJavaScript('document.getElementById("email").value= "XXXX";', '', 0);
  Chromium1.Browser.MainFrame.ExecuteJavaScript('document.getElementById("current-password").value= "XXXX";', '', 0);
  Chromium1.Browser.MainFrame.ExecuteJavaScript('document.getElementsByTagName("form")[0].submit();', '', 0);
end;

Widzę jak dane są uzupełniane ale dostaję komunikat

Kopiuj
403 ERROR
The request could not be satisfied.
This distribution is not configured to allow the HTTP request method that was used for this request. The distribution supports only cachable requests. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
Generated by cloudfront (CloudFront)
Request ID: Gibb7DRILMn9_uyKFACON7aoTIxXXpg4xHloYcikMlsZf0n2r9rVuQ==

I oczywiście niegatywne logowanie.

Jeżeli w oknie wkleję dane (Ctrl+V) i nacisnę przycisk logowania to logowanie jest prawidłowe.

Może ktoś doradzić co zrobić?

edytowany 2x, ostatnio: flowCRANE
szatkus1
  • Rejestracja:około 22 lata
  • Ostatnio:około 7 godzin
1

To samo się dzieje w przeglądarce jak się wywoła ten kod. Po prostu założyli listenera na kliknięcie przycisku.

hzmzp
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 17 godzin
  • Postów:637
1

Nie submituj forma tylko znajdź przycisk i na nim click wywołaj

K7
  • Rejestracja:ponad 15 lat
  • Ostatnio:6 miesięcy
0

Czyli:

Kopiuj
const e = new Event("click");
		
XXX.dispatchEvent(e);

Tylko jak znaleźć przycisk który nie ma id ani name, po "Caption"?

hzmzp
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 17 godzin
  • Postów:637
2

document.getElementsByTagName('button') iterujesz po liście, jak jest jeden to robisz na nim .click() jak nie to szukasz, który ma text lub class po którym możesz go zidentyfikować.

szatkus1
  • Rejestracja:około 22 lata
  • Ostatnio:około 7 godzin
0
karol75 napisał(a):

Czyli:

Kopiuj
const e = new Event("click");
		
XXX.dispatchEvent(e);

Tylko jak znaleźć przycisk który nie ma id ani name, po "Caption"?

document.querySelector('form button[type="submit"]')

K7
  • Rejestracja:ponad 15 lat
  • Ostatnio:6 miesięcy
0

I kicha
Podzieliłem na dwa przyciski aby być pewnym że to działa .

Kopiuj
var
  skrypt: String;

begin
  skrypt :=
  { } 'document.getElementById("email").value= "XXX";' +
  { } 'document.getElementById("current-password").value= "XXX";' +
  { } '';
  FMXChromium1.browser.MainFrame.ExecuteJavaScript(skrypt, '', 0);

end;

Po wykonaniu widzę tekst w odpowiednich polach

Drugi przycisk

Kopiuj
var
  skrypt: String;

begin
  skrypt :=
  { } 'var buttons = document.getElementsByTagName("button");' +
  { } 'for(let button of buttons){' +
  { } 'if (button.innerText=="Log in"){' +
  { } '  button.click();' +
  { } '  console.log(button.innerText);' +
  { } '  }' +
  { } '};' +
  { } '';
  FMXChromium1.browser.MainFrame.ExecuteJavaScript(skrypt, '', 0);

end;

Akcja się wykonuje ale tak jakby usuwało dane z pól przed wysłaniem danych.

Przetestowałem podejście i:
Poprzez Ctrl+V wklejam usera i hasło następnie wykonuję drugi przycisk i loguje się poprawnie.

Może też symulować przyciskanie klawiatury do wpisywania?

K7
  • Rejestracja:ponad 15 lat
  • Ostatnio:6 miesięcy
0

Czy ta funkcja może w tym grzebać?

Kopiuj
function m(e, t, n) {
                                return void 0 === n && (n = !1),
                                function() {
                                    var r = [].slice.call(arguments);
                                    try {
                                        var o = t(r)
                                          , a = o.get();
                                        if (n && e.apply(this, r),
                                        "function" !== typeof a)
                                            return e.apply(this, r);
                                        if (a.__trace__)
                                            o.replace(a.__trace__);
                                        else {
                                            var i = f();
                                            a.__trace__ = function() {
                                                d(i),
                                                h((function() {
                                                    d(null)
                                                }
                                                ), 0);
                                                var e = a.apply(this, arguments);
                                                return d(null),
                                                e
                                            }
                                            ,
                                            a.__trace__.__trace__ = a.__trace__,
                                            o.replace(a.__trace__)
                                        }
                                    } catch (s) {}
                                    if (e.apply)
                                        return e.apply(this, r);
                                    switch (r.length) {
                                    case 1:
                                        return e(r[0]);
                                    case 2:
                                        return e(r[0], r[1]);
                                    default:
                                        return e()
                                    }
                                }
                            }
                        },

GO
  • Rejestracja:około rok
  • Ostatnio:5 miesięcy
  • Postów:358
1

Strona jest zbudowana na react jest metoda onchange podpięta można zasymulować jej wywołanie.

Spróbuj czegoś takiego :>
document.getElementById("email")[Object.entries(document.getElementById("email")).filter((e) => e[0].startsWith("__reactProps"))[0][0]].onChange({"target": {"value": "twoj email"}})

Wydaje mi się, że to pomoże :P
Albo słaby ze mnie haxior, ale można też to zrobić na niższym poziomie czyli po prostu http requesty wysyłać bezpośrednio, a nie przez webview.

K7
  • Rejestracja:ponad 15 lat
  • Ostatnio:6 miesięcy
0

Jesteś Hasior :-D, działa, dzięki.

Kompletny kod do logowania

Kopiuj
var
  skrypt: String;
begin
  skrypt :=
  { } 'document.getElementById("email").value= "XXXXXXXXXX";' +
  { } 'document.getElementById("email")[Object.entries(document.getElementById("email")).filter((e) => e[0].startsWith("__reactProps"))[0][0]].onChange({"target": {"value": "XXXXXXXXXXX"}});'+
  { } 'document.getElementById("current-password").value= "XXXXXXXX";' +
  { } 'document.getElementById("current-password")[Object.entries(document.getElementById("current-password")).filter((e) => e[0].startsWith("__reactProps"))[0][0]].onChange({"target": {"value": "XXXXXXXXXX"}});'+
  { } 'var buttons = document.getElementsByTagName("button");' +
  { } 'for(let button of buttons){' +
  { } 'if (button.innerText=="Log in"){' +
  { } '  button.click();' +
  { } '  }' +
  { } '};' +
  { } '';
  Chromium1.browser.MainFrame.ExecuteJavaScript(skrypt, '', 0);
end;
edytowany 1x, ostatnio: flowCRANE
GO
wiem :P 18 lat expa w programowaniu :P
K7
Widzę, że w porównaniu do Ciebie, Ja w Javascript jeszcze raczkuję. Mój ojczysty ;-) język to Delphi.
GO
Akurat reversowałem vue i react jakiś czas temu i nawet na forum dodawałem do vue plugin i nauczyłem się komunikacji z tymi frameworkami od zewnętrznej strony, w sumie akurat to było doświadczenie z hackowania innych stron, każdy framework w jakiś sposób podpina się pod dane elementy widoku w html, każdy inaczej to robi, na angularze jeszcze nie robiłem nigdy, ale sam nie wiem jak tam by było rozwiązanie, by trzeba było kombinować.
GO
No i sobie poprawiłem humor pomocą tobie :> zastrzyk dopaminy :P
K7

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.