C# Quellcode - LCR Update für die aktuelle Fritzbox Firmware

troniac

Neuer User
Mitglied seit
27 Feb 2009
Beiträge
27
Punkte für Reaktionen
0
Punkte
1
Ganz simpler C# Code für das LCR, man holt sich den günstigsten Tarif von einer Webseite und fügt diesen in die Rufbehandlung als Provider ein.

Man kann es natürlich auch direkt mit curl machen, dafür schreib ich auch noch ein Script. Das hier hab ich in 10 Minuten gebaut und das kann wirklich jeder.

Natürlich geht das auch Headless ohne Browser aber zur Ansicht ist es ganz nützlich wenn man sieht was der Firefox so macht. Den Firefox driver kann man ganz einfach gegen jeden x-beliebigen driver austauschen!

Code:
        static void fritzboxlcr(string username, string password)
        {
            string port = FreeTcpPort().ToString();

            string driverPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            string driverExecutable = "geckodriver.exe";

            FirefoxDriverService driverService = FirefoxDriverService.CreateDefaultService(driverPath, driverExecutable);
            driverService.FirefoxBinaryPath = @"C:\Program Files\Firefox Developer Edition\firefox.exe -port " + port;
            driverService.Port = Int32.Parse(port);

            FirefoxOptions options = new FirefoxOptions();
            FirefoxProfile ff = new FirefoxProfile(@"C:\selenium\firefox.profiles\dqbtmm1a.SeleniumFritzbox");
            options.Profile = ff;

            options.AddArgument("-port " + port);
            options.UseLegacyImplementation = false;
            options.AcceptInsecureCertificates = true;


            options.LogLevel = FirefoxDriverLogLevel.Debug;
            options.SetPreference("marionette.port", port);
            options.SetPreference("webdriver.gecko.driver", driverPath+@"\geckodriver.exe -port " + port);
          

            Console.WriteLine("Load Webdriver Begin: " + GetTimestamp(DateTime.Now));


            IWebDriver driver = new FirefoxDriver(options);

            Console.WriteLine("Load Webdriver End: " + GetTimestamp(DateTime.Now));

            driver.Url = "https://www.billiger-telefonieren.de/festnetz/schnellrechner/ergebnis/?accessModeCallByCall=true&accessModeCallthrough=false&accessModePreselection=false&accessModeCallingCard=false&onlyWithoutRegistration=false&onlyWithoutConnectionFee=false&onlyWithTariffAnnouncement=false&onlyWithoutSimilarPrefixes=false&mergeDefaults=false&destinationId=56&phoneCallDuration=60&billingIncrement=60-60&onlyWithoutRegistration=true&onlyWithoutConnectionFee=true&onlyWithoutBreakout=true&rechnen=";
            IWebElement element = driver.FindElement(By.ClassName("cms-widget_calculator_result_list"));
            string myProvider = element.FindElement(By.CssSelector("li:nth-child(2) > ul:nth-child(1) > li:nth-child(2) > div:nth-child(2)")).Text;

            driver.Url = "http://192.168.178.1/";

            IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
            string title = (string)js.ExecuteScript("return document.title");

            element = driver.FindElement(By.Id("uiViewUser"));
            element.SendKeys(username);

            element = driver.FindElement(By.Id("uiPass"));
            element.SendKeys(password);

            Thread.Sleep(5000);

            element = driver.FindElement(By.Id("submitLoginBtn"));
            element.Click();

            driver.FindElement(By.Id("tel")).Click();
            Thread.Sleep(5000);

            driver.FindElement(By.Id("callHan")).Click();
            Thread.Sleep(5000);
            driver.FindElement(By.Id("dialProv")).Click();
            Thread.Sleep(5000);

            element = driver.FindElement(By.Id("uiPrefix1"));
            element.Clear();
            element.SendKeys(myProvider);
            Thread.Sleep(5000);

            driver.FindElement(By.Id("btnSave")).Click();
            Thread.Sleep(5000);

            driver.Close();
            driver.Quit();
        }
 
Hallo troniac,

ich habs leider nicht geschafft, dein Script ans laufen zu bekommen, habe aber auch nicht wirklich C# Erfahrung.
Daher hoffe ich hier auf deine Hilfe.

Was habe ich gemacht:
1. deinen Code in "fritzboxlcr.cs" gespeichert
2. ausführen: C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe fritzboxlcr.cs

