JavaScript in WebView

  • Antworten:50
  • Bentwortet
Gelöschter Account
  • Forum-Beiträge: 45

27.09.2014, 14:55:36 via Website

Hallo Leute,

ich arbeite seit ein paar Tagen an einer Android App. Bisher läuft alles ohne Probleme.

public void onPageFinished(WebView view, String url) {
        view.getSettings().setJavaScriptEnabled(true);
        JavascriptInterface javasriptInterface = new JavascriptInterface(this);
        view.addJavascriptInterface(javasriptInterface, "MyInterface");
        view.loadUrl("javascript:(function(){document.getElementsByName('Submit')[0].click();})()");
    }

Das habe ich versucht, aber es geht nicht. Als JavascriptInterface habe ich das:

public class JavascriptInterface {
    Context mContext;

    JavascriptInterface(Context c) {
        mContext = c;
    }

    public boolean doSomething(String name, String address) {
        return true;
    }
}

Brauche ich sonst noch etwas? Das Interface habe ich über Google gefunden, aber verstehen tue ich es nicht.

Hoffe jemand kann mir helfen :).

Mfg
Daniel

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.09.2014, 16:06:03 via Website

Hallo Daniel,
Wilkommen bei uns im Forum :)

Zum Javascript Interface kannst du dir mal das Tutorial anschauen.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

27.09.2014, 18:58:50 via Website

Hallo Pascal,

danke :).

Ich habe mir nun das Tutorial durchgelesen. Aber wozu brauche ich ein Interface, wenn ich nur das Benutzernamen und Passwort Feld füllen und dann den Button klicken will?
Ich verstehe es momentan so: Wenn eine Webseite JavaScript Methoden aufruft, werden diese an das Interface weitergeleitet und dort aufgerufen. Aber ich möchte das doch gar nicht. Verstehe ich da etwas falsch?

Mfg
Daniel

— geändert am 27.09.2014, 19:00:31

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.09.2014, 19:33:23 via Website

Genau, entweder so wie das tut oben oder man erstellt eine html Seite mi Javascript Autopost beim body onload.
Dann Passt das auch.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

27.09.2014, 19:44:26 via Website

Vielen Dank, ich habe nun diesen Code:

view.loadUrl("javascript:{" +
                        "document.getElementsByName('username')[0].value='" + "test" + "';" +
                        "document.getElementsByName('password')[0].value='" + "test" + "';" +
                        "var form = document.getElementsByName('Submit');" +
                        "form[0].submit();};");

Die 2 Testfelder werden mit test befüllt, aber der Button wird nicht ausgeführt. Habe ich einen Fehler im Code?

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

27.09.2014, 19:58:23 via Website

Ich hatte gerade etwas falsch verstanden. Der Button hieß Submit und nicht die Form.. Jetzt funktioniert es.

@Pascal Was bringt der Code von dir für einen Vorteil?

Mfg
Daniel

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.09.2014, 20:02:13 via Website

Eigentlich keinen, wenn man es genau nimmt.
Es ist beides möglich und auch egal wie man es macht.
Ich habe die methode hat verwendet, da ich in meinem ProgrammCode keine Javascript Elemente drinnen haben wollte.
Somit ist loginSkript und LoginLogik (Code) von einander etrennt
(In wirklichkeit ist eswas kompizierter, da die Login Page dynamisch generiert wird, aber so das "normale" prinzip)

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

27.09.2014, 20:04:12 via Website

Okay, vielen Dank.
Eine kleine Frage hätte ich noch. Gibt es eine Möglichkeit eine Tabelle von einer Webseite auszulesen ohne den Code dieser zu durchsuchen.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.09.2014, 20:07:34 via Website

Na ja damit kenne ich mich sehr gut aus xD
Es gibt verschiedene Möglichkeiten:
1. Programmlogik zu suchen selber programmieren und Daten aufbereiten
2. (Beste Lösung) Einen Html Parser dafür nutzen
Für einen HTML Parser kann ich dir Jsoup empfehlen.
Ist einfach in der Handhabung und schnell.
Was hast du denn vor?

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

27.09.2014, 20:10:34 via Website

Meine Schule hat eine Webseite und ich arbeite an einer App von diesem man die Vertretungspläne etc. schnell sehen kann. Diese werden mit einer Tabelle dargestellt.
Ich sehe mir den Parser mal an. Danke :).

Mfg
Daniel

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.09.2014, 20:17:04 via Website

Oh ja Vertretungspläne mag ich :) ;)
Sind diese direkt auf der Schulhomepage oder benutzt deine Schule ein System wie z.b. das DSB (Digitales Schwarzes Brett)

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

27.09.2014, 20:23:57 via Website

