IP Locator

    • VB.NET

    Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von PascalN.

      IP Locator

      Ich zeige Euch, wie ihr eine Klasse erstellen könnt mit welcher ihr IP Adressen lokalisieren könnt (Land, Region, Stadt, Koordinaten, etc.)
      Im Grunde genommen habe ich in einer Klassenbibliothek 2 Klassen.
      Eine, die die Infos ausliest und eine zweite, die ein Objekt darstellt, in welchem die Daten schön gespeichert werden.

      Also:
      Klasse zum Auslesen der Informationen

      VB.NET-Quellcode

      1. Public Class GeoInfo
      2. Dim _ip As String
      3. #Region "Methoden"
      4. ''' <summary>
      5. ''' Ermittelt die derzeitige IP Adresse
      6. ''' </summary>
      7. ''' <returns>IP Adresse</returns>
      8. ''' <remarks></remarks>
      9. Public Function GetCurrentIP() As String
      10. Dim WebC As New Net.WebClient
      11. Return WebC.DownloadString("http://www.ip-adress.com/ip/")
      12. End Function
      13. ''' <summary>
      14. ''' Lokalisiert die angegebene IP Adresse
      15. ''' </summary>
      16. ''' <param name="IP">Ip, die lokalisiert werden soll</param>
      17. ''' <returns>Ein GeoData-Objekt, welches alle IP Informationen enthält</returns>
      18. ''' <remarks></remarks>
      19. Public Function Locate(ByVal IP As String) As GeoData
      20. _ip = IP
      21. Dim WB As New Windows.Forms.WebBrowser
      22. WB.Navigate("http://whatismyipaddress.com/ip/" & _ip)
      23. While WB.ReadyState <> Windows.Forms.WebBrowserReadyState.Complete
      24. System.Windows.Forms.Application.DoEvents()
      25. End While
      26. 'Return GData
      27. Try
      28. Dim country As String = WB.Document.GetElementsByTagName("table").Item(1).GetElementsByTagName("td").Item(0).InnerText
      29. Dim region As String = WB.Document.GetElementsByTagName("table").Item(1).GetElementsByTagName("td").Item(1).InnerText
      30. Dim city As String = WB.Document.GetElementsByTagName("table").Item(1).GetElementsByTagName("td").Item(2).InnerText
      31. Dim breite As String = WB.Document.GetElementsByTagName("table").Item(1).GetElementsByTagName("td").Item(3).InnerText
      32. Dim länge As String = WB.Document.GetElementsByTagName("table").Item(1).GetElementsByTagName("td").Item(4).InnerText
      33. Dim ISP As String = WB.Document.GetElementsByTagName("table").Item(0).GetElementsByTagName("td").Item(1).InnerText
      34. Dim Host As String = WB.Document.GetElementsByTagName("table").Item(0).GetElementsByTagName("td").Item(0).InnerText
      35. Dim GData As New GeoData(country, city, region, _ip, ISP, Host, breite, länge)
      36. Return GData
      37. Catch ex As Exception
      38. End Try
      39. End Function
      40. #End Region
      41. End Class


      Nun brauchen wir noch die Klasse "GeoData" wo die Informationen gespeichert werden und ausgelesen werden können:

      VB.NET-Quellcode

      1. Public Class GeoData
      2. #Region "Variablen"
      3. Dim _mCountry As String
      4. Dim _mCity As String
      5. Dim _mISP As String
      6. Dim _mRegion As String
      7. Dim _ip As String
      8. Dim _host As String
      9. Dim _breitengrad As String
      10. Dim _längengrad As String
      11. #End Region
      12. Public Sub New(ByVal Country As String, ByVal City As String, ByVal Region As String, ByVal IP As String, ByVal ISP As String, ByVal Host As String, ByRef Breitengrad As String, ByVal Längengrad As String)
      13. _mCity = City
      14. _mCountry = Country
      15. _mISP = ISP
      16. _mRegion = Region
      17. _ip = IP
      18. _host = Host
      19. _breitengrad = breitengrad
      20. _längengrad = längengrad
      21. End Sub
      22. #Region "Properties"
      23. Public ReadOnly Property Country() As String
      24. Get
      25. Return _mCountry
      26. End Get
      27. End Property
      28. Public ReadOnly Property City() As String
      29. Get
      30. Return _mCity
      31. End Get
      32. End Property
      33. Public ReadOnly Property Region() As String
      34. Get
      35. Return _mRegion
      36. End Get
      37. End Property
      38. Public ReadOnly Property ISP() As String
      39. Get
      40. Return _mISP
      41. End Get
      42. End Property
      43. Public ReadOnly Property IP() As String
      44. Get
      45. Return _ip
      46. End Get
      47. End Property
      48. Public ReadOnly Property Host() As String
      49. Get
      50. Return _host
      51. End Get
      52. End Property
      53. Public ReadOnly Property Breitengrad() As String
      54. Get
      55. Return _breitengrad
      56. End Get
      57. End Property
      58. Public ReadOnly Property Längengrad() As String
      59. Get
      60. Return _längengrad
      61. End Get
      62. End Property
      63. #End Region
      64. End Class


      Das Ganze als DLL erstellen (logisch).

      Dann in einem WinForm Projekt einen Verweis auf die DLL setzen.
      Möglicher Aufruf:

      VB.NET-Quellcode

      1. Dim Locator As New IPLocatorLib.GeoInfo
      2. Dim newData As IPLocatorLib.GeoData = Locator.Locate(Locator.GetCurrentIP)
      3. MessageBox.Show("Überprüfte IP: " & newData.IP & vbCrLf & "Land: " & newData.Country & vbCrLf _
      4. & "Region: " & newData.Region & vbCrLf & "Stadt: " & newData.City & vbCrLf & "Host: " & newData.Host & vbCrLf _
      5. & "ISP: " & newData.ISP & vbCrLf & "Längengrade: " & newData.Längengrad & vbCrLf & "Breitengrade: " & newData.Breitengrad)


      Vielen Dank fürs Lesen und für die Feedbacks und Rückmeldungen, die hoffentlich kommen werden ;)


      Gruss
      Pascal
      Irgendwie billig, das alles über eine Webseite ablaufen zu lassen.. Schade, hatte mich schon auf eine Lösung gefreut.

      EDIT: Außerdem, extra die ganze Webseite zu laden, nur um sie auszulesen?

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Beep!“ ()

      Wie willst du es sonst machen?
      Ich gebe zu, dass ich nicht so gut bin (oder nicht weiss wie), dass ich selber einen "Dienst" machen könnte, mit welchem man die IP lokalisieren kann.
      Das jedenfalls brauchbar und funktioniert ^^
      Aber es zwingt dich ja niemand, den Source zu benutzen ;)
      EDIT: Schau dir den Link mal genau an...
      Der einzige Inhalt von 'http://www.ip-adress.com/ip/' ist die eigentliche IP ;)
      Aber wie gesagt.. du brauchst es ja nicht zu verwenden...


      Gruss
      Pascal
      Nein ist schon ok ;)
      Ich habe einfach keine andere Möglichkeit gesehen. Zudem habe ich den Source eh nur erstellt, weil ich heute Zeit und Langeweile hatte.

      Wenn aber jemand eine Vereinfachung kennt, bzw eine evtl. bessere Seite für das Auslesen der IP kennt, kann das gerne posten.
      Ich bin immer bereit zu lernen...


      Gruss
      Pascal
      Ja bei mir stimmts auch nicht zu 100% (liegt eben an der Website).. Bei mir sinds etwa 15km.. Aber bei dir scheints etwas mehr zu sein..
      vermutlich sucht er sich den Hostserver raus (ISP)

      Aber wie gesagt.. Wenn jemand eine bessere Seite kennt, die genauer ist.. Nur her damit ;)


      Gruss
      Pascal
      Das mit dem Hostserver des ISP ist normal und "näher" geht auch nicht.

      ip.adress.com ist an sich sehr gut, läßt kostenlos aber nur 3 ipchecks pro Tag zu (25 nach Registrierung glaube ich, alles andere kostet dann Geld).

      Mir ist auch keine Möglichkeit bekannt das lokal praktikabel zu lösen da hier sehr große Datenbanken notwendig wären.

      Danke für den Skript, ist genau das was ich momentan suche.

      Gruß dem Namensvetter (Ich heiße auch Pascal, auch wenn es mein Nick nicht unbedingt erahnen lässt :D )
      Ja das trifft aber lediglich auf W-Lan zu, normalerweise ist beim Hostserver des ISP Schluss da der ja die IP vergibt.

      Wenn ich es mir recht überlege müsste das aber auch mit dem UMTS-Modul (oder halt Surfstick) im Laptop gehen, da hatte ich nämlich schon mal ne Webseite die mir auch relativ exakt meine Position anzeigte.
      hm also ich beschäftige mich mit VB erst seit ein paar Tagen, vorher habe ich mich eher Python oder Perl beschäftigt.

      Wenn ich jetzt aber die Klassenbibliothek angelegt habe und die 2 Klassen reinkopiere bekomme ich folgende Fehlermeldung

      Quellcode

      1. Fehler 1 Der Typ "Windows.Forms.WebBrowser" ist nicht definiert. C:\Users\JohnR\Documents\Visual Studio 2008\Projects\IPCheck\IPCheck\IpCheck.vb 23 27 IPCheck
      2. Fehler 2 Der Name "Windows" wurde nicht deklariert. C:\Users\JohnR\Documents\Visual Studio 2008\Projects\IPCheck\IPCheck\IpCheck.vb 25 36 IPCheck
      3. Fehler 3 "Windows" ist kein Member von "System". C:\Users\JohnR\Documents\Visual Studio 2008\Projects\IPCheck\IPCheck\IpCheck.vb 26 17 IPCheck


      liegt das daran das ich noch die 2008 Version von Visual Basic verwende ?

      Bringt nicht VB den Windows.Forms.WebBrowser standardmäßig mit ?

      So richtig verstehe ich das nicht :-/
      aber eine Frage hätte ich noch, auf die ich auch mit google nicht wirklich fündig geworden bin.

      Die Ausgabe ist original mit einer Messagebox gelöst

      Quellcode

      1. MessageBox.Show("Überprüfte IP: " & newData.IP & vbCrLf & "Land: " & newData.Country & vbCrLf _
      2. & "Region: " & newData.Region & vbCrLf & "Stadt: " & newData.City & vbCrLf & "Host: " & newData.Host & vbCrLf _
      3. & "ISP: " & newData.ISP & vbCrLf & "Längengrade: " & newData.Längengrad & vbCrLf & "Breitengrade: " & newData.Breitengrad)


      ich würde sie aber gern in einer Text oder Listbox ausgeben

      Quellcode

      1. Listbox1.Show("Überprüfte IP: " & newData.IP & vbCrLf & "Land: " & newData.Country & vbCrLf _
      2. & "Region: " & newData.Region & vbCrLf & "Stadt: " & newData.City & vbCrLf & "Host: " & newData.Host & vbCrLf _
      3. & "ISP: " & newData.ISP & vbCrLf & "Längengrade: " & newData.Längengrad & vbCrLf & "Breitengrade: " & newData.Breitengrad)


      Dabei bekomme ich aber diesen Fehler

      Quellcode

      1. Fehler 2 Zu viele Argumente für "Public Sub Show()". C:\Users\JohnR\Documents\Visual Studio 2008\Projects\IPCheck\WindowsApplication1\IpChecker.vb 12 23 WindowsApplication1


      Der Fehler ist ja recht selbsterklärend, aber wie löse ich das ganze denn ?

      Gruß John