Laden...

HttpWebResponse auf nachladenden Inhalt warten

Erstellt von Pseudonym4711 vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.022 Views
P
Pseudonym4711 Themenstarter:in
55 Beiträge seit 2014
vor 6 Jahren
HttpWebResponse auf nachladenden Inhalt warten

Hallo zusammen,

ich möchte für meine Familie privat gerade eine art Haushaltsbuch programmieren
und möchte, dass mein Programm auch die aktuellen Kontostände und Umsätze
holt.

Bei meinem Konto (Postbank) funktioniert das alles recht einfach (Login, Seitennavigation,
Inhalte auslesen und wieder ausloggen).

Beim Konto meiner Frau (Commerzbank) ist das schon ne ganze Spur aufwändiger.

Hier muss die Loginseite erst mal per GET aufgerufen werden, um an den sogenannten
pToken heranzukommen den ich danach im POST brauche.

Damit klappt zwar der Login wunderbar, aber der Kontostand und die Umsätze werden
auf der Seite verzögert nachgeladen und ich weiß nicht wie ich auf diesen verzögerten
Inhalt warten kann.

Ich habe es schon async probiert (siehe auch folgender Code), aber die Seite an sich
ist schnell geladen und meldet dann wahrscheinlich "ich bin fertig", obwohl diverse
Inhalte eben noch fehlen.


using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

public class Commerzbank
{
    CookieContainer cookieContainer = new CookieContainer();

    HttpWebRequest request;
    HttpWebResponse response;

    byte[] byteArray;

    string postData, sourceCode, pToken;

    public Commerzbank()
    {
        request = (HttpWebRequest)WebRequest.Create("https://kunden.commerzbank.de/lp/login/?-1.IFormSubmitListener-loginForm");
        request.CookieContainer = cookieContainer;
        request.Accept = "text/html, application/xhtml+xml, image/jxr, */*";
        request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko";
        request.ContentType = "application/x-www-form-urlencoded";
        request.Method = "GET";

        sourceCode = ReadStreamFromResponse((HttpWebResponse)request.GetResponse());

        File.WriteAllText(@"C:\Users\User\Desktop\Commerzbank1.html", sourceCode);

        Regex getPToken = new Regex(@"(?<=pToken:..)(.*?,)");
        pToken = getPToken.Match(sourceCode).ToString().Substring(0, (getpToken.Match(sourceCode).ToString().Length - 2));

        var responseTask = GetResponseAsync();
        sourceCode = responseTask.Result;

        File.WriteAllText(@"C:\Users\User\Desktop\Commerzbank2.html", sourceCode);

        Task<string> GetResponseAsync()
        {
            request = (HttpWebRequest)WebRequest.Create("https://kunden.commerzbank.de/lp/login/?-1.IFormSubmitListener-loginForm");
            request.CookieContainer = cookieContainer;
            request.Accept = "text/html, application/xhtml+xml, image/jxr, */*";
            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko";
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "POST";
            request.Timeout = 20000;
            request.Proxy = null;

            postData = "pToken=" + pToken;
            postData += ("id1_hf_0=" + "");
            postData += ("&userid=" + "Benutzername/Teilnehmernummer");
            postData += ("&pin=" + "PIN");
            postData += ("&startSite=" + "/banking/landingpage");

            byteArray = Encoding.UTF8.GetBytes(postData);
            request.ContentLength = byteArray.Length;

            using (Stream stream = request.GetRequestStream())
            {
                stream.Write(byteArray, 0, byteArray.Length);
            }

            Task<WebResponse> task = Task.Factory.FromAsync(
                request.BeginGetResponse, asyncResult => request.EndGetResponse(asyncResult), null);

            return task.ContinueWith(t => ReadStreamFromResponse(t.Result));

        }

        string ReadStreamFromResponse(WebResponse response)
        {
            using (Stream responseStream = response.GetResponseStream())
            using (StreamReader sr = new StreamReader(responseStream))
            {
                string strContent = sr.ReadToEnd();
                return strContent;
            }
        }
    }
}

Das viele Grün im Code oben sind übrigens keine Kommentare, sondern die Seite hier interpretiert das nur so.

So und jetzt noch ein screenshot aus "Commerzbank2.html" (als Dateianhang). Da sieht man schön diese "ich lade noch Platzhalter".

Wie kann ich jetzt diesen Ladevorgang abwarten?

Vielen Dank schon mal für eure Hilfe!
Viele Grüße
Torsten

16.835 Beiträge seit 2008
vor 6 Jahren

a) verbietet die Commerzbank solche Tools, die nicht ihre APIs verwenden (HBCI/FinTS)
b) ist das JavaScript, was für das Nachladen verantwortlich ist, und das kann der WebRequest natürlich nicht ausführen. Dafür brauchst Du eine JavaScript Engine.

P
Pseudonym4711 Themenstarter:in
55 Beiträge seit 2014
vor 6 Jahren

dank a hat sich b ja erübrigt . . .

Danke dir trotzdem

D
985 Beiträge seit 2014
vor 6 Jahren

Eventuell schaust du dir mal Subsembly FinTS API denn

Die Nutzung der Subsembly FinTS API für private Zwecke und zur Evaluierung ist kostenlos.

P
Pseudonym4711 Themenstarter:in
55 Beiträge seit 2014
vor 6 Jahren

Besten Dank für den Link! Für meinen Zweck zwar ganz schön mächtig,
aber der Weg ist dann legal. 😃