如何在 Delphi 中获取外部(公共)IP

lokaqttq  于 2023-02-22  发布在  其他
关注(0)|答案(5)|浏览(295)

我需要得到我的外部(公共)IP地址从 Delphi 。
例如,与www.whatismyip.com显示的IP相同。
我该怎么做?Winsock不允许这样做。

mzillmmw

mzillmmw1#

您可以使用此网站:http://ipinfo.io/json。它以JSON返回有关当前Internet连接的信息。
在 Delphi 中,你需要这样使用IdHTTPIdHTTP1.Get('http://ipinfo.io/json'),它将返回一个包含所有数据的字符串。您可以使用您喜欢的JSON解释器,也可以使用lkJSON,如下所示:

json := TlkJSON.ParseText(MainEstrutura.IdHTTP1.Get('http://ipinfo.io/json')) as TlkJSONobject;

str := json.Field['ip'].Value;

希望能帮到你。

dgiusagp

dgiusagp2#

我不认为你可以。你可以打电话给一些服务,告诉你你的IP地址是什么,(例如:http://www.whatismyip.com/)并从响应中找出它。但我不认为你电脑上的任何东西能够告诉你你的IP地址对外界来说是什么样子的。
未经测试,但我认为你可以用印第做到这一点:

MyPublicIP := IdHTTP1.Get('http://automation.whatismyip.com/n09230945.asp');

请在以下位置查看规则/政策:http://www.whatismyip.com/faq/automation.asp之前使用这个。

a5g8bdjr

a5g8bdjr3#

这对我很有效:

uses JSON,IdHTTP;
  function GetIP():String;
  var  LJsonObj   : TJSONObject;
  str:string;
  http : TIdHttp;
  begin
    str:='';
    http:=TIdHTTP.Create(nil);
    try
        str:=http.Get('http://ipinfo.io/json');
        LJsonObj:= TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(str),0)           as TJSONObject;
        str := LJsonObj.Get('ip').JsonValue.Value;
        LJsonObj.Free;
        http.Free;
    Except
    end;
    result:=str;
end;
r55awzrz

r55awzrz4#

从记忆中,未经测试:

function GetMyHostAddress: string;
var
   http: IWinHttpRequest;
begin
   http := CreateOleObject('WinHttp.WinHttpRequest5.1') as IWinHttpRequest;
   http.Open('GET', 'http://automation.whatismyip.com/n09230945.asp', False);
   http.Send(EmptyParam);

   if http.StatusCode = 200 then
      Result := http.ResponseText
   else
      Result := '';
end;
mznpcxlj

mznpcxlj5#

Function GetMyIP:string;
var
  xmlhttp:olevariant;
  s,p:integer;
  temp:string;
begin
  result:=emptystr;
  xmlhttp:=CreateOleObject('Microsoft.XMLHTTP');
  try
    xmlhttp.open('GET', 'http://www.findipinfo.com/', false);
    xmlhttp.SetRequestHeader('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3');
    xmlhttp.send(null);
  except
    exit;
  end;
  if(xmlhttp.status = 200) then
  temp:=trim(VarToStr(xmlhttp.responseText));
  xmlhttp:=Unassigned;
  s:=pos('Address Is:',temp);
  if s>0 then
  inc(s,11)
  else
  exit;
  temp:=copy(temp,s,30);
  s:=pos('<',temp);
  if s=0 then exit
  else
  dec(s);
  result:=trim(copy(temp,1,s));
end;

相关问题