Leider gabs daraufhin folgende Fehlermeldungen:
Microsoft (R) Visual C# Compiler version 4.0.30319.36415
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.
fritzboxlcr.cs(1,8): error CS1518: Expected class, delegate, enum, interface, or struct
fritzboxlcr.cs(12,34): error CS1518: Expected class, delegate, enum, interface, or struct
fritzboxlcr.cs(13,29): error CS1518: Expected class, delegate, enum, interface, or struct
fritzboxlcr.cs(29,29): error CS1518: Expected class, delegate, enum, interface, or struct
fritzboxlcr.cs(71,1): error CS1022: Type or namespace definition, or end-of-file expected


Wie gesagt, ich kenn mich gar nicht mit C# aus und meine Schritte sind das, was ich bisher gefunden habe.
Gefühlt braucht es wohl noch ein bisschen Code drum herum.
Kannst Du helfen?

VIelen Dank

Bye morT
 
Du musst natürlich eine main Funktion haben, die die fritzboxlcr("username","password"); ausführt. Desweiteren benötigst du noch den GeckoDriver (WebDriver) für Firefox, der im selben Verzeichnis liegen muss. Alternativ beschäftige ich mich zur Zeit mit GO Language und dem Chromium Browser-Framework. Vielleicht gibts demnächst eine fertige GO Anwendung die Ihr einfach nur ausführen müsst. Aufjedenfall ist es Möglich die LCR Funktionalität über das WebInterface am Leben zu halten ohne gleich die Fritzbox Firmware zu manipulieren.
 
Ich frage jetzt einfach mal ganz neugierig ... weil ich's wirklich nicht so richtig verstehe.

Warum sollte man das "so kompliziert" anstellen (nach meiner Ansicht), wenn man auch einfach gleich selbst den passenden POST-Request ans GUI der Box senden kann?

Wie die SID für eine eigene Sitzung zu erhalten ist, ist sogar bei AVM dokumentiert und einen POST-Request für die "data.lua" mit den passenden Parametern (hier ist es nicht mal ein Upload einer Datei, da braucht man also auch kein "multipart/form-data") zu verfassen, ist selbst in der Ausführung noch deutlich schneller, weil da niemand die Pausen zwischendrin braucht (ein "Thread.Sleep(x)" wartet ja "x" Millisekunden), die sich in #1 alleine auf 30 Sekunden summieren.

Die wenigsten Benutzer dürften den passenden Browser (bzw. die Automatisierungen dafür) installiert haben ... wenn man das in C# macht, ist ja vermutlich irgendwo auch ein .NET-Framework verfügbar (wenn das nicht mit Mono unter Linux verwendet wird) und da kann man auch ganz einfach die HTTP-Klassen aus dem Framework zum Senden des Requests verwenden und muß nicht irgendwelche Klicks in einem HTML-DOM simulieren.

Bitte nicht falsch verstehen ... das geht sicherlich auch alles und ich will auch nicht bestreiten, daß es sich um eine mögliche Lösung handelt.

Aber es ist schon so ähnlich wie die Reise um die Welt in 80 Tagen, obwohl man doch nur von Berlin nach Köln wollte ... zumal auch das Parsen der Antwort von "billiger-telefonieren.de" als Text kein echtes Problem darstellt.

Es ist nicht so, daß die Daten von dort erst irgendwie kompliziert im Browser per JS zusammengebaut werden - nein, die stehen direkt in der HTTP-Antwort und ob man die dann per HTML-DOM (oder per XML-DOM) oder als Text dort extrahiert, ist nur eine Frage des eigenen Geschmacks und der "Treffsicherheit", die man erzielen will (und der eigenen Kenntnisse hinsichtlich möglicher Alternativen).

Auch da ist der originale Ansatz in #1 (Abzählen der li- und ul-Elemente) ja nicht wirklich fehler- und vor allem änderungsresistent (wenn sich bei "billiger-telefonieren.de" etwas ändert am Seitenaufbau) ... man "verschlechtert" sich also nicht zwangsläufig, wenn man das nicht in einem Browser per Zugriff auf dessen DOM macht.
 

Neueste Beiträge

Statistik des Forums

Themen
244,879
Beiträge
2,220,030
Mitglieder
371,604
Neuestes Mitglied
broekar
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.