Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ingresar login de un sitio web desde Delphi (https://www.clubdelphi.com/foros/showthread.php?t=93014)

Dark_Code 17-04-2018 19:24:29

Ingresar login de un sitio web desde Delphi
 
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:
Código Delphi [-]
worldhack.net/profile/login/
, en VB ocupan este codigo:

Código:

    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] 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/show...35&postcount=5
http://www.clubdelphi.com/foros/show...6&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 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 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

1 Archivos Adjunto(s)
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:

Código Delphi [-]
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, '', '');
    BuscarDatosRespuestas(respuesta, 'tit.asp?id=50000">', '');

  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:

Código Delphi [-]
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

1 Archivos Adjunto(s)
Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 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:
Código Delphi [-]
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

Ingresar login de un sitio web desde Delphi
 
1 Archivos Adjunto(s)
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:
Código Delphi [-]
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, gracias.

Dark_Code 23-04-2018 05:54:42

Alguien que me ayude ? :(

Casimiro Notevi 23-04-2018 10:05:45

Cita:

Empezado por Dark_Code (Mensaje 525816)
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

Cita:

Empezado por Dark_Code (Mensaje 525793)
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

1 Archivos Adjunto(s)
Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 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


Código Delphi [-]
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:

Código:

<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,
Código:

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

Cita:

Empezado por bucanero (Mensaje 525827)
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:
Código:

    [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/clien...n_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:

Código Delphi [-]
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

Cita:

Empezado por bucanero (Mensaje 525840)
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.


La franja horaria es GMT +2. Ahora son las 01:28:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi