DonationCoder.com forum
 
Read-only archive. This is a static copy of the DonationCoder.com forum. Reading and searching work as before; logging in, posting and private messages do not.
Archive of 2026-10-21 · About this archive · Main site

Author Topic: Feature Request: IP Info for URL Snooper  (Read 10,491 times)

KodeZwerg

  • Honorary Member
  • Joined in 2018
  • **
  • Posts: 718
    • Participated in NANY Challenge Four Times
    • Coding Snacks
Feature Request: IP Info for URL Snooper
« on: August 12, 2018, 08:49 PM »
Feature Request: IP Info for URL Snooper

If you have time to implement in the Context Menu of URLs a "Show IP Info" resulting in a tiny Window showing some lines of text, that would be nice.
http://ip-api.com offers a free web-api to fullfill such request. One of many, theres api-documention that explain all.

I could provide working Delphi Code if it helps to see what i miss.
If you do not like that idea it is okay aswell.

Thanks in advance. :Thmbsup:

KodeZwerg

  • Honorary Member
  • Joined in 2018
  • **
  • Posts: 718
    • Participated in NANY Challenge Four Times
    • Coding Snacks
Re: Feature Request: IP Info for URL Snooper
« Reply #1 on: August 12, 2018, 10:01 PM »
Here is some Demo Code to show you what i like to have as a result. I commented things a bit to understand what i do.
Code: ( delphi)
uses WinInet;

// here i define a record to hold information
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;

// this is an api function call to perform GET, optimized to handle ASCII or UNICODE data
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;

// in here the main work is done, input will be splitted up to prior defined fields of record
function GetUrlContent(const Url: string): ApiResults;
var
  tmp: UTF8String;
  sl: TStrings;
begin
// api offers XML and other stuff, but LINE needs no anything, just a stringlist :)
// by manual calling desired fields you get more informations, so i add them all in here
  tmp := GetUrlContentData(Url+'?fields=status,country,countryCode,region,regionName,city,zip,lat,lon,timezone,isp,org,as,reverse,mobile,proxy,query,message');
// the field "reverse" aka DNS-resolver consumes most of inet time, you may add option on/off for this feature
  try
    sl := TStringList.Create;
    sl.Text := tmp;
// by reading api i figured out how results could be
// first received line will be "status", so i add it to its proper record field
    Result.Status := sl[0];
// now i compare if "status" contain "fail" to set up later received lines correct
// feel free to use it as template
    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];
// the field "reverse" aka DNS-resolver consumes most of inet time, you may add option on/off for this feature
        Result.DNS := sl[13];
        Result.MobileConnection := sl[14];
        Result.ProxyConnection := sl[15];
        Result.QueryIP := sl[16];
      end;
  finally
    sl.Free;
    tmp := '';
  end;
end;

// here comes what GUI perform
procedure TForm1.Button1Click(Sender: TObject);
var
// in here all results are local stored
  ThisLines: ApiResults;
begin
// after reading api, i choosed smallest method to perform the GET and qualify results, the LINE variant
// replace the second 'ip-api.com' with target IP/Domain, this is just example
  ThisLines := GetUrlContent('http://ip-api.com/line/' + 'ip-api.com');
// Memo1 is a Delphi Control to draw text
  Memo1.Lines.Add('Status: '+ThisLines.Status);
// determine what record type we have, "fail" or "success"
  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;
« Last Edit: August 12, 2018, 11:30 PM by KodeZwerg »

KodeZwerg

  • Honorary Member
  • Joined in 2018
  • **
  • Posts: 718
    • Participated in NANY Challenge Four Times
    • Coding Snacks
Re: Feature Request: IP Info for URL Snooper
« Reply #2 on: August 27, 2018, 02:50 PM »
*push up in hope of any answer*

mouser

  • First Author
  • Administrator
  • Joined in 2005
  • *****
  • Posts: 40,931
    • Gathering Badge
    • Plugin Coding Medal
    • Participated in NANY Challenge Seventeen Times
    • Cody Award
    • Coding Snacks
    • Volunteers/Staff
Re: Feature Request: IP Info for URL Snooper
« Reply #3 on: August 27, 2018, 07:35 PM »
Seems like it would be pretty easy to do.. I could add it.. I wonder if it would be better to have it show the info in a pop up, or have a right-click context menu item to open a web page for the ip address at a site like http://ip-api.com? ; Thoughts?

KodeZwerg

  • Honorary Member
  • Joined in 2018
  • **
  • Posts: 718
    • Participated in NANY Challenge Four Times
    • Coding Snacks
Re: Feature Request: IP Info for URL Snooper
« Reply #4 on: August 27, 2018, 09:54 PM »
In my own creations i pop up a Window wich just have one EditBox (readonly/to Copy things to Clipboard) inside, for myself i prefer it that way instead of loading any Huge WebBrowser.

But hey, why not SubMenu to offer both?  Just my little opinion. For myself, i would use the editbox popup.

Thanks in advance!


edit
Or a Two-In-One Thing, get Info from site, if Status = "false" offer to open in browser else popup Window?
« Last Edit: August 28, 2018, 03:28 PM by KodeZwerg »

Original address: https://www.donationcoder.com/forum/index.php?topic=45978.0