Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Descargar parte de una web (https://www.clubdelphi.com/foros/showthread.php?t=34666)

Emilio 17-08-2006 12:47:44

Descargar parte de una web
 
Hola,

Necesito realizar la descarga de cierto texto de una web.

Pongo un ejemplo:

Tengo las url de todas las páginas que quiero descargar...

http://www.fabricante-pepe.com/artic...eferencia=1000
http://www.fabricante-pepe.com/artic...eferencia=1001
http://www.fabricante-pepe.com/artic...eferencia=1002

Si cargamos una de esas supuestas urls, obtenemos una página web con mucho html, mucho texto, muchas imágenes etc...

El texto que me interesa se encuentra ubicado entre dos etiquetas HTML concretas

<textarea name="algo">Este es el texto que quiero capturar</textarea>

¿alguna sugerencia de cómo puedo capturar ese texto?

Gracias de antemano.

Bicho 17-08-2006 13:52:10

Saludos Capo!!

He estado buscando por los foros, y al principio habia visto sugerencias sobre descargar la página en local con un componente Indy HTTP, volcando ese texto a un fichero (que al igual con un WebBrowser lo puedes hacer, no estoy muy puesto en el tema) y buscando el texto escogido dentro del fichero o memo donde tengas el codigo fuente de la página.

Pero luego he encontrado la palabra clave que creo que es la que necesitabas:

PARSER,

Dec, aquí da las pautas para encontrarlo

Espero sea esto lo que buscas, yo sinceramente te lo digo, estoy out en este tema y me he limitado a buscar por los foros e investigar un poco por Delphi.

Saludos

Bicho 17-08-2006 14:02:03

Sabia yo que con un WebBrowser se podia hacer algo:

Colocas un webbrowser y un memo. En el evento ondocumentcomplete añades esto:

Código Delphi [-]
  MEMO1.Text := WebBrowser1.OleObject.Document.body.innerHTML;

Y ya tienes el codigo fuente de la web en un memo, sólo hay que buscar las etiquetas con un "pos" y ya lo tienes.

Saludos

seoane 17-08-2006 14:09:06

Seguro que usando un TWebbrowser se pueden ir recorriendo cada una de las etiquetas (aunque yo no se como ;) ), o quizá utilizando algún parser. Pero una forma sencilla de hacerlo es obtener la pagina, colocarla en un string, buscar la etiqueta textarea y copiar lo que se encuentra entre la etiqueta de apertura y de cierre. Algo así:

Código Delphi [-]
program gettext;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils, WinInet;


function Bajar(Url: string): String;
var
  hNet: HINTERNET;
  hUrl: HINTERNET;
  Buffer: array[0..10240] of Char;
  BytesRead: Cardinal;
begin
  Result := '';
  hNet := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hUrl := InternetOpenUrl(hNet, PChar(Url), nil, 0,
      INTERNET_FLAG_RELOAD, 0);
    if (hUrl <> nil) then
    begin
      FillChar(Buffer,Sizeof(Buffer),0);
      while (InternetReadFile(hUrl, @Buffer, sizeof(Buffer), BytesRead)) do
      begin
        if (BytesRead = 0) then
          break;
        Result:= Result + String(PChar(@Buffer));
        FillChar(Buffer,Sizeof(Buffer),0);
      end;
      InternetCloseHandle(hUrl);
    end;
    InternetCloseHandle(hNet);
  end;
end;

function ObtenerTexto(Url: string; Etiqueta: string): string;
var
  Str: string;
  i: integer;
begin
  Result:= '';
  // Bajamos la pagina
  Str:= Bajar(Url);
  // Buscamos la etiqueta
  i:= Pos(Uppercase(Etiqueta), Uppercase(Str));
  if i > 0 then
  begin
    // Buscamos el final de la etiqueta
   while (Copy(Str,i,1)<>'>') and (i<Length(Str)) do
      inc(i);
   inc(i);
   // Copiamos el texto hasta encontrar otra etiqueta
   while (Copy(Str,i,1)<>'<') and (i<Length(Str)) do
   begin
      Result:= Result + Copy(Str,i,1);
      inc(i);
   end;
  end;
end;

begin
  Writeln(ObtenerTexto('http://www.mipagina.com/index.html','<textarea'));
  readln;
end.

seoane 17-08-2006 15:17:13