Diese sind direkt auf der Schulwebseite.
Wie kann ich machen das jsoup mein WebView nutzt? Denn man muss ja eingeloggt sein...

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.09.2014, 20:30:05 via Website

Kannst mir mal ne pn mit den Zugangsdaten und der Website schreiben.
Ich schau mir das dann mal an.

Zu deinem Problem:
Du musst dich schon ohne WebViewer einloggen, d.h. die Javascript Methode nützt dir nix.
Aber ohne die Website gesehen/analysiert zu haben kann ich dir da gerade keinen ansatz geben.

PS: Hab da so ne idee aber muss diese erst an deinem Beispiel überprüfen

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

27.09.2014, 20:43:35 via Website

Ich kann im Moment keine PN's verschicken... Kommt eine Meldung.

Mfg
Daniel

— geändert am 27.09.2014, 20:43:51

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.09.2014, 20:57:00 via Website

So jetzt habe ich dich mal von Hand freigeschaltet.
PNs werden normalerweise erst ab 10 Posts freigegeben, auf jeden Fall sollte es jetzt gehen. :)

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

27.09.2014, 21:05:56 via Website

Vielen Dank. Habe dir eine PN gesendet.

Mfg
Daniel

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

30.09.2014, 16:37:48 via Website

Irgendwelche Neuigkeiten?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.09.2014, 16:40:48 via Website

Hallo Daniel, ich habe dir doch zurückgeschreiben, aber falls was unlar ist/war, stelle doch hier im Forum dir frage

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

01.10.2014, 13:42:29 via Website

Wo sehe ich die Nachrichten?

MFG
daniel0916

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.10.2014, 13:57:05 via App

Normalerweise bekommst du eine Email mit der Nachricht an deine bei AndroidPit hinterlegte Email adresse.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

12.10.2014, 17:20:47 via Website

Also das parsen des Vertretungsplans ist abgeschlossen.
Für den Elternbrief muss Jsoup bei der Webseite angemeldet sein. Wie realisiere ich das?
Außerdem habe ich ein Problem mit dem Login per WebView. Das buggt etwas. Beim ausführen des JavaScripts wird das PageCompletedEvent nicht aufgerufen. Das geht ja anscheinend mit einem Post Request. Könnte mir da jemand helfen?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.10.2014, 17:38:30 via Website

Hallo Daniel,
ich würde das Login auf jeden Fal ohne WebView machen.
Sonst hast du später nur Probleme beim Quellcode Lesen.
Vom Prinzip her könntest du http Post nutzen: http://www.wikihow.com/Execute-HTTP-POST-Requests-in-Android
Das Problem sind nur die beiden hidden Felder, die du warscheinlich (vlt auch nicht) mitsenden müsstest.
Sobald das geklappt hat, bekommst du die loggedIn seite zu sehen.
Dann musst du nur noch den Quellcode verarbeiten, das am besten Dann per Jsoup.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

12.10.2014, 18:03:33 via Website

Das eine hidden Feld bleibt gleich und das andere ändert sich. Ich habe mir bereits einen Code geschrieben, der den SourceCode durchgeht und diese Stelle herausfiltert/liest. Nur ich bin zu dumm den Post Request zu senden. Ich werde mir den Link später am PC durchlesen.
Wie will JSoup die Webseite parsen? Ich sende ja nur einen kurzen Request. Ist dann JSoup automatisch angemeldet.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.10.2014, 18:06:20 via Website

Nein, jsoup ist nur ein HTML Parser.
Hat mit Anmelden etc überhaupt nichts zu tun.
Du bekommst vom HTTPClient einen HTML SourceCode , diesen gibst du dann dem Jsoup Parser über diesen kannst du den Quellcode dann absuchen.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

12.10.2014, 18:53:18 via Website

Achso, wusste nicht das man dem Parser auch direkten Source Code übergeben kann.
Ich werde mal sehen, ob ich es schaffe ;).

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

12.10.2014, 20:31:14 via Website

Hier mein momentaner Code. Aber er geht nicht. Was ist der Fehler?

public class authTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... voids) {
        try {
            String Token = getHiddenToken();

            Log.d("test", Token);

            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost("url");

            List<NameValuePair> pairs = new ArrayList<NameValuePair>();
            pairs.add(new BasicNameValuePair("username", "test"));
            pairs.add(new BasicNameValuePair("password", "test"));
            pairs.add(new BasicNameValuePair("remember", "yes"));
            pairs.add(new BasicNameValuePair("option", "com_users"));
            pairs.add(new BasicNameValuePair("task", "user.login"));
            pairs.add(new BasicNameValuePair("return", "aW5kZXgucGhwP0l0ZW1pZD0yMTgjY29udGVudA=="));
            pairs.add(new BasicNameValuePair(Token, "1"));
            post.setEntity(new UrlEncodedFormEntity(pairs));

            HttpResponse response = client.execute(post);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

            String inputLine;
            while ((inputLine = bufferedReader.readLine()) != null) {
                Log.d("test", inputLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    public String getHiddenToken() throws IOException {
        URL url = new URL("url");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.addRequestProperty("User-Agent", "Mozilla/4.76");
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        String text = ".*<input type=\"hidden\" name=.*";
        Pattern pattern = Pattern.compile(text);

        List<String> list = new ArrayList<String>();
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            Matcher m = pattern.matcher(inputLine);
            if (m.matches()) {
                list.add(inputLine);
            }
        }

        in.close();

        String token = list.get(list.size() - 1);

        token = token.replace("    ", "");
        token = token.replace("<input type=\"hidden\" name=\"", "");
        token = token.replace("\" value=\"1\" /><div class=\"login-links\">", "");

        return token;
    }
}

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.10.2014, 20:38:51 via App

Hallo Daniel,
gibt es irgend einen LogCat Fehler?
Wenn nein dann ists komisch werde mir das morgen abend mal genauser anschauen.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

12.10.2014, 20:47:59 via Website

Nein, es kommt nur die Ausgabe des HTML Codes und daran sehe ich, dass ich nicht eingeloggt bin.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.10.2014, 20:50:20 via App

Dann bringt mir das anschauen auch nichts denn potentiell tut dein Code. Jetzt ist nur die Frage ob du das http post auch auf die richtige url machst. Wenn nein ist klar warums nicht tut.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

13.10.2014, 17:32:50 via Website

Diese URL's habe ich getestet:
www.-----.de/index.php/de/component/users/?task=user.login
www.-----.de/index.php/de/

Welcher von den beiden ist der richtige?
Eigentlich ja der 2. oder?

<form action="/index.php/de/" method="post" id="login-form">

Ich habe noch das Feld submit hinzugefügt. Brauche ich das?

pairs.add(new BasicNameValuePair("submit", "Anmelden"));

Habe es auch ohne getestet, aber nie geht es. Finde den Fehler nicht...

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.10.2014, 17:52:46 via Website

image
So müsste der Post Request aussehen, natürlich mit alschen Benutzerdaten :P
Hast du einen Anhaltspunkt ab wann du eingeloggt bist?
Per html?

Seite neu laden, um den Quelltext zu holen für: h ttp://(..).de/index.php/de/

Nach Firebug im Firefox müsste diese Antwort zurückkommen.
Bist du dir sicher, dass der HTTP Post auch wirklich funktioniert, bzw. dass alle Parameter übertragen werden?

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

13.10.2014, 18:07:43 via Website

Genau in dieser Reihenfolge?

Wie bekomme ich die Rückgabe? Momentan lasse ich mir nur den Quellcode zurückgeben.
Ich suche momentan immer nach: /index.php/de/2011-12-30-19-59-00/lehrersprechstunden
Dieser Link erscheint erst nach dem einloggen.

— geändert am 13.10.2014, 18:10:04

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.10.2014, 18:12:04 via Website

Genau das meine ich, vlt kopiere dir mal den Quellcode in eine HTML Datei und schau dir an was das wirklich für eine Seite ist.
Ich denke da werden php Header Funktionen verwendet.
Da ist das Problem dabei, das man mit dem HTTP Client nicht weitergeleitet wird.

PS: Willst du die Postdaten in deiner App nochmal überprüfen?

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

13.10.2014, 19:54:21 via Website

Okay, werde ich machen.

Wie meinst du nochmal prüfen? Also submit hatte ich klein, nun groß. Ich teste es dann gleich nochmal. Muss das genau in der gleichen Reihenfolge sein wie auf deinem Bild?

Edit:
image

Habe mir nun den HTML Code in eine Datei schreiben lassen und wenn ich diese nun aufrufe kommt das:
Dieser Fehler kommt auf der Webseite egal ob ich die richtigen oder falschen Daten angebe...
Das könnte aber auch daran liegen, dass ich es über meinen PC öffne oder?

Wie kann ich so einen Test Post Request machen wie auf deinem Bild?

Edit: Okay, mit Firebug habe ich nun die gleiche Ansicht wie du. Kann ich da nun auch einen Test Post Request senden?
Edit2: Habe nun einen TestRequest mit dem Addon HttpRequester gemacht und es kommt "Fehlerhafter Code" als Response.

POST http://www.fvls.de/index.php/de/?username=test&password=test&remember=yes&Submit=Anmelden&option=com_users&task=user.login&return=aW5kZXgucGhwP0l0ZW1pZD0yMTgjY29udGVudA==&eb0d558c05b4eefa60ab455cfafecd91=1
Content-Type: text/xml

Habe auch schon eine andere Content-Type versucht. application/x-www-form-urlencoded
Aber leider funktioniert es nicht. Was ist denn an diesem Request falsch. Habe es auch mit meinem Benutzernamen und Passwort versucht, aber das ging auch nicht.

— geändert am 13.10.2014, 20:51:09

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.10.2014, 20:58:09 via App

Hmm weiss ich gerade nicht. Im Browser tut es auf jeden Fall. Ich würde mal überprüfen ob alle Parameter komplett beim Server ankommen.
Hast du einen mit php oder so. Sonst kann ich dir schnell was basteln.(vlt nich vor morgen nachmittag)

Edit wo ist denn jetzt dein Ausgelesenes Token hin?

— geändert am 13.10.2014, 20:59:19

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

13.10.2014, 22:02:34 via Website

Was meinst du einen mit PHP?

Und der Token ist doch ganz am Schluss... Oder was meinst du?

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

15.10.2014, 15:33:09 via Website

Hast du schon Neuigkeiten?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.10.2014, 15:40:40 via Website

Oh soory ganz vergessen :(
Zudem bitte nicht pushen, schaue son mal in den Threads wieder vorbei und es ist hier unerwünscht.

Alsp PHP ist eine Serverprogrammiersprache, mit der man sich dynamisch webseiten etc. generienen lassen kann.
Über eine eigene erstellte PHP seite kannst du dir alle Post parameter ausgeben lassen, so dass su siehst ob alle Parameter richtig am anderen Ende ankommen.

Und ja das token ist am schluss, das hatte ich übersehen...

Noch fragen?

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

15.10.2014, 17:19:54 via Website

Achso, okay. Sorry. Wusste ich nicht.

Ich weiß schon was PHP ist, ich verstehe nur nicht, wie das gehen soll, damit man sieht, ob es richtig ankommt.
Außerdem weiß ich nur sehr wenig von PHP.. deswegen werde ich so eine Seite nicht machen können...

LG
Daniel

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.10.2014, 17:26:54 via Website

Da ich mir so ein Paar tools mal gebastelt habe sieht der Code folgend aus:

<?php

//Gibt alle geschickten post Parameter aus:
print_r($_POST);



?>

Zum testen kannst du gerne die Parameter auf http://pascal-p.de/tools/getPostParameters.php diese Seite schicken, dort werden dir dann in einer html alle parameter zurückgegeben.
So siehst du ob dein HTTP Post alle Variablen richtig schickt.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.10.2014, 17:41:52 via Website

nein, du hast mich falsch verstanden, du solltest die "localhost" bzw. deine PC ip als url in deine App eintragen und dann schauen ob der HTTP Post in der App funktioniert.
Meiner Ansicht nach ist die url per http get und nicht per http post angesprochen.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

15.10.2014, 17:42:47 via Website

Okay, mache ich :).

// Funktioniert. Ich bekomme genau die Post Parameter heraus, die ich gesendet habe.
Kann es sein, dass das nicht geht? Aber eigentlich müsste es doch gehen oder?

— geändert am 15.10.2014, 17:52:40

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

18.10.2014, 13:15:09 via Website

Ich habe nun noch vieles versucht. Mein Ergebnis: Ich kann den Token nur einmal verwenden. Mein Problem wird sein, dass ich einen Token auslese, der beim Post Request nicht mehr geht. Aber woher bekomme ich dann diesen Token? Ich müsste den Post Request an die gleiche URLConnection sende bei der ich auch den Token auslese. Das sollte dann funktionieren. Aber wie mache ich das?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.10.2014, 13:33:06 via App

Du musst den Post request wirklich mit dem gleichen HttpClient senden (oder httpurlconnection) dafür würde sich die Speichrung der Client instanz anbieten. Am besten in eine static variable die aus dem AsyncTask gesetzt wird.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

18.10.2014, 13:40:43 via Website

Okay, aber wie bekomme ich den Source Code einer Webseite mit der HttpClient?

Kann ich die HttpClient nicht definieren und dann den Source Code der Webseite auslesen und danach den HttpPost senden? Dann brauche ich doch gar nichts static oder?

// Ah okay, Get Request geht da auch :).

// Jaaaaa, geht alles :).

— geändert am 18.10.2014, 14:00:21

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.10.2014, 17:32:23 via App

Sehr schön :)

Ich habe dann mal deinen Thread auf beantwortet gesetzt ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 45

19.10.2014, 22:05:32 via Website

Vielen Dank.
Elternbrief habe ich nun auch geschafft :).

Nochmal vielen vielen Dank.

Antworten