Projekt-Anfragen: Tel: 07022/9319004 info@CodeDocu.de Software Entwicklung in C# WPF Asp.Net Core Vba Excel Word SQL-Server EF Linq, UWP Net
#

Download:

Datei 1: MainPage.xaml
Datei 2: MainPage.xaml.cs
Datei 3: Fritzbox_Windows_10_App_Basis.zip

Fritzbox App Code: Einstiegscode zum Login in Fritzbox

 

Download einer Demo App für zum Zugriff auf die AVM Fritz.box.

Der Code ist geschrieben für Windows 10 Universal App UWP, das heißt, man kann damit auch als Basis Desktops, Tablets, Windows Lumia Phones und IoT erweitern.

Man benötigt den Grundcode zum Beispiel für alle kleinen Devices, die in der Heimvernetzung über das Netzwerk Daten austauschen sollen.

Zum Beispiel IoT Raspberry Pi2 und andere Microcontroller, die für Heizungen, Kühlschränke oder anderes eingesetzt werden können.

 

Hier die Basis App mit einem Start Button, der sich bei der Fritzbox anmeldet, eine temporäre Session erstellt mit einer Challenge-Nummer und einer SID, um anschließend

 

HMTL Response String beim Ausführen der Login Funktion und Lesen der Fritz.box Home Seite

Wenn man die Hauptfunktion  fl_Lese_Fritzbox(); ausführt, dann wird ein sogenanntes Channel (temporärer User)

Und eine SID erstellt und von der Fritzbox abgeholt.

Anschliessend wird die /home Seite ausgelesen.

Den html string  habe ich hier mal im Chrome Browser eingefügt und dargestellt.

Somit kann man auch alle anderen Fritz.box Seiten auslesen, wie zum Beispiel die Telefon-Nummern und das Telefonbuch

 

 

 

Folgend liegen die wichtigsten Dateien zum Download, die man für eine Windows 10 Universal App benötigt, um bei der AVM Fritzbox auf die Fritzbox zugreifen

Die MainPage.xaml Datei und die Codebehind-Seite MainPage.xaml.cs  mit dem C# zugriffscode

 

C# Code der Codebehind-Seite:

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Runtime.InteropServices.WindowsRuntime;

using Windows.Foundation;

using Windows.Foundation.Collections;

using Windows.UI.Xaml;

using Windows.UI.Xaml.Controls;

using Windows.UI.Xaml.Controls.Primitives;

using Windows.UI.Xaml.Data;

using Windows.UI.Xaml.Input;

using Windows.UI.Xaml.Media;            //brushes

using Windows.UI.Xaml.Navigation;

using Windows.Storage;                  //Files

using Windows.Storage.BulkAccess;       //Files

using Windows.Storage.FileProperties;   //Files

using Windows.Storage.Search;           //Files

using Windows.Storage.Streams;          //IRandomAccessStream

using Windows.UI.Xaml.Media.Imaging;    // Bitmap

using Windows.Storage.Pickers;          //Folderpicker

using Windows.Storage.AccessCache;      //StorageApplicationPermissions

using Windows.UI.ApplicationSettings;   //Settings

using Windows.UI.Xaml.Shapes;           //Rectangle

using System.Collections.ObjectModel;   //CollectionView

using Windows.UI.Popups;                //MessageBox

using System.Threading.Tasks;           //Tasks async

using System.Diagnostics;               //Debug alt:Console

using System.Threading;                 //CancelationToken

using System.Xml;                       //XMLDocument

using HtmlAgilityPack;                  //HTMLDocument

 

using System.Net.Http;                      //Webrequest

using Windows.Security.Cryptography.Core;   //HashCode MD5

using Windows.Security.Cryptography;        //Cryptocraphic Buffer

using System.Xml.Linq;                      //XDocument

using System.Text;                          //StringBuilder

 

namespace Win10_Fritzbox_Contacts_To_Smartphone

{

    /// <summary>

    /// Hauptseite

    /// </summary>

 

