PDA

Ver la Versión Completa : Ingresar login de un sitio web desde Delphi


Dark_Code
17-04-2018, 19:24:29
Hola a todos, quiero crear un Login en Delphi, para conectarse a un foro, llenando el Username y el Passaword en delphi, una ves ingresado los datos, que compruebe si existe esa cuenta, el foro es este: worldhack.net/profile/login/, en VB ocupan este codigo:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Using EnviarPara As New Net.WebClient
Dim Param As New Specialized.NameValueCollection
Param.Add("username_or_email-71", TextBox1.Text)
Param.Add("user_pass-71", TextBox2.Text)
Dim RespostaBytes As Byte() = EnviarPara.UploadValues("worldhack.net/profile/login/", "POST", Param)
Dim RespostaHTML As String = (New System.Text.UTF8Encoding).GetString(RespostaBytes)
If RespostaHTML.Contains("getNotificationsList") Then
Form2.Show()
End If
End Using
End Sub


End Class

Espero que me ayuden como hacer el login foro, o pasar ese codigo a delphi. Gracias de antemano

Neftali [Germán.Estévez]
18-04-2018, 09:02:30
Normalmente puedes hacerlo utilizando las Indy y su componente TIdHttp para realizar un post a la web con los parámetros que necesites.
En este hilo/Mensaje tienes un código de [dec] (https://www.clubdelphi.com/foros/showpost.php?p=152104&postcount=6) que se parece bastante a lo que necesitas. Se crea el componente, se pasan los parámetros y se envían con un POST.

De todas formas si haces una búsqueda en los foros, encontrarás otros hilos que hablan de temas similares porque es algo que ya hemos tratado en otras ocasiones:

http://www.clubdelphi.com/foros/showpost.php?p=165235&postcount=5
http://www.clubdelphi.com/foros/showpost.php?p=165286&postcount=12
http://www.clubdelphi.com/foros/showthread.php?t=37050
https://www.clubdelphi.com/foros/showthread.php?t=72881

Y aquí un mensaje mio de hace un tiempo (http://www.clubdelphi.com/foros/showthread.php?t=72067&highlight=IBPIndex)con una duda similar, donde puedes encontrar código y ejemplos, y la solución que otros compañeros me ayudaron a encontrar.

manelb
19-04-2018, 08:14:03
Saludos a todos y perdón por mi ignorancia en el tema:(...

Este sistema funcionaria con cualquier web donde se espera un valor y devuelve uno o varios resultados??

Mi caso concreto es el de la web del Ministerio de Agricultura donde se consulta el registro de un producto fitosanitario y devuelve el registro, el nombre del producto, la composición y el titular o fabricante de dicho producto.

La web es la siguiente (http://www.mapama.gob.es/es/agricultura/temas/sanidad-vegetal/productos-fitosanitarios/registro/productos/conregnom.asp)y un posible registro a consultar seria por ejemplo este: 11179

Hace unos meses me puse en contacto con el Ministerio de Agricultura para preguntar si había algún webservice donde poder realizar estas consultas y me respondieron que la única forma era a través del enlace que os he indicado y que debía consultarse directamente a través de la web.
Con este método que proponéis se podría solucionar, y el resultado seria similar a la utilización de un servicio web. Estoy diciendo alguna barbaridad??

Neftali [Germán.Estévez]
19-04-2018, 09:05:17
Pues basándote en los códigos que hemos puesto puedes hacerlo sin problemas.
Crea un formulario con 1 TButton y 2 TMemo.
Y utiliza el siguiente código:


procedure TForm2.Button2Click(Sender: TObject);
var
http: TIdHttp;
params: TStrings;
respuesta: string;
const
url = 'http://www.mapama.gob.es/es/agricultura/temas/sanidad-vegetal/productos-fitosanitarios/registro/productos/proexi.asp';
begin
http := TIdHTTP.Create(Self);
params := TStringList.Create;
try
params.Add('e=0');
params.Add('cod=11179');
params.Add('nom=');
respuesta := http.Post(url, params);
Memo2.Lines.Text := Respuesta;

BuscarDatosRespuestas(respuesta, '<span class="tabla_texto_normal" style="float:left;">', '</span>');
BuscarDatosRespuestas(respuesta, 'tit.asp?id=50000">', '</a>');

finally
http.Free;
params.Free;
end;
end;


Verás que el primer TMemo contiene el código HTML de la página de respuesta que necesitas.
A partir de ahí puedes hacer un parser simple conuna rutina como esta para obtener los datos que necesitas:


function TForm2.BuscarDatosRespuestas(ARespuesta:string; Tag1, Tag2:string):string;
var
str:String;
i, j:integer;
begin
repeat
i := AnsiPos(Tag1, ARespuesta);
if (i > 0) then begin
str := Copy(ARespuesta, (i + Length(Tag1)), Length(ARespuesta));
ARespuesta := Str;
j := AnsiPos(Tag2, Str);
if (j > 0) then begin
Str := Copy(Str, 1, j-1);
Memo1.Lines.Add(Str);
end;
end;
until (i = 0);
end;


Te adjunto el proyecto de ejemplo.

Dark_Code
19-04-2018, 17:31:25
;525734']Normalmente puedes hacerlo utilizando las Indy y su componente TIdHttp para realizar un post a la web con los parámetros que necesites.....

Hola, e utilizado este codigo para iniciar sesión del foro desde delphi, pero lo que pasa es que al loguearme osea poner el usuario y contraseña, no se puede conectar al servidor.

Este es el link del foro: worldhack.net/foro/login.php

MI CUENTA DEL FORO:
USUARIO: caaf95
CONTRASEÑA: clubdelphi

Ahi esta mi source, espero de tu ayuda a que pueda conectarme correctamente al foro desde delphi. Muchas Gracias de antemano.

Dark_Code
20-04-2018, 23:32:02
Hola a todos de esta comunidad, lo que estoy tratando de hacer es un login de un foro pero que se conecte mediante delphi. Pero al momento de probar, e ingresar mi cuenta registrada no se puede conectar. E probado varios codigos y no logro soluccionarlo.

El foro que quiero conectarme es este: worldhack.net/foro/login.php

Esta es mi cuenta registrada del foro:

USUARIO: caaf95
CONTRASEÑA: clubdelphi

Espero que me ayuden a soluccionarlo, se les agradece de antemano.

Casimiro Notevi
21-04-2018, 00:58:14
No repitas temas, continua en el que creaste.
He unido ambos hilos.
Lee nuestra guía de estilo (https://www.clubdelphi.com/foros/guiaestilo.php), gracias.

Dark_Code
23-04-2018, 05:54:42
Alguien que me ayude ? :(

Casimiro Notevi
23-04-2018, 10:05:45
Alguien que me ayude ? :(¿Cómo te ayudamos? tendrás que poner el código que estás usando, el problema exacto que tienes, etc.

Neftali [Germán.Estévez]
23-04-2018, 17:20:57
Esta es mi cuenta registrada del foro:

USUARIO: caaf95
CONTRASEÑA: clubdelphi


Estos datos no me dan acceso.
Error de usuario y/o contraseña incorrectos.

Dark_Code
23-04-2018, 17:33:33
;525824']Estos datos no me dan acceso.
Error de usuario y/o contraseña incorrectos.



Nueva Cuenta Registrada:

USUARIO: DarkCode99
CONTRASEÑA: clubdelphi

Foro: https://www.worldhack.net/foro/login.php


uses WinInet;

function URLEncode(Str: string): string;
var
i: integer;
begin
Result:= '';
for i:= 1 to Length(Str) do
if Str[i] in ['A'..'Z','a'..'z','0'..'9','-','_','.'] then
Result:= Result + Str[ i ]
else
Result:= Result + '%' + IntToHex(Ord(Str[ i ]),2);
end;

function SendRequest(Server, Uri: string; Port: Word; Params: TStringList;
Response: TStream): Boolean;
var
hNet: HINTERNET;
hCon: HINTERNET;
hReq: HINTERNET;
Context: DWORD;
Buffer: array[0..10240] of Char;
BytesRead: DWORD;
i: integer;
Str: String;
Success: Boolean;
begin
Context:= 0;
Result := FALSE;
hNet := InternetOpen('Agente', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if (hNet <> nil) then
begin
hCon:= InternetConnect(hNet,PChar(Server),Port,nil,nil,
INTERNET_SERVICE_HTTP,0,Context);
if (hCon <> nil) then
begin
if Params <> nil then
hReq:= HttpOpenRequest(hCon,'POST',PChar(Uri),nil,nil,nil,
INTERNET_FLAG_RELOAD,Context)
else
hReq:= HttpOpenRequest(hCon,'GET',PChar(Uri),nil,nil,nil,
INTERNET_FLAG_RELOAD,Context);
if (hReq <> nil) then
begin
if Params <> nil then
begin
Str:= Emptystr;
for i:= 0 to Params.Count - 1 do
Str:= Str + '&' + URLEncode(Params.Names[i]) + '=' +
URLEncode(Params.ValueFromIndex[i]);
Delete(Str,1,1);
Success:= HttpSendRequest(hReq,
'Content-Type: application/x-www-form-urlencoded',Cardinal(-1),
PChar(Str),Length(Str));
end else
Success:= HttpSendRequest(hReq,nil,0,nil,0);
if Success and (Response <> nil) then
try
while (InternetReadFile(hReq,@Buffer,sizeof(Buffer),BytesRead)) do
begin
if (BytesRead = 0) then
begin
Result := TRUE;
break;
end;
Response.Write(Buffer,BytesRead);
end;
except end;
InternetCloseHandle(hReq);
end;
InternetCloseHandle(hCon);
end;
InternetCloseHandle(hNet);
end;
end;

procedure TfrmMain.btn1Click(Sender: TObject);
var
Campos: TStringlist;
Respuesta: TStringStream;
begin
txtInfo.Clear;
Application.ProcessMessages;
txtUsuario.Text:= Trim(txtUsuario.Text);
txtPassword.Text:= Trim(txtPassword.Text);
if (txtUsuario.Text = EmptyStr) or (txtPassword.Text = EmptyStr) then
begin
txtInfo.Lines.Add('Introduce el nombre de usuario y contraseña');
Exit;
end;
Campos:= TStringList.Create;
Respuesta:= TStringStream.Create('');
try
Campos.Values['vb_login_username']:= txtUsuario.Text;
Campos.Values['vb_login_password']:= txtPassword.Text;
Campos.Values['do']:= 'login';
txtInfo.Lines.Add('Enviando usuario y contraseña');
if SendRequest('www.worldhack.net','/foro/login.php',80,Campos,Respuesta) then
begin
if Pos('Gracias',Respuesta.DataString) > 0 then
begin
FreeAndNil(Respuesta);
Respuesta:= TStringStream.Create('');
txtInfo.Lines.Add('Usuario Conectado Correctamente');
end else txtInfo.Lines.Add('El usuario o la contraseña no son validos');
end else txtInfo.Lines.Add('No puedo acceder al servidor');
finally
Campos.Free;
Respuesta.Free;
end;
end;

Ese codigo estoy que uso, pero lo que pasa es que al ingresar con mis datos ID y Password, no se puede conectar al foro.

bucanero
23-04-2018, 18:27:32
Hola a todos

si compruebas los campos que tiene el formulario HTML de ingreso, son algunos mas de los que tienes insertados en tu código, aquí abajo puedes ver las etiquetas que se envían, en el HTML de ingreso y que son las mismas que tu necesitas enviar por POST:

<form id="navbar_loginform" action="https://www.worldhack.net/foro/login.php?do=login" method="post" onsubmit="md5hash(vb_login_password, vb_login_md5password, vb_login_md5password_utf, 0)">
<input type="text" class="textbox default-value loginInput" name="vb_login_username" id="navbar_username" size="10" accesskey="u" tabindex="101" value="Usuario">
<input type="password" class="loginInput" tabindex="102" name="vb_login_password" id="navbar_password" size="10" style="display: none;">
<input type="text" class="loginInput" tabindex="102" name="vb_login_password_hint" id="navbar_password_hint" size="10" value="Contraseña" style="display: inline;">
<input type="image" src="images/styles/DeFraction/style/loginButton.png" tabindex="104" value="Iniciar sesión" title="Escribe tu nombre de usuario y contraseña en los campos para iniciar la sesión, o pulsa el botón 'registrarse' para crearte un perfil." accesskey="s">
<input type="checkbox" name="cookieuser" value="1" id="cb_cookieuser_navbar" class="cb_cookieuser_navbar" accesskey="c" tabindex="103">
<input type="hidden" name="s" value="">
<input type="hidden" name="securitytoken" value="guest">
<input type="hidden" name="do" value="login">
<input type="hidden" name="vb_login_md5password">
<input type="hidden" name="vb_login_md5password_utf">
</form>

Ademas la dirección a la que debes de enviar esa informacion con los correspondientes campos es la que esta en la etiqueta action del form "https://www.worldhack.net/foro/login.php?do=login", incluido el parámetro do=login que se pasa tanto por GET como por POST.

Aunque lo realmente "complicado" del acceso para esta pagina es que los campos securitytoken, vb_login_md5password y vb_login_md5password_utf seguramente se rellenen con una función javascript que llama el propio form antes de enviarse,

onsubmit="md5hash(vb_login_password, vb_login_md5password, vb_login_md5password_utf, 0)"

y que seguramente se encargue de codificar ciertos datos de una determinada manera. Por lo que debes de realizar tu también una función en DELPHI que te realice las mismas operaciones en esos respectivos campos.

Un saludo

Dark_Code
24-04-2018, 06:30:15
Hola a todos si compruebas los campos que tiene el formulario HTML de ingreso...

Entonces como seria el codigo para que se loguee perfectamente en delphi ?

bucanero
24-04-2018, 11:35:15
Cuando capturas la lista de campos que envía el formulario estos es los que se obtiene para establecer la conexión:
[vb_login_username] => DarkCode99
[vb_login_password] =>
[vb_login_password_hint] => clubdelphi
[x] => 74
[y] => 59
[s] =>
[securitytoken] => guest
[do] => login
[vb_login_md5password] => d41d8cd98f00b204e9800998ecf8427e
[vb_login_md5password_utf] => d41d8cd98f00b204e9800998ecf8427e

como ya te puse en mi anterior post, algunos de estos campos los ingresa o modifica el javascript que se ejecuta al enviar el formulario, y aquí no te puedo ayudar mucho mas por que el JAVASCRIPT lo desconozco, aunque aquí tienes el código por si deseas analizarlo

https://www.worldhack.net/foro/clientscript/vbulletin_md5.js?v=425

en cuanto a tu código suponiendo que se establezca bien la conexión SSL con el servidor, entonces deberías de añadir los campos faltantes:


function codificarPassword(const password:String):string;
begin
/// esta función debe hacer lo mismo que la función original de JAVASCRIPT.
if password='clubdelphi' then
/// para el password 'clubdelphi' el valor que retorna es este:
result := 'd41d8cd98f00b204e9800998ecf8427e'
else
result := 'aquí falta poner las funciones que hace la librería de JAVASCRIPT con el password';
end;

...
try
///estos son los campos que debes de insertar
Campos.Values['vb_login_username']:= txtUsuario.Text;
Campos.Values['vb_login_password']:= '';
Campos.Values['vb_login_password_hint'] := txtPassword.Text;
Campos.Values['x'] := '74';
Campos.Values['y'] := '59';
Campos.Values['s'] := '';
Campos.Values['securitytoken'] := 'guest';
Campos.Values['do'] := 'login';
Campos.Values['vb_login_md5password'] := CodificarPassword(txtPassword.Text);
Campos.Values['vb_login_md5password_utf'] := Campos.Values['vb_login_md5password'];

...
// aquí he modificado la URL de destino e importante: el puerto ha de ser SSL y por defecto es el 443, aunque dependiendo de la configuración del servidor pudiera se cualquier otro.
if SendRequest('www.worldhack.net','/foro/login.php?do=login', 443,Campos,Respuesta) then
begin
....
end;
finally
...
end;


Ya por ultimo no he podido probar todo esto por que ademas las credenciales a la pagina parecen no funcionar incluso ingresandolas a mano.

Un saludo

Neftali [Germán.Estévez]
24-04-2018, 17:28:46
Ya por ultimo no he podido probar todo esto por que ademas las credenciales a la pagina parecen no funcionar incluso ingresandolas a mano.


+1
Siguen sin funcionar.