Continuando mi respuesta anterior, podemos bajar de una sola vez todos los artículos, y guardar el contenido de los textarea en archivos de texto:

Código Delphi [-]
procedure BajarTodo(Url: string; Inicio, Final: Integer);
var
  i: integer;
begin
  with TStringList.Create do
  try
    for i:= Inicio to Final do
    begin
      Text:= ObtenerTexto(Url + IntToStr(i),'<textarea');
      SaveToFile(ChangeFileExt(ParamStr(0), '_' + IntToStr(i) + '.txt'));
    end;
  finally
    Free;
  end;
end;

begin
  BajarTodo('http://www.fabricante-pepe.com/articulo.php?referencia=',1000,1010);
end.

Emilio 17-08-2006 17:50:13

Bicho gracias por la respuesta, no es ese el camino pero se agradece, por cierto, aparcar está tirao ;)

Seoane funciona perfectamente, muchas gracias por tu rápida y eficaz respuesta.

Bicho 17-08-2006 18:01:40

La intención es lo que cuenta no??

Por cierto como va la tienda? cuanto le queda para abrir?? Ya se ha escogido nombre? (Aunque supongo que no se dirá hasta la inauguración no?)

Saludos

D-MO 17-08-2006 18:05:41

Cita:

Empezado por Bicho
Por cierto como va la tienda? cuanto le queda para abrir?? Ya se ha escogido nombre?

Pues eso mismo he estado pensando días atras ya que no se ha sabido nada al respecto.

Saludos.

seoane 17-08-2006 18:07:03

Encantado de ser útil, aquí estoy para lo que necesites Emilio :)

Emilio 17-08-2006 18:34:00

Cita:

Empezado por Bicho
La intención es lo que cuenta no??

Por supuesto ;)

Cita:

Empezado por Bicho
Por cierto como va la tienda? cuanto le queda para abrir?? Ya se ha escogido nombre? (Aunque supongo que no se dirá hasta la inauguración no?)

Bueno ya sabes lo que se dice, las cosas de palacio van despacio y encima en época estival como que todavía peor, en principio está previsto abrir entre el 15 de septiembre y 1 de octubre.

Cita:

Empezado por Bicho
Encantado de ser útil, aquí estoy para lo que necesites Emilio

Pues precisamente para el tema de la tienda virtual necesitaba ese coódigo.

Como solicité en su momento ideas para el nombre de la tienda, creo que debo decir cual se ha puesto en el hilo que inicié en la taberna, así que me voy pa la taberna a desvelar el nombrecito y a tomarme una birrita :D

dec 17-08-2006 19:07:42

Hola,

Sin demérito del resto de aportaciones de los compañeros, me gustaría añadir una que he preparado. Creo que en este caso que nos ocupa no nos vendría mal utilizar las conocidas Expresiones regulares, y, para Delphi, existe un componente de nombre TPerlRegExp que nos viene al pelo. Es un componente que utilizan proyectos como SynEdit, de código abierto, gratuito y que va muy bien.

Una vez contemos con el componente TPerlRegExp, que no tendremos ni que instalar para lo que nos ocupa, pienso en utilizar el componente TIdHttp para la descarga del código HTML de las páginas Web que nos interesan. Creo que ya todos sabéis de qué componente estoy hablando, así que paso adelante.

He subido una página Web que he subido a mi espacio en el ClubDelphi para que nos sirva a modo de pruebas. La URL de esta página es esta:

http://dec.clubdelphi.com/temporales...as-regexp.html

No contiene sino el código HTML de una página de estos mismos Foros, a la que he "infiltrado" el "textarea" que habremos de localizar... ;)

A modo de prueba he creado un procedimiento que se encarga de descargar el código HTML de la página susomentada y de localizar los resultados obtenidos de la búsqueda en el código HTML de la expresión regular de marras. Este es el procedimiento que digo:

Código Delphi [-]
uses
  IdHttp, PerlRegEx;

procedure Busqueda(url, expRegular: string;
  var resultados: TStrings);
var
  i: integer;
  http: TIdHTTP;
  regex: TPerlRegEx;
  sRespuesta: TStringStream;
begin
  http := TIdHTTP.Create(nil);
  regex := TPerlRegEx.Create(nil);
  sRespuesta := TStringStream.Create('');
  try
    http.Get(url, sRespuesta);
    regex.RegEx := expRegular;
    regex.Subject := sRespuesta.DataString;
    regex.Options := [preCaseLess, preMultiLine,
                       preSingleLine, preUnGreedy];

    resultados.Clear;
    if regex.Match then
    begin
      // Resultados de la primera coincidencia
      for i := 1 to regex.SubExpressionCount do
        resultados.Add(regex.SubExpressions[i]);
      // Resultados de sucesivas coincidencia
      while regex.MatchAgain do begin
        for i := 1 to regex.SubExpressionCount do
          resultados.Add(regex.SubExpressions[i]);
      end;
    end;

  finally
    http.Free;
    regex.Free;
    sRespuesta.Free;
  end;
end;

Utilizando la magia del componente TPerlRegEx y mis pocos conocimientos de la sintaxis de las Expresiones Regulares, podemos conseguir resultados muy curiosos con el procedimiento anterior. Por ejemplo, vamos a localizar si más el contenido del "textarea" que infiltramos en el código HTML de la página de ejemplo:

Código:

procedure TForm1.btnBuscarClick(Sender: TObject);
const
  expRegular = '<textarea name="algo">(.*)</textarea>';
  sURL= 'http://dec.clubdelphi.com/temporales/pruebas-regexp.html';
var
  resultados: TStrings;
begin
  resultados := TStringList.Create;
  Busqueda(sURL, expRegular, resultados);
  ShowMessage(resultados.Text);
  resultados.Free;
end;

Luego de llamar al procedimiento "Busqueda" dentro de este método de ejemplo que he puesto arriba, en la variable "resultados" tendremos todos correspondientes a la búsqueda llevada a cabo. ¿Cómo? ¿Resultados, en plural? Así es, porque si hubiera más de una "textarea" con las características que buscamos obtendríamos el contenido de todos estos "textarea", como digo, dentro de la variable "resultados".

Ahora entramos un poco en la magia que digo tiene el componente TPerlRegEx y las propias Expresiones Regulares, claro está. En el ejemplo anterior buscábamos un "textarea" cuyo atributo "name" fuera "algo". Con esto ya debería ir bien, es decir, podría servirnos para lo que nos ocupa. Empero, un sencillo cambio en la expresión regular que hemos utilizado antes y podríamos obtener otros resultados, por ejemplo:

Código:

procedure TForm1.btnBuscarClick(Sender: TObject);
const
  expRegular = '<textarea name="(.*)">(.*)</textarea>';
  // ó expRegular = '<textarea name="algo">(.*)</textarea>';
  sURL= 'http://dec.clubdelphi.com/temporales/pruebas-regexp.html';
var
  resultados: TStrings;
begin
  resultados := TStringList.Create;
  Busqueda(sURL, expRegular, resultados);
  ShowMessage(resultados.Text);
  resultados.Free;
end;

Con el anterior ejemplo obtendríamos el contenido de todos los "textarea" del código HTML en que buscamos. En la variable "resultados", suponiendo que en el código HTML hubiera dos "textarea", tendríamos cuatro elementos: el primero, el valor del atributo "name" del primer "textarea", el segundo, el contenido del primer "textarea"; el tercer elemento de "resultados" sería el valor del atributo "nombre" del segundo "textarea", y, por último, en el cuarto elemento de "resultados" el contenido de este segundo "textarea".

Vale. Reconozco que me he entusiasmado con la posibilidad de lograr múltiples resultados, etc., pero, ya digo que para lo que nos ocupa no es necesario. Tan sólo trataba de transmitir cierto intererés en todo esto que hablamos: Expresiones Regulares, el componente "TPerlRegEx", etc. Para lo nuestro incluso podríamos dejar el procedimiento presentado al principio de este modo:

Código Delphi [-]
uses
  IdHttp, PerlRegEx;

procedure Busqueda(url, expRegular: string;
  var resultados: TStrings);
var
  i: integer;
  http: TIdHTTP;
  regex: TPerlRegEx;
  sRespuesta: TStringStream;
begin
  http := TIdHTTP.Create(nil);
  regex := TPerlRegEx.Create(nil);
  sRespuesta := TStringStream.Create('');
  try
    http.Get(url, sRespuesta);
    regex.RegEx := expRegular;
    regex.Subject := sRespuesta.DataString;
    regex.Options := [preCaseLess, preMultiLine,
                       preSingleLine, preUnGreedy];

    resultados.Clear;
    if regex.Match then
    begin
      // Resultados de la primera coincidencia
      for i := 1 to regex.SubExpressionCount do
        resultados.Add(regex.SubExpressions[i]);
    end;

  finally
    http.Free;
    regex.Free;
    sRespuesta.Free;
  end;
end;

Y así sólo se buscaría la primera coincidencia de lo que buscamos en el código HTML en que lo hacemos. Pero, a riesgo de ser pesado, quiero hacer notar que, aún así, podríamos seguir utilizando el poder que nos ofrecen las Expresiones Regulares...

Pero, me parece que ya está bien, porque además me he limitado ha hacer algunas pruebas, y se me escapan muchas cosas de las Expresiones Regulares, y ni el componente "TPerlRegEx" conozco medianamente bien. ¡Vosotros hacedme el caso justo y aquí paz y después gloria! :eek: :) :D

Notas:

- Si no conocéis el componente TPerlRegExp no tardéis en hacerlo. ;)

- Todo lo dicho podrá mejorarse no poco, pero, supongo que una de las cosas que habría que mirar con más atención sería la posibilidad de no tener que descargar todo el código HTML de la página que nos interese, sino sólo lo necesario,... esto lo dejo caer por aquí pero, ya se ve que aporto nada más que esto, que tiene narices. :D

roman 18-08-2006 00:08:38

Bueno, ¿y es forzoso que sea en Delphi? Digo, porque en php es un "poquito" más fácil:

Código PHP:

$rgxp '#\<textarea name="algo"\>(.*)\</textarea\>#siU';
$contenido file_get_contents($la_url);

if (
preg_match($rgxp$contenido$matches))
{
  echo 
htmlspecialchars($matches[1]);


// Saludos

seoane 18-08-2006 00:41:30

Cita:

Empezado por roman
Bueno, ¿y es forzoso que sea en Delphi? Digo, porque en php es un "poquito" más fácil:

Después de leer haber leído este hilo, lo primero que se me vino a la cabeza es que lo que pedía Emilio era algo muy similar, pero como no tengo idea de php tuve que arreglarme con el pobre delphi :rolleyes: Aunque tengo que reconocer que esto de las expresiones regulares es algo fascinante

mamcx 18-08-2006 02:25:09

Y no hay razones para no usarlas en Delphi!

http://regexpstudio.com/TRegExpr/TRegExpr.html

Otro camino es usar un parser de html, ya sabemos que el html puede ser invalido asi que necesitarias buscar un tag parser...

roman 18-08-2006 05:13:01

Cita:

Empezado por Emilio
Bicho gracias por la respuesta, no es ese el camino pero se agradece,

Y ¿puede saberse por qué no es ése el camino? Al menos conduce a donde quieres ;):

Código Delphi [-]
uses mshtml;

...

var
  Document: IHTMLDocument2;
  HTMLElement: IDispatch;
  TextArea: IHTMLTextAreaElement;

begin
  Document := WebBrowser.Document as IHTMLDocument2;
  HTMLElement := Document.all.item('algo', 0);

  if Assigned(HTMLElement) then
  begin
    if Supports(HTMLElement, IHTMLTextAreaElement, TextArea)then
      ShowMessage(TextArea.value);
  end;
end;

// Saludos

dec 18-08-2006 05:17:37

Hola,

Cita:

Empezado por Román
Y ¿puede saberse por qué no es ése el camino? Al menos conduce a donde quieres ;):

Te digo yo que hay muchos caminos para llegar a Roma... :)

Cita:

Empezado por Mario
Y no hay razones para no usarlas en Delphi!

http://regexpstudio.com/TRegExpr/TRegExpr.html

Excelente la pinta que tiene ese componente. Gracias por la información. :)

Emilio 18-08-2006 08:40:17

Cita:

Empezado por roman
Y ¿puede saberse por qué no es ése el camino? Al menos conduce a donde quieres ;):

Razón tienes roman, creo que dije eso por error, al entrar al hilo vi a la vez la respuesta de seoane que me sonaba al código que andaba buscando y ya había visto alguna vez algo parecido por tanto me fijé en esa respuesta como solución, la de Bicho hablaba sobre TWebBrowser y lo descarte sin tan siquiera fijarme detenidamente, lo cual está muy mal por mi parte, lo reconozco.

Bicho: rectifico, lamento no haberme fijado mejor.

Muy pocas veces hago uso del foro para emitir preguntas y realmente estoy sorprendido de la cantidad de respuestas válidas que he obtenido, seguramente alguna vez habéis preguntado estando en una ciudad desconocida por una calle y el nativo no sólo se ha limitado en indicarte el trayecto sino que además se ha tomado la molestia de acompañarte para que no te pierdas, pues algo así creo estar sintiendo, INCREIBLE, gracias a todos :)

Bueno pues debo decir que he puesto en práctica dos de las opciones que se ofrecen en el hilo, la de seoane y la de roman en PHP, ambas funcionan de coña y el resultado es este http://www.brico-pc.com/tienda/artic...f=VBCIMPACTOEM

La web no está terminada, en breve...

Bicho 18-08-2006 10:06:11

Gracias chicos por defenderme!! :cool:

Como ya dije no estoy muy puesto en tema, pero despues de haber leido las respuestas creo que una idea si estaba dando por lo menos relacionada..

Emilio me has hecho dañoo :(

Es coña, no pasa nada :D

Un saludo a todos y vamos a ver que hay en la tienda virtual.

Por cierto no tendrás o podrías conseguir este procesador: :p AMD socket AM2 de 64bits 3800+ dual-core, que es lo que me esta jorobando el verano... :mad:

Emilio 18-08-2006 11:15:45

Cita:

Empezado por Bicho
Emilio me has hecho dañoo :(

Pues te pones una tirita :D

Cita:

Empezado por Bicho
Por cierto no tendrás o podrías conseguir este procesador: :p AMD socket AM2 de 64bits 3800+ dual-core, que es lo que me esta jorobando el verano... :mad:

Creo que esto es lo que estás buscando.

http://www.brico-pc.com/tienda/artic...AMD3800/AM2BOX

Aquí tienes unos cuantos similares.

Bicho 18-08-2006 11:24:23

Cita:

Empezado por Emilio
Creo que esto es lo que estás buscando.

http://www.brico-pc.com/tienda/artic...AMD3800/AM2BOX

Ya lo habia visto, pero no pone que sea dual-core no? Lo es?, Esta disponible?

Los otros son un socket anterior al AM2 i me interesa ahora mismo el nuevo.

Gracias de todos modos.

Saludos

Edito: he visto que en la foto, si pone que sea dual-core, así que si la foto no engaña es el que busco

Emilio 18-08-2006 11:48:19

Cita:

Empezado por Bicho
Ya lo habia visto, pero no pone que sea dual-core no? Lo es?, Esta disponible?

Los otros son un socket anterior al AM2 i me interesa ahora mismo el nuevo.

Con socket AMD2 sólo hay disponibles el 3200 y el 3500

http://www.brico-pc.com/tienda/artic...AMD3200/AM2BOX
http://www.brico-pc.com/tienda/artic...AMD3500/AM2BOX

De todas formas todavía no tengo nada en stock, la tienda todavía no está abierta, pero se pueden pedir.

Bicho 18-08-2006 12:30:22

Pero esto no son dual-core (estoy exigente hoy eh? :p ya lo sé)
de todas maneras el 3200 tiene buena pinta.

Creo que sino llega el mio a principios de septiembre me dicidiré por este y ya más adelante lo cambiaré

Esta gente de AMD saca el procesador nuevo (socket AM2 y dual-core) a mediados de Julio, el que quiero vale 130€ y en agosto cierran por vacaciones o no producen los suficientes o que, la cuestión es que por todo me ponen como escusa que al distribuidor no le llega :mad:

En fin ya veremos...

Saludos

roman 18-08-2006 18:50:40

Cita:

Empezado por Emilio
Muy pocas veces hago uso del foro para emitir preguntas y realmente estoy sorprendido de la cantidad de respuestas válidas que he obtenido, seguramente alguna vez habéis preguntado estando en una ciudad desconocida por una calle y el nativo no sólo se ha limitado en indicarte el trayecto sino que además se ha tomado la molestia de acompañarte para que no te pierdas, pues algo así creo estar sintiendo, INCREIBLE, gracias a todos :)

¡Hombre, Emilio! ¡Qué estás descubriendo al ClubDelphi! Y no sabes, tiene un administrador estupendo que día con día renueva y mantiene el sitio. ¡Ah! Pero si tú eres el administrador! :D :D

// Saludos

Lepe 19-08-2006 12:18:07

Emilio, Ese sentimiento es el que hace perdurar a tu criatura (ClubDelphi) ;)

