Заметки · 20.10.2023

Какой там у меня IP?

Ранее я уже рассказывал как с помощью пары отличных сервисов, жонглируя PowerShell, можно получить свой внешний ip-адрес и повыуживать про него всякие интересности.

Сейчас попробуем получить свой внешний IP в проекте IDE Lazarus. Для этого вооружимся API двух замечательных сервисов: ipify.org и seeip.org. Один сервис будет основным, а второй резервным.

Обращаться к API будем с помощью модулей fphttpclient и opensslsockets.

Перед тем, как начинать работу с любым внешним сервисом — следует проверить существует ли подключение к сети. Для этого воспользуемся WinInet и спросим каков статус подключения. Если вернулось True — обращаемся к сайту.

uses ..., sysutils, windows, wininet, fphttpclient, opensslsockets, ...;

function GetExtIP:string;
var
  temp: string;
  contypes: DWORD;
  status: boolean;
const
  ipify='https://api.ipify.org/';
  seeip='https://api.seeip.org/';
begin
  contypes:=INTERNET_CONNECTION_MODEM
            + INTERNET_CONNECTION_LAN
            + INTERNET_CONNECTION_PROXY;
  status:=InternetGetConnectedState(@contypes, 0);
  if status=True then
     try
       temp:=TFPHTTPClient.simpleGet(ipify);
       if temp='' then temp:=TFPHTTPClient.simpleGet(seeip);
       result:=temp;
     except result:='Не удалось определить внешний IP адрес!';
     end
  else result:='Нет соединения с сетью Интернет!';
end;

Если всё пойдёт хорошо, GetExtIP вернёт строку с IP адресом. В дебрях кода функцию можно использовать, например, вот так:

...
var 
  myip: string;
...
myip:=GetExtIP;

Разумеется, из-за использования WinInet можно забыть про кроссплатформенность.

Для полноценной работы потребуются библиотеки OpenSSL. Можете подключить к проекту этот модуль для автоматического развёртывания библиотек из файла ресурсов.