Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Whois from IP-Adresse? (https://www.delphipraxis.net/197489-whois-ip-adresse.html)

PeterPanino 9. Aug 2018 21:48

Whois from IP-Adresse?
 
Was ist die einfachste Methode, um Informationen über eine bestimmte IP-Adresse im Internet zu erhalten?

Zacherl 9. Aug 2018 22:06

AW: Whois from IP-Adresse?
 
Was für Informationen benötigst/erwartest du denn? Außer dem Provider und evtl. einem ungefähren Standort, bekommt man meistens nicht viel raus (ausgehend davon, dass es sich um eine private IP handelt). Im Falle eines Servers, besteht ua. noch die Möglichkeit die Domains zu ermitteln, die auf diese Adresse verweisen und darüber ggfls. einen Inhaber.

KodeZwerg 9. Aug 2018 22:43

AW: Whois from IP-Adresse?
 
Für Zacherl zweiteres wäre hier eine Anlaufstelle: https://www.denic.de/

PeterPanino 9. Aug 2018 23:03

AW: Whois from IP-Adresse?
 
Zitat:

Zitat von Zacherl (Beitrag 1410271)
Was für Informationen benötigst/erwartest du denn? Außer dem Provider und evtl. einem ungefähren Standort, bekommt man meistens nicht viel raus (ausgehend davon, dass es sich um eine private IP handelt). Im Falle eines Servers, besteht ua. noch die Möglichkeit die Domains zu ermitteln, die auf diese Adresse verweisen und darüber ggfls. einen Inhaber.

Ich habe eine Liste, bei der in einer Spalte IP-Adressen aufgelistet sind. Ich würde nun gerne in einer zusätzlichen Spalte eine kurze Zusatzinformation zur jeweiligen IP-Adresse anzeigen. Als zusätzliche Option könnte man in einem Zusatzfenster eine Landkarte mit der geographischen Position anzeigen, wenn man auf einen Listeneintrag klickt.

KodeZwerg 9. Aug 2018 23:22

AW: Whois from IP-Adresse?
 
Also so etwas wie hier?

PeterPanino 9. Aug 2018 23:39

AW: Whois from IP-Adresse?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1410279)
Also so etwas wie hier?

Ja, das sieht sehr gut aus!

Ich habe irgendwo diesen Code gefunden:

Delphi-Quellcode:
uses
  IdWinsock2;

function IPAddrToName(IPAddr: string): string;
var
  SockAddrIn: TSockAddrIn;
  HostEnt: PHostEnt;
  WSAData: TWSAData;
begin
  WSAStartup($101, WSAData);
  SockAddrIn.sin_addr.s_addr := inet_addr(PAnsiChar(IPAddr));
  HostEnt := GetHostByAddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
  if HostEnt <> nil then
    Result := StrPas(Hostent^.h_name)
  else
    Result := '';
end;

procedure TForm3.btnGetHostNameClick(Sender: TObject);
begin
  Self.Caption := IPAddrToName(edtIpAddress.Text);
end;
Aber ich kriege damit diese Fehlermeldung:

Zitat:

---------------------------
Gethostnamefromipaddress
---------------------------
Error on call to Winsock2 library function WSAStartup: Die Anwendung hat die Funktion WSAStartup nicht aufgerufen, oder bei dieser Funktion ist ein Fehler aufgetreten.
---------------------------
OK
---------------------------

KodeZwerg 9. Aug 2018 23:59

AW: Whois from IP-Adresse?
 
Ich hätte in C# Code von SO für genau das was Du möchtest, nehme ich mal an. Hier wird per Api auf http://ip-api.com/ zugegriffen um an Daten zu kommen.
Hier der Code
Code:
public class IpProperties
    {
        public string Status { get; set; }
        public string Country { get; set; }
        public string CountryCode { get; set; }
        public string Region { get; set; }
        public string RegionName { get; set; }
        public string City { get; set; }
        public string Zip { get; set; }
        public string Lat { get; set; }
        public string Lon { get; set; }
        public string TimeZone { get; set; }
        public string ISP { get; set; }
        public string ORG { get; set; }
        public string AS { get; set; }
        public string Query { get; set; }
    }
 public string IPRequestHelper(string url)
    {
        HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();

        StreamReader responseStream = new StreamReader(objResponse.GetResponseStream());
        string responseRead = responseStream.ReadToEnd();

        responseStream.Close();
        responseStream.Dispose();

        return responseRead;
    }

    public IpProperties GetCountryByIP(string ipAddress)
    {
        string ipResponse = IPRequestHelper("http://ip-api.com/xml/" + ipAddress);
        using (TextReader sr = new StringReader(ipResponse))
        {
            using (System.Data.DataSet dataBase = new System.Data.DataSet())
            {
                IpProperties ipProperties = new IpProperties();
                dataBase.ReadXml(sr);
                ipProperties.Status = dataBase.Tables[0].Rows[0][0].ToString();
                ipProperties.Country = dataBase.Tables[0].Rows[0][1].ToString();
                ipProperties.CountryCode = dataBase.Tables[0].Rows[0][2].ToString();
                ipProperties.Region = dataBase.Tables[0].Rows[0][3].ToString();
                ipProperties.RegionName = dataBase.Tables[0].Rows[0][4].ToString();
                ipProperties.City = dataBase.Tables[0].Rows[0][5].ToString();
                ipProperties.Zip = dataBase.Tables[0].Rows[0][6].ToString();
                ipProperties.Lat = dataBase.Tables[0].Rows[0][7].ToString();
                ipProperties.Lon = dataBase.Tables[0].Rows[0][8].ToString();
                ipProperties.TimeZone = dataBase.Tables[0].Rows[0][9].ToString();
                ipProperties.ISP = dataBase.Tables[0].Rows[0][10].ToString();
                ipProperties.ORG = dataBase.Tables[0].Rows[0][11].ToString();
                ipProperties.AS = dataBase.Tables[0].Rows[0][12].ToString();
                ipProperties.Query = dataBase.Tables[0].Rows[0][13].ToString();

                return ipProperties;
            }
        }
    }
und so wird es aufgerufen:
Delphi-Quellcode:
var ipResponse = GetCountryByIP("your ip address or domain name");


edit
Nachtrag:
Besuche mal den Link von oben und klicke auf "API documentation"
Dort klicke auf "Newline Separated".
Ein simpler GET Aufruf und gut ist. Beispiele werden dort beschrieben.
Limits < 150 Requests per Minute. Das musst Du beachten und für Kommerzielle Zwecke ohne Lizenz verboten.

PeterPanino 10. Aug 2018 06:47

AW: Whois from IP-Adresse?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1410281)
Ich hätte in C# Code von SO für genau das was Du möchtest, nehme ich mal an. Hier wird per Api auf http://ip-api.com/ zugegriffen um an Daten zu kommen.

Danke für den Link. Wäre es nicht noch einfacher, einfach die obige Website aufzurufen, indem man einfach die Adresse zusammensetzt aus 'http://ip-api.com/#' + IPAdresseStr und diese entweder im Browser oder in einer VCL HTML-Komponente aufruft?

KodeZwerg 10. Aug 2018 07:19

AW: Whois from IP-Adresse?
 
Kommt halt auf das an was man bezwecken möchte, mit dem GET Aufruf hast Du halt alle Informationen zum selber verarbeiten.
Wenn man das alles in eine StringList zum Beispiel pumpt, kann man, da #1-#14 fest vorgegeben ist, auch dementsprechend die StringList abrufen/interpretieren. Um es wie im Thread vorgegeben war in eine ListBox/ListView zu schreiben wäre das die einfachste Methode.

Natürlich kann man auch das ganze in einer WebBrowser Komponente direkt abfragen lassen, die Ergebnisse würden auf diese Weise auch mehr solcher Dienste verfügbar machen, die halt keine Api anbieten, aber ob Du den Output dann als ListBox/ListView verwenden kannst mag ich erstmal als exotisch betrachten, soll nicht bedeuten das es nicht machbar wäre.

PeterPanino 10. Aug 2018 07:32

AW: Whois from IP-Adresse?
 
Ich kriege mit diesem Code eine Menge "chinesische Zeichen":

Delphi-Quellcode:
uses
  Winapi.WinInet;

function GetUrlContent(const Url: string): string;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1024] of Char;
  BytesRead: dWord;
begin
  Result := '';
  NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

  if Assigned(NetHandle) then
  begin
    UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);

    if Assigned(UrlHandle) then { UrlHandle valid? Proceed with download }
    begin
      FillChar(Buffer, SizeOf(Buffer), 0);
      repeat
        Result := Result + Buffer;
        FillChar(Buffer, SizeOf(Buffer), 0);
        InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
      until BytesRead = 0;
      InternetCloseHandle(UrlHandle);
    end
    else
      { UrlHandle is not valid. Raise an exception. }
      raise Exception.CreateFmt('Cannot open URL %s', [Url]);

    InternetCloseHandle(NetHandle);
  end
  else
    { NetHandle is not valid. Raise an exception }
    raise Exception.Create('Unable to initialize Wininet');
end;

procedure TForm3.btnGetHostNameClick(Sender: TObject);
var
  ThisLines: string;
begin
  ThisLines := GetUrlContent('http://ip-api.com/line/' + edtIpAddress.Text);
  CodeSite.Send('TForm3.btnGetHostNameClick: ThisLines', ThisLines);
end;

