Get Adobe Flash player

¿Quién está en línea?

Hay 12 invitados y ningún miembro en línea

Donaciones

Ayudanos a mantener este sitio aportando una pequeña contribución

Clase para obtener nuestra Ip pública y actualizarla en nuestra cuenta DynDns con Delphi

Clase para actualizar la Ip de nuestra cuenta DynDns con Delphi

Si no tienes una cuenta dyndns, puedes registrarte aquí.

Puedes descargarte el proyecto aquí.

Esta clase utiliza el componente IdHTTP de los Indy:

unit ufDynDns;

interface

uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls,

WinInet,

//Indy components
IdBaseComponent,
IdComponent,
IdTCPConnection,
IdTCPClient,
IdHTTP;

type

//Datos necesarios para dyndns
TDynDnsData = record
UserName: string;
PassWord: string;
HostName: string;
NewIp: string;
wildcard: string;
mx: string;
backmx: string;
UserAgent: string;
ServicePort: integer;
BasicAuthentication: boolean;
ServiceHost: string;
ServiceUrl: string;
end;

//Clase DynDns
TDynDns = class
private
public
DynDnsData: TDynDnsData;
//Inicializa los datos DynDnsData
procedure InicializeDynDnsData();
//Actualiza la Ip de una cuenta DynDns. Devuelve true o false según si se realizó correctamente o no.
//http://www.dyndns.com/developers/specs/syntax.html
function Update_Ip(): boolean;
//lo que hace es decirnos nuestra IP pública conectando con el servidor dyndns.org y utiliza el componente
//Indy HTTP el cual leer el contenido del HTML
function Get_IP_Publica(): string;
constructor Create(); reintroduce;
destructor destroy; override;
end;

implementation

//Inicializa los datos DynDnsData
procedure TDynDns.InicializeDynDnsData();
begin
DynDnsData.UserName := '';
DynDnsData.PassWord := '';
DynDnsData.HostName := '';
DynDnsData.NewIp := '';
DynDnsData.wildcard := 'OFF';
DynDnsData.mx := '';
DynDnsData.backmx := 'NO';
DynDnsData.UserAgent := 'Mozilla/3.0';
DynDnsData.ServicePort := 80;
DynDnsData.BasicAuthentication := true;
DynDnsData.ServiceHost := 'members.dyndns.org';
DynDnsData.ServiceUrl := 'http://members.dyndns.org/nic/update?hostname=[hostname]&myip=[newip]&wildcard=[wildcard]&mx=[mx]&backmx=[backmx]';
end;
{ ---------------------------------------------------------------------------- }
//lo que hace es decirnos nuestra IP pública conectando con el servidor dyndns.org y utiliza el componente Indy HTTP el cual leer el contenido del HTML
function TDynDns.Get_IP_Publica(): string;

const
UrlCheckIp = 'http://checkip.dyndns.org/';

function EsNumerico( S: string ): Boolean;
begin
Result := false;

if ( Length( S ) > 0 ) then
case S[1] of
'0'..'9': Result := True;
end;
end;

var
HTMLBody: string;
i: Integer;
IdHTTP: TIdHTTP;
begin
Result := '';

// ¿Estamos conectados a Internet?
if WinInet.InternetGetConnectedState( nil, 0 ) then
begin
IdHTTP := TIdHTTP.Create( Application );

try
HTMLBody := IdHTTP.Get( UrlCheckIp );

for i := 0 to Length( HTMLBody ) - 1 do
begin
if EsNumerico( HTMLBody[i] ) or ( HTMLBody[i] = '.' ) then
Result := Result + HTMLBody[i];
end;

finally
IdHTTP.Free;
end;
end;
end;
{ ---------------------------------------------------------------------------- }
//Actualiza la Ip de una cuenta DynDns. Devuelve true o false según si se realizó correctamente o no.
function TDynDns.Update_Ip(): boolean;
var
Http: TIdHTTP;
Resp: boolean;
Url, RespStr: string;
PosGood, PosNochg: integer;
begin
Resp := false;

Url := DynDnsData.ServiceUrl;
Url := StringReplace(Url, '[hostname]', DynDnsData.HostName, [rfReplaceAll]);
Url := StringReplace(Url, '[newip]', DynDnsData.NewIp, [rfReplaceAll]);
Url := StringReplace(Url, '[wildcard]', DynDnsData.wildcard, [rfReplaceAll]);
Url := StringReplace(Url, '[mx]', DynDnsData.mx, [rfReplaceAll]);
Url := StringReplace(Url, '[backmx]', DynDnsData.backmx, [rfReplaceAll]);

Http := TIdHTTP.Create(nil);

Http.Port := DynDnsData.ServicePort;
http.ProtocolVersion := pv1_1;
Http.Request.Username := DynDnsData.UserName;
Http.Request.Password := DynDnsData.PassWord;
HTTP.Request.UserAgent := DynDnsData.UserAgent;
Http.Request.Host := DynDnsData.ServiceHost;
Http.Request.BasicAuthentication := DynDnsData.BasicAuthentication;

try
try
RespStr := HTTP.Get(Url);

PosGood := pos('good', lowercase(RespStr)); //Actualizada la IP.
PosNochg := pos('nochg', lowercase(RespStr)); //Ya tenía la misma IP, por lo tanto esta actualizada.

if ( (PosGood > 0) or (PosNochg > 0) ) then
begin
Resp := true;
end;
except
{on e:exception do
begin
ShowMessage(e.Message);
end;}
end;
finally
HTTP.Free;
result := Resp;
end;
end;
{ ---------------------------------------------------------------------------- }
//Al crear la clase
constructor TDynDns.Create();
begin
inherited create;

//Inicializa los datos DynDnsData
InicializeDynDnsData();
end;
{ ---------------------------------------------------------------------------- }
//Al destruirse la clase
destructor TDynDns.destroy;
begin

inherited;
end;
{ ---------------------------------------------------------------------------- }
initialization

finalization

end.
{ ---------------------------------------------------------------------------- }

EJEMPLO DE USO DE LA CLASE:

Creamos un nuevo proyecto con un formulario, y añadimos:
  1. La clase "ufDynDns" en el uses de la unidad.
  2. Añadimos un botón con el siguiente evento:
procedure TForm1.Button1Click(Sender: TObject);
var
Ip: string;
DynDns: TDynDns;
begin

DynDns := TDynDns.create();

try

//Obtenemos la IP pública del Pc
Ip := DynDns.Get_IP_Publica();

//Inicializa la configuración para actualizar la IP dinámica en DynDns
DynDns.InicializeDynDnsData();

//Configura los datos para actualizar la IP dinámica en DynDns
with (DynDns.DynDnsData) do
begin
UserName := 'Pruebas'; //Usuario de la cuenta DynDns
PassWord := '1234'; //Contraseña del usuario de la cuenta DynDns
HostName := 'pepe.dyndns.org'; //Dominio a actualizar la IP en DynDns
NewIp := Ip; //IP del dominio en DynDns
end;

//Actualizar la IP dinámica en DynDns
DynDns.Update_Ip();
finally
DynDns.free();
end;
end;