German B4J Webrequest

TekkieLex

Member
Licensed User
Longtime User
Hallo Zusammen,

Ich versuch seit gestern Abend den Webrequest wie in diesem Post
https://www.b4x.com/android/forum/threads/widget-daten-von-webseite-holen.59882/#post-377553

in B4J umzusetzen.

Leider bekomme ich unter Log nur das zurück
Program started.
<head><title>Object moved</title></head>
<body><h1>Object Moved</h1>This object may be found <a HREF="Dot_SecondPassword.asp">here</a>.</body>

sobald ich unter Jobdone eintrage
B4X:
Sub JobDone (Job As HttpJob)
    Select Job.JobName
        Case "Login"
          Log(Job.GetString.Contains("password"))
    End Select
End Sub

bekomme ich folgenden Fehler
Program started.
<head><title>Object moved</title></head>
<body><h1>Object Moved</h1>This object may be found <a HREF="Dot_SecondPassword.asp">here</a>.</body>
Error occurred on line: 34 (Main)
java.io.FileNotFoundException: C:\Users\ALEXAN~1\AppData\Local\Temp\1 (Das System kann die angegebene Datei nicht finden)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at anywheresoftware.b4a.objects.streams.File.OpenInput(File.java:225)
at b4j.example.httpjob._getstring2(httpjob.java:186)
at b4j.example.httpjob._getstring(httpjob.java:175)
at b4j.example.main._jobdone(main.java:131)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:593)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:225)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:158)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:93)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:90)
at anywheresoftware.b4a.keywords.Common.CallSub4(Common.java:462)
at anywheresoftware.b4a.keywords.Common.access$0(Common.java:442)
at anywheresoftware.b4a.keywords.Common$CallSubDelayedHelper.run(Common.java:516)
at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)

Liegt es daran das die App kein Zugriffsrechte auf das TEMP Ordner für den Browser Cache hat?

oder wo liegt mein fehler?
Gruß
Alexander
 

Siam

Active Member
Licensed User
Longtime User
Hallo

dein request wird vom server damit beantwortet das diese Seite die du laden möchtest "umgezogen" ist
Der Server Schlägt dir vor das du folgende seite öffnen sollst : "Dot_SecondPassword.asp"

<head><title>Object moved</title></head>
<body><h1>Object Moved</h1>This object may be found <a HREF="Dot_SecondPassword.asp">here</a>.</body>

Zum 2. Problem die datei die du öffnen willst existiert nicht:

"java.io.FileNotFoundException: C:\Users\ALEXAN~1\AppData\Local\Temp\1 (Das System kann die angegebene Datei nicht finden)"

lg

andy
 

TekkieLex

Member
Licensed User
Longtime User
Hallo Andy,
Danke für dein feedback.

zum punkt 1.

Unter B4A ist exakt der gleiche Code und bekomme keinen fehler sogar der Content wird mir Korrekt in der log angezeigt unter b4J bekomm ich nur den Content wie im Posting oben.

zum Punkt 2.

Welche Datei will ich öffnen? die Temp datei vom request?

der fehler taucht nur auf wenn diese abfrage gesetzt wird.
B4X:
 If Job.GetString.Contains(CheckText) Then.....

Hier nochmal der ganze programm Code in B4J (UI app)
B4X:
Sub Process_Globals
     Private fx As JFX
    Private MainForm As Form
   
    Dim msgbox As Msgboxes
    Private Button1 As Button
    Private TextField3 As TextField
    Private TextField2 As TextField
    Private TextField1 As TextField
End Sub

Sub AppStart(Form1 As Form, Args() As String)
'Do all your initializing and stuff
MainForm = Form1
    MainForm.SetFormStyle("UNIFIED")
    MainForm.RootPane.LoadLayout("form1") 'Load the layout file.
    MainForm.Show
   
End Sub



Sub Login(Username As String, Password As String)
  
    Dim SU As StringUtils
    Username = SU.EncodeUrl(Username,"UTF8")
    Password = SU.EncodeUrl(Password,"UTF8")
  
    Dim HJ As HttpJob
    HJ.Initialize("Login",Me)
   
    HJ.PostString("http://www.meindomainname.com/Dot_login.asp?", "username="& Username& "&password="&Password)
   
End Sub

Sub Password2(Password As String)
  
    Dim SU As StringUtils
    Password = SU.EncodeUrl(Password,"UTF8")
   Dim HJ As HttpJob
    HJ.Initialize("account",Me)
    HJ.PostString("https://www.meindomainname.com/Dot_SecondPasswordExec.asp?", "password2="&Password)
   