Saludos

chelox 15-09-2006 07:21:24

solución con webbrowser
 
Hola, acavo de poner un mensaje de ayuda en este foro de internet, pero leyendo este tema creo que acá esta mi solución, y era algo tan simple como lo que puso bicho

MEMO1.Text := WebBrowser1.OleObject.Document.body.innerHTML;

Mi problema lo resolvería con este compenente creo yo porque al sitio que estoy consultando tiene algunos redireccionamientos.
Ahora lo que yo necesito es abrir el sitio, pero enviando algunos parámetros por POST.
Me parece que esto si se puede con este componente. Veo que por aca la tienen reclara con este tema, asi que espero alguna ayuda.
Luego una vez que trajo los datos y haga todos los redireccionamientos que quiera recién ahí examinaría el código HTML que con eso ya estaría resuelto el problema.

Aca está lo que quiero, que puse en otro mensaje:
Necesito hacer una consulta a un sitio web publico, donde envio unas variables por POST y recibo todo un HTML con los resultados.
Estuve renegando un poco con DELPHI hasta que lo logré unsando un componente IdHTTP.
Aparentemente funciona pero no me trae resultados, es como que hace una consulta nula.
Gracias a este componte me detecta que tiene un redireccionamiento no se si esto pude influir, yo creo que no. Porque a esto mismo lo hice con flash, envio y recibe todo bien, me trae la consulta correcta, pero me corta el HTML, no me lo trae completo.
Yo creo que es posible hacerlo, pero no se si estoy lejos o cerca, lo que se me había ocurrido era como hacer un internet explorer propio, donde yo pueda tener acceso al codigo html.
Pero no manejo casi nada los componente de internet de delphi, yo creo que a esto un experto lo saca al instante.
Espero que alguien me pueda ayudar.

Aca pongo el ejemplo hecho con delphi 7, por si alguien quiere investigar.
Gracias.

www.dbhost.com.ar/pruebaindy.zip

Roger007 09-10-2006 15:06:39

Wenas.

Vi este hilo y me intereso el tema de poder sacar información directamente de una Web. Hice pruebas con los ejemplos que pusisteis y funcionaban perfectamente. (incluso poniendo parámetros para hacer las búsquedas, no sabia que se podía hacer)

Ahora llega mi problema: Llevo una temporada jugando al Travian (juego por Web de gestionar los recursos de tu aldea y hacer soldados, como un civilization pero mas sencillito y en Web). Tiene una opción de sacar un pequeño mapa de tu zona con tu aldea en el centro y poder ver las aldeas que tienes mas cercanas. Además puedes ver algo de información de las aldeas vecinas. Esta seria la información que me interesaría para sacar unas estadísticas. Ya he visto la estructura del html y creo que no tendré problemas para coger esos datos.

El problema es que para entrar en la Web me pide usuario y password y no consigo pasar de ahí al usar vuestro ejemplos (cambiando los parámetros por supuesto, poniendo mi usuario y mi password). (creo que tal vez sea algo de las cookies pero no se entrar en ese tema)

He creado una aldea de pruebas por si queréis ver como es la web y los datos pide.

Web: http://s3.travian.net/login.php
Usuario: prueba_roger
Password: 12345678

procedure TForm1.Button2Click(Sender: TObject);
var
data: TIdMultiPartFormDataStream;
begin
data := TIdMultiPartFormDataStream.Create;
try
{ add the used parameters for the script }
data.AddFormField('e7a9175','prueba_roger');
data.AddFormField('e9cb9d1','12345678');

Memo1.Lines.Text := IdHTTP1.Post('http://s3.travian.net/dorf1.php', data);
finally
data.Free;
end;
end;

Un Saludo, Roger.

dec 09-10-2006 15:24:58

Hola,

Mirando un poco por encima el código HTML de la página que comentas, para empezar, se incluyen más campos además del "login" y el "password", aunque, ciertamente, no sé si estos serán "obligatorios" para una correcta autentificación.