    public sealed partial class MainPage : Page

    {

        #region Global Variables

        //< Global Variables >

        public static MainPage _Current;

 

        public StorageFolder objPicked_Album_Folder;

        public StorageFolder objPicked_Shown_Folder;

 

 

        #endregion

        //========================< Class >========================

        #region Page

        //========================< Region: Page >========================

        public MainPage()

        {

            //----------------< MainPage() >----------------

            //1.Event

            this.InitializeComponent();

 

            //Dadurch wird bei einem externen Aufruf mit new Page() immer diese Seite erzeugt und man kann auf public Functions zugreifen

            this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;

            _Current = this;

            //----< Setting einstellen >----

            //-< Set Thumbnails_Column_Width >-

            if (Windows.Storage.ApplicationData.Current.LocalSettings.Values.ContainsKey("actColumn_Width") == true)

            {

                var sColThumbnails_Width = Windows.Storage.ApplicationData.Current.LocalSettings.Values["actColumn_Width"];

                //--< aktuellen Folder laden >--

                if (sColThumbnails_Width != null)

                {

                    try

                    {

                        //colThumbnails.Width = new GridLength(Convert.ToDouble(sColThumbnails_Width));

                    }

                    catch { }

                }

            }

            //-</ Set Thumbnails_Column_Width >-

            //----</ Setting einstellen >----

            //----------------</ MainPage() >----------------

        }

        private void Page_Loading(FrameworkElement sender, object args)

        {

            //----------------< Page_Loaded() >----------------

            //1.Event

 

            //----------------</ Page_Loaded() >----------------

        }

        private void Page_Loaded(object sender, RoutedEventArgs e)

        {

            //----------------< Page_Loaded() >----------------

            //1.Event

 

            //----------------</ Page_Loaded() >----------------

        }

        //========================</ Region: Page >========================

        #endregion

 

        #region Buttons

        //========================< Region: Buttons >========================

        private  void btnStart_Click(object sender, RoutedEventArgs e)

        {

            //----------------< btnStart_Click() >----------------

            //*lade den HTML Content der eingestellten Webseite          

           

            fl_Lese_Fritzbox();

            //----------------</ btnStart_Click() >----------------

        }

        //========================</ Region: Buttons >========================

        #endregion

 

        string sURL_Fritzbox_Login = "http://fritz.box/login_sid.lua";

 

        public async void fl_Lese_Fritzbox()

        {

            string benutzername = "xxxxxxxx";

            string kennwort = tbxPasswort.Text;

 

            try

            {

                // SessionID ermitteln

                string sid = await fl_Get_SessionId(benutzername, kennwort);

                string seite = await SeiteEinlesen(@"http://fritz.box/home/home.lua", sid);

 

                //< html anzeigen >

                fl_Add_Log(seite);

                //</ html anzeigen >

            }

            catch (Exception ex)

            {

                tbxLog.Text = "Http-Error: " + ex.HResult.ToString("X") + " Message: " + ex.Message;

            }

 

          

        }

 

 

        public async Task<string> SeiteEinlesen(string url, string sid)

        {

            HttpClient client = new HttpClient();

            //< Lese Webseite >

            //*download

            HttpResponseMessage response = await client.GetAsync(url + "?sid=" + sid);

            response.EnsureSuccessStatusCode();

            //</ Lese Webseite >

            string sContent = await response.Content.ReadAsStringAsync();

            return sContent;

        }

 

       

 

        public async Task<string> fl_Get_SessionId(string sUser, string sPassword)