End Sub
Sub JobDone (Job As HttpJob)
Select Job.JobName
        Case "Login"
            Dim CheckText As String = "wrong username and password"
          
            If Job.GetString.Contains(CheckText) Then
                'Log("Username oder Password Falsch")
               
                msgbox.show("Username oder Passwort Falsch", "Fehler")
            Else
                'Log("Weiter mit Password 2")
           
                Password2(TextField3.text)
            End If
           
            Case "account"
            Dim CheckText As String = "wrong second password"
          
            If Job.GetString.Contains(CheckText) Then
                'Log("Password 2 Falsch")
               
                msgbox.Show("Second Password ist Falsch", "Fehler")
            Else
                'Log("Anmeldung erfolgreich, daten auswerten")
            Dim matcher1 As Matcher
            Dim welcomen As String
            matcher1 = Regex.Matcher(">Welcome,.([a-zA-Z].+[a-zA-Z]).to",Job.GetString)
           
            Do While matcher1.Find = True
            'Log(matcher1.Match)
                welcomen =matcher1.Group(1)
            Loop
            msgbox.show("Hallo " & welcomen & ", ihre anmeldung war erfolgreich", "info")
           

            End If
           
    End Select
End Sub

Sub Button1_Action
    Login(TextField1.text,TextField2.text)
End Sub

Grüße
Alexander
 

JanPRO

Well-Known Member
Licensed User
Longtime User
Hier ist ein Beispiel, welches nicht HttpJob nutzt:

B4X:
Dim OS As OutputStream

Sub Login(Username As String, Password As String)

    Dim SU As StringUtils
    Username = SU.EncodeUrl(Username,"UTF8")
    Password = SU.EncodeUrl(Password,"UTF8")

    Dim Post As String = $"login=${Username}&register=0&password=${Password}&cookie_check=0&redirect=%2Fandroid%2Fforum%2F&_xfToken="$

    Dim HR As HttpRequest
    HR.InitializePost2("https://www.b4x.com/android/forum/login/login",Post.GetBytes("UTF8"))

    Dim HC As HttpClient
    HC.Initialize("Login")
    HC.Execute(HR,0)
End Sub

Sub Login_ResponseSuccess (Response As HttpResponse, TaskId As Int)
    OS.InitializeToBytesArray(0)
    Response.GetAsynchronously("GetString",OS,True,0)
End Sub

Sub GetString_StreamFinish (Success As Boolean, TaskId As Int)
  If Success = False Then
        Log("Error2: " & LastException.Message)
        Return
  End If

  Dim Result As String = BytesToString(OS.ToBytesArray,0,OS.ToBytesArray.Length,"UTF-8")
  Dim CheckText As String = "login/login"
    
  If Result.Contains(CheckText) Then
    Log("Anmeldung nicht möglich")
  Else
    Log("Anmeldung erfolgreich")
  End If

End Sub
Sub Login_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int)
    Log("Error1: " & Reason)
End Sub

Dieser Code ist eigentlich das, was hinter einem HttpJob steckt. Der Vorteil hier ist, dass du Headerparamter des Requestes setzten kannst, denn ich denke, dass hier das Problem liegen könnte.
Also bau dir einen exakt gleichen Request wie der von deinem Browser auf dem Pc (Headerdaten kannst du mit einem Plugin auslesen), von dem du weißt, dass er funktioniert :)

Achso und vergess nicht jHttp und jStringUtils zum Projekt hinzuzufügen
 
Last edited:

TekkieLex

Member
Licensed User
Longtime User
Hallo Jan,
Danke erstmal.

ich hab deine Code nun probiert, Rückmeldung aus der log
Program started.
Error1: Object moved

So wie ich es nun verstehe,ist das der Poststing abgeschickt wird, die Quittungsbestätigung mit (Status: HTTP/1.1 302 Object moved) bekommt aber dann abbricht ohne das GET (HTTP/1.1 200 OK) abzuwarten.
Wahrscheinlich deshalb bekomme ich auch keinen html Content in der log angezeigt

Ich frag mich halt warum unter B4A dein Code aus den anderm Beitrag wunderbar funktioniert?
https://www.b4x.com/android/forum/threads/widget-daten-von-webseite-holen.59882/#post-377553
ist ja im Grunde der selbe weg.
 

TekkieLex

Member
Licensed User
Longtime User
Unter Dim Post As String hab ich die daten angepasst wie dies von meiner seite aus als POST Submit übetragen werden.

Was meinst du mit Header? Http Header ?
Muss ich User_agent, Cookies usw. Manuel mit übergeben im PostString oder wird das selbst ausgehandelt ?

Wenn nicht wie binde ich dies mit ein?

Ich wäre Dir sehr dankbar wenn du mir das etwas näher erklären könntest. Will es Verstehen.

Vielen dank schonmal
 

JanPRO

Well-Known Member
Licensed User
Longtime User
Muss ich User_agent, Cookies usw. Manuel mit übergeben im PostString oder wird das selbst ausgehandelt ?
Ja, genau das meinte ich mit "nachbauen", dass du wesentliche Parameter wie User-Agent und Content-Type bestimmst. Das kannst du mit SetHeader machen:

