IP ermitteln bei VB.Net und an PHP Skript versenden

Hi Leute, heute gibt's mal wieder was zum Thema Programmierung. Und zwar will ich euch hier zeigen wie ihr euch ziemlich einfach eure externe IP geben lassen könnt um diese bspw. zum Speichern in einer Datenbank zu nutzen.

Dieses Vorhaben kann sinnvoll sein, um zu überprüfen ob ein Programm gerade gestartet ist und anhand der IP als Primary Key kann man den Status dann zuordnen, aber damit wollen wir uns hier nicht beschäftigen.

Es gibt natürlich elegantere Methoden des Ermittelns einer IP, aber nicht jeder verfügt über die Mittel einen eigenen Server am laufen zu haben. Mit dem wäre es dann sehr einfach möglich ein Skript zu schreiben und die IP ohne weitere zurückzugeben.

Hier zeige ich euch daher die immer funktionierende Version unter Verwendung einer der zahlreichen IP-Checking Webseiten. Also fange ich einmal an alles der Reihe nach zu zeigen.

Was wird hier also gezeigt:

  • Ermitteln der externen IP (hierzu ist die wieistmeineip.de von Nöten)
  • Senden dieser IP und eines Status an ein PHP-Skript

Imports

Zunächst brauchen wir zwei Imports, die notwendig sind für den weiteren Quelltext:

Imports System.IO
Imports System.ComponentModel

Modul erstellen, z.B. "IPChecker"

Nun legt am besten ein Modul an, denn die Berechnung einer IP kann ohne Probleme ausgelagert werden. Zusätzlich legen wir auch noch ein paar private Variablen an:

Module IPChecker
    Private _IP As String
    Private _Status As Integer
    Private _IP_text As String = "ip"
    Private _Status_text As String = "status"
    Private _IPChecker_Website As String = "http://www.wieistmeineip.de/"
    Private _Website As String = "http://www.eureseite.net/script.php"
    Private _Local_Path As String = Mid(Environment.GetFolderPath(Environment.SpecialFolder.System), 1, 1) & ":\Windows\Temp\folder"

Zu erkennen ist, dass hierbei lokal eine Datei abgespeichert wird im Windows Temp Verzeichnis. Da nicht immer diese Partition auf "C" liegt ist es von Nöten den Partitions-Buchstaben zu ermitteln. Damit geht ihr auf Nummer sicher.

Methode zum Ausführen definieren

Nun brauchen wir eine public Methode, welche beim Programmstart ausgeführt werden soll:

Public Sub GetIPAddress()
    Dim data As New Net.WebClient
    AddHandler data.DownloadFileCompleted, AddressOf IPDownload_Completed
    Try

       data.DownloadFileAsync(New Uri(_IPChecker_Website), _Local_Path)
    Catch ex As Exception
    End Try

End Sub

Hierbei wird asynchron (ohne Blockierung) die Zieldatei heruntergeladen. Das Ganze ist auch ohne Zwischenspeichern möglich. Dies wird aber nicht direkt von VB.Net mitgeliefert und bei nur einer Datei auch nicht erforderlich.

Was passiert nach dem Download?

Zusätzlich dazu ist, wie bereits zu sehen war, eine Methode erforderlich, welche das Event beinhaltet, wenn der Download abgeschlossen ist.

Private Sub IPDownload_Completed(sender As Object, e As AsyncCompletedEventArgs)
    Dim sr As StreamReader = New StreamReader(_Local_Path)
    Dim source_Code As String = sr.ReadToEnd
    Dim begin As Integer = InStr(source_Code, "<h1 class=""ip"">") + 15
    Dim ende As Integer = InStr(begin, source_Code, "</h1>")
    Dim dif = ende - begin
    Try
       _IP = Mid(source_Code, begin, dif)
    Catch ex As Exception
    End Try
    AddDatabaseEntry(1)

End Sub

Diese Methode macht nichts anderes als die lokale Datei nach der ermittelten IP zu durchsuchen. Im Anschluss wird eine weitere Methode aufgerufen. Da es sich um das Startevent des Programms handelt, wird eine 1 übergeben, welche für wahr also z.B. "online" steht.

PHP Skript ansprechen

Oftmals will man diese gesammelten Daten verwenden um sie weiterzuverwerten. Daten sind kostbar und sofern sie keine persönlichen Attribute beinhalten und zu nicht kommerziellen Zwecken sicher aufbewahrt werden, ist es nicht verwerflich diese zu sammeln.

Public Sub AddDatabaseEntry(status As Integer)
    status = status
    Dim WebClient As New Net.WebClient
    Dim NameValueCollection As New System.Collections.Specialized.NameValueCollection
    NameValueCollection.Add(_IP_text, _IP)
    NameValueCollection.Add(_Status_text, status.ToString)
    Try
        Dim Resp As Byte() = WebClient.UploadValues(_Website, NameValueCollection)
        Dim RespEncoded As String = System.Text.Encoding.ASCII.GetString(Resp)
    Catch ex As Exception
    End Try
End Sub
End Module

Mit Hilfe der Collection lassen sich sehr einfach Wertepaare für die POST-Übertragung vorbereiten. Nachdem die Werte in die Collection geschrieben wurden, werden diese zum PHP-Skript gesendet. Das PHP-Skript soll nun per POST diese Daten annehmen und weiter verwerten.

Status ändern

Nun wisst ihr also wie man den Status "online" setzen kann. Aber wie sieht es mit "offline" aus. Natürlich auch sehr einfach. Hierzu genügt der Aufruf:

AddDatabaseEntry(0)

Da auch diese Methode public ist, ist der Aufruf möglich und das PHP Skript wird mit der IP und dem Status "0" bzw. "offline" beliefert.

Dieser Methodenaufruf sollte bei jeglichem Beenden des Programms erfolgen. Somit wird sichergestellt, dass keine "Datenleichen" die Datenbank "aufblähen".

Kommentar schreiben

Kommentare: 0