        {

            //----------------< fl_Get_SessionId() >----------------

            //*aufruf Login_sid und ermitteln der SessionID

            try

            {

                //< Login als xml laden >

                HttpClient client = new HttpClient();

                Stream stream = await client.GetStreamAsync(sURL_Fritzbox_Login);

                XDocument xmlDocument = XDocument.Load(stream);

                //</ Login als xml laden >

 

                //--< pruefen auf SID=0 >--

                string sid = fl_Get_Value_of_Node_in_XDocument_by_NodeName(xmlDocument, "SID");

                if (sid == "0000000000000000")

                {

                    //--< Sid anfordern >--

                    //login mit passwort

                    //Challenge ist eine temporaere User-kennung

                    //wie: <Challenge>9f1f6b6f</Challenge>

                    string challenge = fl_Get_Value_of_Node_in_XDocument_by_NodeName(xmlDocument, "Challenge");

                    tbxChallenge.Text = challenge;

 

                    //-< login als xml mit tempUser und kennwort >-

                    string sResponse = fl_GetResponse_by_TempUser_Passwort(challenge, sPassword);

                    tbxLog.Text = sResponse;

 

                    //< xml holen >

                    stream = await client.GetStreamAsync(sURL_Fritzbox_Login + "?username=" + sUser + @"&response=" + sResponse);

                    xmlDocument = XDocument.Load(stream);

                    //</ xml holen >

 

                    //< sid ermitteln >

                    sid = fl_Get_Value_of_Node_in_XDocument_by_NodeName(xmlDocument, "SID");

                    tbxSID.Text = sid;

                    //</ sid ermitteln >

 

                    //-</ login als xml mit tempUser und kennwort >-

                    //--</ Sid anfordern >--

                }

                //--</ pruefen auf SID=0 >--

                return sid;

            }

 

            catch (Exception ex)

            {

                //< Fehlermeldung get_SessionID >

                MessageDialog dialog = new MessageDialog("Http-Error: " + ex.HResult.ToString("X") + " Message: " + ex.Message, "Error in get SessionID");

                await dialog.ShowAsync();

                throw;

                //</ Fehlermeldung get_SessionID >

            }

 

            //----------------</ fl_Get_SessionId() >----------------

        }

        public string fl_GetResponse_by_TempUser_Passwort(string challenge, string kennwort)

        {

            //----------------< fl_GetResponse_by_TempUser_Passwort() >----------------

            //erstelle eine kodierte codierte Response

            string sHash_Response = fl_Get_MD5Hash_of_String(challenge + "-" + kennwort);

            return challenge + "-" + sHash_Response;

            //----------------</ fl_GetResponse_by_TempUser_Passwort() >----------------

        }

 

        public string fl_Get_MD5Hash_of_String(string input)

        {

            //----------------< fl_Get_MD5Hash_of_String() >----------------

            // Create a CryptographicHash object. This object can be reused to continually

            CryptographicHash objMd5Hasher = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Md5).CreateHash();

            IBuffer inputBuffer = CryptographicBuffer.ConvertStringToBinary(input, BinaryStringEncoding.Utf16LE);

 

            objMd5Hasher.Append(inputBuffer);

            IBuffer buffHash = objMd5Hasher.GetValueAndReset();

            StringBuilder sb = new StringBuilder();

            byte[] data;

            CryptographicBuffer.CopyToByteArray(buffHash, out data);

            for (int i = 0; i < data.Length; i++)

            {

                sb.Append(data[i].ToString("x2"));

            }

            return sb.ToString();

          

            //----------------</ fl_Get_MD5Hash_of_String() >----------------

        }

        public string fl_Get_Value_of_Node_in_XDocument_by_NodeName(XDocument doc, string name)

        {

            //----------------< fl_Get_Value_of_Node_in_XDocument_by_NodeName() >----------------

            //* FirstNode auslesen und Wert ausgeben

            XElement info = doc.FirstNode as XElement;

            return info.Element(name).Value;

            //----------------</ fl_Get_Value_of_Node_in_XDocument_by_NodeName() >----------------

        }

 

 

 

       

 

 

        #region Menue-Buttons

        //========================< Menue-Buttons >========================

 

        private void btnMenu_Help_Click(object sender, RoutedEventArgs e)

        {

            //< Page oeffnen >

            this.Frame.Navigate(typeof(pgHelp));

            //</ Page oeffnen >

        }

        private void btnMenu_Info_Click(object sender, RoutedEventArgs e)

        {

            //< Page oeffnen >

            this.Frame.Navigate(typeof(pgInfo));

            //</ Page oeffnen >

        }

        //========================</ Menue-Buttons >========================

        #endregion

 

        #region Controls

        //========================< Region: Controls >========================

 

        //========================</ Region: Controls >========================

        #endregion

 

        #region Funktionen

        //========================< Region: Funktionen >========================

        private void fl_Add_Log(string sText)

        {

            //----------------< fl_Add_Log() >----------------

            //*Log Funktion

            string textLog = tbxLog.Text;

            textLog = DateTime.Now.ToLocalTime() + " " + sText + Environment.NewLine + textLog;//

 

            //< Laenge kuerzen >

            if (textLog.Length > 50000) { textLog = textLog.Substring(1, 50000); }

            //</ Laenge kuerzen >

 

            //< ausgeben >

            tbxLog.Text = textLog;

            //</ ausgeben >

            //----------------</ fl_Add_Log() >----------------

        }

        //========================</ Region: Funktionen >========================

        #endregion

 

 

      

    }

 

 

 

}

 

 

 

 

MainPage.xaml Testseite, Einstiegsseite

<Page

    x:Class="Win10_Fritzbox_Contacts_To_Smartphone.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:local="using:Win10_Fritzbox_Contacts_To_Smartphone"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"   Loaded="Page_Loaded" Loading="Page_Loading"   >

 

 

    <Grid Grid.Column="1" x:Name="GridMain_Right" HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" Margin="0,40,0,0">

        <Grid.RowDefinitions >

            <RowDefinition Height="60"  />

            <RowDefinition Height="100*"/>

 

        </Grid.RowDefinitions>

        <StackPanel Grid.Row="0" Orientation="Horizontal" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"  >

 

            <Button  x:Name="btnStart" Width="164" HorizontalAlignment="Left"  VerticalAlignment="Stretch" Margin="1,0,0,0"     Content="Start"    Click="btnStart_Click"/>

            <TextBlock x:Name="lblPasswort" Text="Passwort:"  VerticalAlignment="Center" TextWrapping="NoWrap" Margin="10,0,0,0"  />

            <TextBox x:Name="tbxPasswort" TextWrapping="NoWrap"   Text="DemoPass"  TextAlignment="Left"    Width="200"    Padding="0,15,0,0"   />

               

            <TextBlock x:Name="lblChallenge" Text="Challenge:"  VerticalAlignment="Center" TextWrapping="NoWrap" Margin="10,0,0,0"  />

            <TextBox x:Name="tbxChallenge" Text=""   TextWrapping="NoWrap" HorizontalAlignment="Center" TextAlignment="Center" VerticalContentAlignment="Center"    Width="200" IsReadOnly="True"  />

            <TextBlock x:Name="lblSID" Text="SID:"  VerticalAlignment="Center" TextWrapping="NoWrap" Margin="10,0,0,0"  />

            <TextBox x:Name="tbxSID" Text=""   TextWrapping="NoWrap" HorizontalAlignment="Center" TextAlignment="Center" VerticalContentAlignment="Center"  Width="200"  IsReadOnly="True"   />

        </StackPanel>

 

 

        <ScrollViewer Grid.Row="1" HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" >

            <TextBlock x:Name="tbxLog"  TextWrapping="Wrap"   IsTextSelectionEnabled="True" />

        </ScrollViewer>

 

 

    </Grid>

 

 

    <Page.TopAppBar  >

 

        <AppBar  x:Name="cmBarMenu" IsOpen="False" IsSticky="false" ClosedDisplayMode="Minimal"     Foreground="Blue"  >

            <Grid >

                <Grid.ColumnDefinitions>

                    <ColumnDefinition Width="*"/>

                    <ColumnDefinition Width="100"/>

                    <ColumnDefinition Width="80"/>

                    <ColumnDefinition Width="80"/>

                    <ColumnDefinition Width="80"/>