B4X:
HttpRequest1.SetHeader("User-Agent","Test")
 

TekkieLex

Member
Licensed User
Longtime User
Ich hab nun den Code so verwendet
B4X:
Sub Login(Username As String, Password As String)

    Dim SU As StringUtils
    Username = SU.EncodeUrl(Username,"UTF8")
    Password = SU.EncodeUrl(Password,"UTF8")

    Dim Post As String = "username="& Username& "&password="&Password

    Dim HR As HttpRequest
  
  
    HR.InitializePost2("https://www.meineseite.com/Dot_login.asp?",Post.GetBytes("UTF8"))
    HR.SetHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36")
    HR.SetHeader("Content-Type","application/x-www-form-urlencoded")
    Dim HC As HttpClient
    HC.Initialize("Login")
    HC.Execute(HR,0)
End Sub

Ebenfalls auch so Probiert
B4X:
HR.SetContentType("application/x-www-form-urlencoded")

das Ergebniss ist das gleiche aus der LOG.
Program started.
Error1: Object moved

Hast du vielleicht noch ne Idee?

Ich kann ich dir gerne den domainname per PM zukommen lassen um die es sich handelt.
 

TekkieLex

Member
Licensed User
Longtime User
So hier ist nun die Lösung, vielleicht hilft es jemand weiter.

B4X:
Sub Login(Username As String, Password As String)
    Username = SU.EncodeUrl(Username,"UTF8")
    Password = SU.EncodeUrl(Password,"UTF8")

    Dim Post As String = $"username=${Username}&password=${Password}&Submit=Login"$
    HR.InitializePost2("https://www.meinedomain.de/postseite1.asp",Post.GetBytes("UTF8"))

    HC.Initialize("Login")
    HC.Execute(HR,0)
End Sub

Sub Login_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int)
    If Reason = "Object moved" Then
        Dim Location As String = Response.GetHeaders.Get("Location")
        If Location = "[scondlogin.asp]" Then
            Cookie = Response.GetHeaders.Get("Set-Cookie")
            'Mit SubString2 werden die eckigen Klammern am Anfang und Ende entfernt
            Cookie = Cookie.SubString2(1,Cookie.Length -1)
            Log("Erster Login erfolgreich")
            SecondLogin("Passwort")
        Else
            Log("Erster Login fehlgeschlagen")
        End If
  
    End If
End Sub

Sub SecondLogin(Password As String)
    Password = SU.EncodeUrl(Password,"UTF8")

    Dim Post As String = $"password2=${Password}&Submit2=Login"$
    HR.InitializePost2("https://www.meinedomain.de/postseite2.asp",Post.GetBytes("UTF8"))
      HR.SetHeader("Cookie",Cookie)

    HC.Initialize("SecondLogin")
    HC.Execute(HR,0)
End Sub

Sub SecondLogin_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int)
    If Reason = "Object moved" Then
        Dim Location As String = Response.GetHeaders.Get("Location")
        If Not(Location = "[dotmessage.asp?dotmessage=You+have+entered+the+wrong+second+password%2E+%3Ca+href%3DDot%5FSecondPassword%2Easp%3EClick+here%3C%2Fa%3E+to+try+again+or+retrieve+your+account+%3Ca+href%3DDot%5Fforgotpassword%2Easp%3Ehere%3C%2Fa%3E%2E]") Then
            Log("Zweiter Login erfolgreich")
            Cookie = Response.GetHeaders.Get("Set-Cookie")
            'Mit SubString2 werden die eckigen Klammern am Anfang und Ende entfernt
            Cookie = Cookie.SubString2(1,Cookie.Length -1)
            'Hier kannst du jetzt einen GetRequest veranlassen, vergess nicht den Cookie zu setzten mit:
            'HR.SetHeader("Cookie",Cookie)
        Else
            Log("Zweiter Login fehlgeschlagen")
        End If
  
    End If
End Sub

Unter B4J wird das Handling zwiwschen der seite nicht so einfach gehand habt wie unter B4A (sehe Post link)
https://www.b4x.com/android/forum/threads/widget-daten-von-webseite-holen.59882/#post-377553

Unter B4A wird so wie es aussieht die Weiterleitung (Object moved : Error Code 302) und die Cookie Handling automatisch ausgehandelt, unter B4J leider nicht da muss alles Manuel mit übergeben werden.

JanPro hat sich die Fehler Quittierung (Object moved : Error Code 302)zu nutze genommen und mit abfrage location (Webseiten Datei Name) überprüft ob true oder false (je nach Webseiten Aufbau) den Login Prozess weiter ausgebaut

Wichtig ist das man bei jedem weitern webrequest den Cookie mit überträgt von der Webseite.

Hier nochmals einen großen dank an JanPro für seine Hilfreiche Unterstützung.

Grüße
Alexander
 
Top