Por otro lado, alguno de los campos que digo que se incluyen (aunque ocultos al usuario) tienen un valor aleatorio, es decir, parece que no siempre es el mismo, incluso los propios campos "login" y "password" tienen nombres un tanto extraños, da la impresión que acaso también aleatorios.

Todo esto puede ser para complicar el login a usuarios, precisamente, que traten de hacerlo desde fuera de la página Web, es decir, justo lo que tratas de conseguir tú. No sé. Tal vez no, tal vez sea por otro motivo que se nos escape.

No sé... sería cuestión de hacer una serie de pruebas,... y a lo peor no tener el éxito esperado, claro.

seoane 09-10-2006 15:27:33

Además, creo que se usan cookies. ¿Indy maneja las cookies?

dec 09-10-2006 15:36:38

Hola,

Sí; creo que Indy cuenta con componentes para manejar las Cookies, empero, no sé si en este caso se trata de esto, puesto que las Cookies parecen utilizarse (en este caso) para almacenar datos relativos a la autentificación, pero, para lograr cierta "persistencia" de la misma, es decir, lo que es "entrar" en el sistema me parece que no tiene que ver con las "Cookies", en este caso.

De todas, todas, las pruebas que he dicho tratarían de ver qué pasa con las Cookies de marras, pero, teniendo en cuenta que hay más campos que el "login" y el "password"; que dichos campos parecen variar aleatoriamente en cada carga de la página... no sé, no sé. Me parece una especie de "sistema" para impedir, precisamente, lo que trata de hacerse.

¿Entonces estoy diciendo que no puede hacerse? Bueno. Acaso eso es lo que tratan los desarrolladores de conseguir... pero esto no quiere decir que no pueda hacerse, imagino.

Crandel 10-10-2006 03:58:34

Cita:

Empezado por dec
Sí; creo que Indy cuenta con componentes para manejar las Cookies, empero, no sé si en este caso se trata de esto, puesto que las Cookies parecen utilizarse (en este caso) para almacenar datos relativos a la autentificación, pero, para lograr cierta "persistencia" de la misma, es decir, lo que es "entrar" en el sistema me parece que no tiene que ver con las "Cookies", en este caso.

a mi me dice que el problema de acceso son las cookies

Cita:

Empezado por dec
teniendo en cuenta que hay más campos que el "login" y el "password"; que dichos campos parecen variar aleatoriamente en cada carga de la página... no sé, no sé. Me parece una especie de "sistema" para impedir, precisamente, lo que trata de hacerse.

lo que hice fue descargar la pagina principal http://s3.travien.net/login.php y de ahi sacas los campos de login para intentar de acceder y generas automaticamente el pedido de login, pero no me funciona :(

Existe otra forma mas facil de hacerse, con lo que yo solucione el problema, pero con Indy quedaria mejor resuelto.

Fue utilizar el componente TWebBrowser y lo manejas desde ahi, el se encarga de las cookies y demas problemas.

Pero igual esteria bueno aprender a manejarla sesion con Indy, y estuve leyendo recien que los ICS tambien permiten cookies pero tampoco encontre un ejemplo sencillo.

dec 10-10-2006 04:12:36

Hola,

Cita:

Empezado por Ángel
lo que hice descargar la pagina principal http://s3.travien.net/login.php y de ahi sacas los campos de login para intentar de acceder.

Sí; pero, ahí se pueden ver campos cuyos valores son aleatorios, es decir, cada vez que descargas dicha página Web los valores de algunos campos cambian también. ¿Cómo vas a proporcionar los valores correctos si no sabes los que son? Ahora,... no sé si no me estoy liando...

A ver...

Paso 1: descargamos la página Web, esto es, su código fuente

Paso 2: "parseamos" el código en busca de todos los campos del formulario

Paso 3: Preparamos el "HTTP POST" y procedemos a su envío...

Tiene su lógica, ¿no? Tal vez me haya liado antes con lo de los campos... Pero, en cualquier caso, no basta con los campos "login" y "password", o... ¿también en esto me he liado?

Cita:

Empezado por Ángel
Existe otra forma mas facil de hacerse, con lo que yo solucione el problema, pero con Indy quedaria mejor resuelto.

¿Entonces pudiste acceder al código fuente de la página Web una vez autentificado? ¿Y sólo utilizaste los campos "login" y "password"? Pues lo dicho, no probé lo suficiente el tema, por lo que se ve, o no supe hacerlo, vaya. ;)

Crandel 10-10-2006 04:52:11

Cita:

Empezado por dec
¿Entonces pudiste acceder al código fuente de la página Web una vez autentificado? ¿Y sólo utilizaste los campos "login" y "password"? Pues lo dicho, no probé lo suficiente el tema, por lo que se ve, o no supe hacerlo, vaya. ;)

de la unica forma de acceder que logre fue con el TWebBrowser.

Con indy, no pude lograr loguerme ya sea enviando solo los campos usuario y pass o todos juntos

Si queres te paso el codigo con el que estoy probando

dec 10-10-2006 04:58:46

Hola,

Cita:

Empezado por Ángel
Si queres te paso el codigo con el que estoy probando

Hombre, probablemente, ése código interese a más gente. Cópialo por aquí y le echamos un vistazo Ángel. :)

Crandel 10-10-2006 05:33:21

1 Archivos Adjunto(s)
aca esta lo que probe, yo me voy a dormir si alguien sigue mañana lo veo.

dec 10-10-2006 05:45:44

Hola,

El primer método no funciona porque tratas de pasar las variables mediante la URL, mientras que para autentificarte en el sistema es preciso enviar dichas variables vía "HTTP POST".

Ninguno de los otros métodos funciona, es decir, siempre acaba uno recibiendo el código HTML correspondiente a la página de "login", no el de la página de entrada para los usuarios autentificados, que es lo que se pretende, si ya no es que se quiere ir más allá...

Desde luego te lo has currado, como suele decirse, y tal vez sea cuestión de eso, de ir probando varias cosas así...

Roger007 10-10-2006 15:34:54

Ya lo conseguí, muchas gracias por vuestra ayuda.

Hoy he estado comparando los nombres de los campos con los html que saque ayer y vi lo que me dijisteis que algunos nombres de campos cambiaban. Y que adema había mas campos que debía poner.

He hecho que primero llame a la web http://s3.travian.net/login.php donde puedo ver los nombres de los campos y luego llamo a http://s3.travian.net/dorf1.php ya con los nombres actualizados.

data.AddFormField('w','');
data.AddFormField('login',campo_contador_login);
data.AddFormField(nombre_campo_usuario,'prueba_roger');
data.AddFormField(nombre_campo_password,'12345678');
data.AddFormField('ef19b32','');

Muchas gracias por la ayuda, ahora me pondré a sacar la información para hacer mis estadísticas.

Un Saludo, Roger.

Crandel 10-10-2006 15:53:59

Muy bien Roger, podrias compartir con nosotros como lo resolviste al final?

que componente usaste? o de que forma hiciste la petición.

o un ejemplo basico.

Roger007 10-10-2006 16:48:46

1 Archivos Adjunto(s)
Por supuesto que os pongo mi practica.

El sistema de búsqueda es cutre pero efectivo. Con el ejemplo que habéis puesto me pondré para que la búsqueda sea mas elegante.

Un Saludo, Roger.

Crandel 10-10-2006 23:55:36

Muy bien Roger, me baje el tuyo y lo veia tan parecido a lo que hice anoche que no entendia que no me funcionaba.

Estuve recien media hora para descubrir que el nombre de los parametros debe ir si o si en minuscula :mad:

con un LowerCase se soluciono todo :o

aclaración: el que anduvo de mi ejemplo fue mi metodo 3.

Al González 04-11-2006 18:54:28

Sobre expresiones regulares y analizadores sintácticos
 
¡Hola a todos!

Cita:

Empezado por mamcx (sobre el tema de expresiones regulares)
...Y no hay razones para no usarlas en Delphi!

http://regexpstudio.com/TRegExpr/TRegExpr.html...

Al parecer ya no está disponible ese enlace, ¿tendrás otra dirección Web que conduzca a esos componentes? Gracias de antemano.

Cita:

Empezado por mamcx
...Otro camino es usar un parser de html, ya sabemos que el html puede ser invalido asi que necesitarias buscar un tag parser...

Tal vez les sea útil este enlace, donde hay varios de esos componentes:
http://www.torry.net/pages.php?id=216

Un abrazo regular.

Al González. :)


La franja horaria es GMT +2. Ahora son las 21:04:10.

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