PeterPanino 10. Aug 2018 07:36

AW: Whois from IP-Adresse?
 
Fehler gefunden: Buffer muss AnsiChar sein!

KodeZwerg 10. Aug 2018 07:39

AW: Whois from IP-Adresse?
 
So sollte es funktionieren, Uses anpassen (ich nutze D2009 ^_^)
Delphi-Quellcode:
uses WinInet;

function GetUrlContent(const Url: string): UTF8String;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1023] of byte;
  BytesRead: dWord;
  StrBuffer: UTF8String;
begin
  Result := '';
  NetHandle := InternetOpen('Delphi 2009', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(NetHandle) then
    try
      UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
      if Assigned(UrlHandle) then
        try
          repeat
            InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
            SetString(StrBuffer, PAnsiChar(@Buffer[0]), BytesRead);
            Result := Result + StrBuffer;
          until BytesRead = 0;
        finally
          InternetCloseHandle(UrlHandle);
        end
      else
        raise Exception.CreateFmt('Cannot open URL %s', [Url]);
    finally
      InternetCloseHandle(NetHandle);
    end
  else
    raise Exception.Create('Unable to initialize Wininet');
end;

KodeZwerg 10. Aug 2018 07:42

AW: Whois from IP-Adresse?
 
Zitat:

Zitat von PeterPanino (Beitrag 1410290)
Fehler gefunden: Buffer muss AnsiChar sein!

Mein Vorschlag beinhaltet beides, Ascii GET Content sowie UTF8. Also UTF8 wäre kompatibel zu beiden will ich damit sagen. Ist mehr 'ne universelle Lösung.

PeterPanino 10. Aug 2018 07:59

AW: Whois from IP-Adresse?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1410291)
Uses anpassen

Winapi.WinInet = WinInet?

KodeZwerg 10. Aug 2018 08:01

AW: Whois from IP-Adresse?
 
Wahrscheinlich Ja.:thumb:

Also bei Dir mit dem Winapi Namespace bei mir ohne.

PeterPanino 10. Aug 2018 08:15

AW: Whois from IP-Adresse?
 
Funktioniert ausgezeichnet. Danke!

KodeZwerg 10. Aug 2018 08:21

AW: Whois from IP-Adresse?
 
Gern geschehen, in der Repeat Schleife könntest Du das ganze auch in eine StringList ausgeben lassen um auf #1-#14 einzeln zugreifen zu können, aber mach wie Du magst, jetzt weißt Du ja wie es funktioniert :wink:

KodeZwerg 10. Aug 2018 11:24

AW: Whois from IP-Adresse?
 
So habe ich es nun bei mir, um noch mehr Informationen zu erhalten.
Delphi-Quellcode:
type
  ApiResults = record
    Status: UTF8String;
    Country: UTF8String;
    CountryCode: UTF8String;
    RegionState: UTF8String;
    RegionName: UTF8String;
    City: UTF8String;
    Zip: UTF8String;
    Latitude: UTF8String;
    Longitude: UTF8String;
    CityTimeZone: UTF8String;
    ISP: UTF8String;
    Organization: UTF8String;
    NumberName: UTF8String;
    DNS: UTF8String;
    MobileConnection: UTF8String;
    ProxyConnection: UTF8String;
    QueryIP: UTF8String;
    ErrorMessage: UTF8String;
  end;

function GetUrlContentData(const Url: string): UTF8String;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1023] of byte;
  BytesRead: dWord;
  StrBuffer: UTF8String;
begin
  Result := '';
  NetHandle := InternetOpen('Delphi 2009', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(NetHandle) then
    try
      UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
      if Assigned(UrlHandle) then
        try
          repeat
            InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
            SetString(StrBuffer, PAnsiChar(@Buffer[0]), BytesRead);
            Result := Result + StrBuffer;
          until BytesRead = 0;
        finally
          InternetCloseHandle(UrlHandle);
        end
      else
        raise Exception.CreateFmt('Cannot open URL %s', [Url]);
    finally
      InternetCloseHandle(NetHandle);
    end
  else
    raise Exception.Create('Unable to initialize Wininet');
end;

function GetUrlContent(const Url: string): ApiResults;
begin
  Result.Status := GetUrlContentData(Url+'?fields=status');
  if Pos('fail', LowerCase(Result.Status)) > 0 then
  begin
    Result.ErrorMessage := GetUrlContentData(Url+'?fields=message');
    Result.QueryIP := GetUrlContentData(Url+'?fields=query');
  end
  else
  begin
    Result.Country := GetUrlContentData(Url+'?fields=country');
    Result.CountryCode := GetUrlContentData(Url+'?fields=countryCode');
    Result.RegionState := GetUrlContentData(Url+'?fields=region');
    Result.RegionName := GetUrlContentData(Url+'?fields=regionName');
    Result.City := GetUrlContentData(Url+'?fields=city');
    Result.Zip := GetUrlContentData(Url+'?fields=zip');
    Result.Latitude := GetUrlContentData(Url+'?fields=lat');
    Result.Longitude := GetUrlContentData(Url+'?fields=lon');
    Result.CityTimeZone := GetUrlContentData(Url+'?fields=timezone');
    Result.ISP := GetUrlContentData(Url+'?fields=isp');
    Result.Organization := GetUrlContentData(Url+'?fields=org');
    Result.NumberName := GetUrlContentData(Url+'?fields=as');
    Result.DNS := GetUrlContentData(Url+'?fields=reverse');
    Result.MobileConnection := GetUrlContentData(Url+'?fields=mobile');
    Result.ProxyConnection := GetUrlContentData(Url+'?fields=proxy');
    Result.QueryIP := GetUrlContentData(Url+'?fields=query');
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ThisLines: ApiResults;
begin
  ThisLines := GetUrlContent('http://ip-api.com/line/' + 'ip-api.com');
  Memo1.Lines.Add('Status: '+ThisLines.Status);
  if Pos('fail', LowerCase(ThisLines.Status)) > 0 then
   begin
     Memo1.Lines.Add('ErrorMessage: '+ThisLines.ErrorMessage);
     Memo1.Lines.Add('QueryIP: '+ThisLines.QueryIP);
   end
   else
   begin
     Memo1.Lines.Add('Country: '+ThisLines.Country);
     Memo1.Lines.Add('CountryCode: '+ThisLines.CountryCode);
     Memo1.Lines.Add('RegionState: '+ThisLines.RegionState);
     Memo1.Lines.Add('RegionName: '+ThisLines.RegionName);
     Memo1.Lines.Add('City: '+ThisLines.City);
     Memo1.Lines.Add('Zip: '+ThisLines.Zip);
     Memo1.Lines.Add('Latitude: '+ThisLines.Latitude);
     Memo1.Lines.Add('Longitude: '+ThisLines.Longitude);
     Memo1.Lines.Add('CityTimeZone: '+ThisLines.CityTimeZone);
     Memo1.Lines.Add('ISP: '+ThisLines.ISP);
     Memo1.Lines.Add('Organization: '+ThisLines.Organization);
     Memo1.Lines.Add('NumberName: '+ThisLines.NumberName);
     Memo1.Lines.Add('DNS: '+ThisLines.DNS);
     Memo1.Lines.Add('MobileConnection: '+ThisLines.MobileConnection);
     Memo1.Lines.Add('ProxyConnection: '+ThisLines.ProxyConnection);
     Memo1.Lines.Add('QueryIP: '+ThisLines.QueryIP);
   end;
end;

KodeZwerg 10. Aug 2018 22:05

AW: Whois from IP-Adresse?
 
Wenn Du die Funktion GetUrlContent() hiermit ersetzt ist/zählt es als nur 1 Internet-Abruf.
Delphi-Quellcode:
function GetUrlContent(const Url: string): ApiResults;
var
  tmp: UTF8String;
  sl: TStrings;
begin
  tmp := GetUrlContentData(Url+'?fields=status,country,countryCode,region,regionName,city,zip,lat,lon,timezone,isp,org,as,reverse,mobile,proxy,query,message');
  try
    sl := TStringList.Create;
    sl.Text := tmp;
    Result.Status := sl[0];
    if Pos('fail', LowerCase(Result.Status)) > 0 then
      begin
        Result.ErrorMessage := sl[1];
        Result.QueryIP := sl[2];
      end
      else
      begin
        Result.Country := sl[1];
        Result.CountryCode := sl[2];
        Result.RegionState := sl[3];
        Result.RegionName := sl[4];
        Result.City := sl[5];
        Result.Zip := sl[6];
        Result.Latitude := sl[7];
        Result.Longitude := sl[8];
        Result.CityTimeZone := sl[9];
        Result.ISP := sl[10];
        Result.Organization := sl[11];
        Result.NumberName := sl[12];
        Result.DNS := sl[13];
        Result.MobileConnection := sl[14];
        Result.ProxyConnection := sl[15];
        Result.QueryIP := sl[16];
      end;
  finally
    sl.Free;
    tmp := '';
  end;
end;
Viel Spaß damit.

daliksc 30. Okt 2019 15:34

AW: Whois from IP-Adresse?
 
Zitat:

Zitat von PeterPanino (Beitrag 1410269)
Was ist die einfachste Methode, um Informationen über eine bestimmte IP-Adresse im Internet zu erhalten?


Hier findet man informationen über eine IP-Adresse wie Land, Region, stadt, Postleitzahl, Latitude , Longitude
usw...

https://iplocationfinder.net


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz