Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Vamos a ver si te puedo explicar algunas cosas, al menos como yo las recuerdo de cuando me ley el protocolo para hacer mi pico servidor . Espero no equivocarme mucho ...

Cita:
Empezado por Al
Vaya, la ayuda dice «specifies the HTTP version used for Get, Head, and Post methods for the HTTP client». Entonces sí existen otros métodos (por lo menos uno) además de Get y Post, ¿cómo será eso del método Head?
Es verdad, el protocolo http tiene varios comandos los habituales Get y Post, y algunos otros. Ahora mismo solo me acuerdo del Head y el Connect, pero creo que algún otro hay. El Head básicamente es similar al Get solo que el servidor al responder solo devuelve las cabeceras y no el resto de la respuesta, esto puede ser practico, por ejemplo, si queremos obtener información sobre un archivo, como si esta disponible o cuantos bytes ocupa sin tener que descargarlo. El connect se utiliza para establecer túneles a través de los proxys para las conexiones seguras, pero eso ya es otra historia. Hablando de cabeceras ...

Cita:
Empezado por Al
Estas dos propiedades me despiertan varias dudas: ¿qué es eso de los valores de cabecera? ¿se referirá a lo del método Head que leí antes? ¿qué utilidad tiene? ¿cómo funciona?
En el protocolo http tanto las peticiones (Request) como respuestas (Response) tienen un formato similar. Se dividen en una serie de cabeceras, una linea para cada una y el propio cuerpo del mensaje. Separados por una linea en blanco. Un ejemplo:

Petición de la pagina de google:
Código:
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Accept-Language: es
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Host: www.google.es
Proxy-Connection: Keep-Alive
Se puede ver que la primera linea es el comando (Get,Head,Post,etc), las otras cabeceras dan otra información como el Host, el tipo de navegador, etc. Fíjate en la linea en blanco al final, esta indica el final de las cabeceras y el comiendo de los datos, como es un comando get no hay datos, si fuera un comando Post la información se enviaría a continuación de la linea en blanco.

Y que es lo que nos responde google:
Código:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Server: GWS/2.1
Content-Length: 4289
Date: Sat, 04 Nov 2006 21:01:23 GMT

{A partir de aqui nos manda el documento no lo pongo porque aqui se veria mal}
La primera linea nos indica el código de la respuesta 200 para OK, 404 para no encontrado, 302 para dirigirnos a otro lado, etc ... Las otras nos indican el tipo de documento que nos manda o la longitud, entre otras cosas.

Ahora vamos con otras preguntas que hiciste:
Cita:
Empezado por Al
AuthRetries. Ésta se me hace que la voy a necesitar para el ingreso de usuarios.
El protocolo http cuenta con un sistema de autenticación muy básico, que codifica la contraseña en base64. Quizá lo habrás visto alguna vez al intentar entrar en una pagina protegida muestra un dialogo para introducir el nombre de usuario y contraseña. Este sistema se uso mucho, aunque ahora la mayoría de las paginas utilizan su propio sistema de autenticación contra una base de datos usando un formulario y por ejemplo php, quedando este sistema bastante en desuso. Si la pagina a la que quieres entrar usan un formulario lo mas seguro es que no use este método de autenticación.

Cita:
Empezado por Al
HandleRedirects. Esto me suena a cuando quiero entrar a una página y el navegador me lleva a otra, a veces de forma temporal para decirme que he ganado 50 millones de dólares y churradas similares.
Esto hace que si recibe como respuesta códigos como el 302 pidiendo que se dirija a otra dirección le haga caso y vaya, como ya dijo roman esto puede ser necesario para entrar en alguna pagina.

Bueno, creo que ya llego por ahora, aunque si tienes duda por algo o quieres meterte mas en profundidad en algún tema, tu solo dilo Porque ya sabes "que no tengo otra cosa que hacer"
Responder Con Cita
  #2  
Antiguo 05-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Bueno, mientras no me aclaro con las "Expresiones regulares" sigo haciendo pruebas usando la función Pos de toda la vida . Aquí os dejo un juguetito, que se conecta al club delphi con tu nombre de usuario y contraseña, y comprueba si tienes mensajes sin leer. Puedes indicarle que haga la comprobación automáticamente cada 5 minutos y te avise con un pitido si hay mensaje nuevos. Para que esto funcione después de leer los mensajes hay que usar la opción de los foros "Marcar Foros Como Leídos", o de lo contrario seguirá viendolos como mensajes nuevos.

Lo dicho, es solo un juguete, para entretenerse mientras no nos metemos mas a fondo en el tema. Espero que este hilo no decaiga ...
Archivos Adjuntos
Tipo de Archivo: zip AutoWeb.zip (6,8 KB, 375 visitas)
Responder Con Cita
  #3  
Antiguo 05-11-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Primeros intentos

¡Hola a todos!

Gracias por esa herramienta Domingo. Será muy interesante echarle un vistazo.

Actualizo el caso:

--------------------------------------------------------------------------
Prueba del componente TIdHTTP
Informe #1


Cargué en un navegador la página dada por la URL https://login.yahoo.com/config/mail?.intl=us, la cual es el punto de entrada al correo electrónico de Yahoo para cuentas de Estados Unidos. Esta página solicita los típicos nombre de usuario y contraseña de cualquier sistema de correo. Tomé su código fuente HTML guardándolo localmente como CorreoYahoo.htm. Al explorar su contenido con el bloc de notas, encontré que, como habría de esperarse, el método de envío de datos que utiliza es el Post:

<form method="post"...

Como ya sabemos, cuando el método es Get, los datos de captura son enviados al servidor Web como parte de la cadena URL; mientras que con el método Post, los datos son enviados de forma interna o “no visible”.

Me despertó curiosidad el saber cómo se comportaría la página y el servidor de Yahoo, si cambiara la palabra post por get. Lo hice y guardé el archivo como CorreoYahooGet.htm. Al ejecutar esa página Web, capturando la clave de usuario y contraseña que solicita, vi como estos dos datos aparecieron, junto con otros valores, en la barra de direcciones del navegador (como parámetros en la URL), lo cual era de esperarse. Lo interesante fue ver que el sistema de corro de Yahoo permitió el ingreso, a pesar de haber enviado los datos de esta manera.

Me llamó la atención otro detalle de la línea

<form method="post" action="https://login.yahoo.com/config/login?"

Entiendo que el atributo Action de la etiqueta Form indica la URL que el sistema deberá ejecutar al someter (submit) los datos, y que el signo de interrogación (“?”) se utiliza para dar inicio a los parámetros enviados en la misma URL cuando se utiliza el método Get. Mi pregunta entonces es ¿por qué aparece ahí el signo de interrogación si el método que utiliza la página es Post y no Get?

Sobre el útilmente sobrecargado método TIdHTTP.Post, la documentación dice algo que me pareció lógico y a la vez interesante:

When ASource is a TStrings instance, Post will replace all occurrences of
the End-Of-Line (EOL) character in ASource with the value '&' prior to
transfer to the HTTP server. When ASource is a TStream instance, no
preprocessing of the stream content is performed.


El símbolo ampersand (“&”) se utiliza para separar los parámetros entre sí en la URL cuando se utiliza el método Get. Es útil que cuando los parámetros son proporcionados como una lista TStrings, el método Post haga la sustitución de saltos de línea por dicho símbolo. Cuando los parámetros son indicados mediante un flujo TStream, éste es tomado tal cual esté, por lo que deberá contener ya los separadores & que sean necesarios.

De ahí que Tefots, incluya tales símbolos en el ejemplo que tan amablemente nos proporciona en el mensaje 12. Pero coincido con Román en que resulta más práctico usar una lista TStrings (el método TIdHTTP.Post también acepta ese formato). Por cierto, recuerdo haber visto un par de muy acertadas intervenciones de Román en este hilo, pero ya no están aquí. ¿Alguna razón especial por la que hayan desaparecido?

El siguiente es el código fuente de la prueba inicial:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
  Parametros :TStringList;
begin
  Parametros := TStringList.Create;

  Try
    Parametros.Add ('login=debefuncionar');
    Parametros.Add ('passwd=xxxxxxxxxxxxx');

    Try
      Memo1.Text := IdHTTP1.Post ('https://login.yahoo.com/config/login?',
        Parametros);
    Except
      On E :Exception Do
        ShowMessage (E.Message);
    End;
  Finally
    Parametros.Free;
  End;
end;

La llamada al método IdHTTP1.Post me arroja una excepción EIdIOHandlerPropInvalid con el mensaje «IOHandler value is not valid».

Debe considerarse lo siguiente:

La URL comienza con https y no http. Cuando el protocolo es HTTPS, el componente TIdHTTP exige el uso de un componente adicional TIdSSLIOHandlerSocket asignado a su propiedad IOHandler, como puede observarse en este extracto del código de IDHTTP.pas (Delphi 7):

Código Delphi [-]
if AnsiSameText(URL.Protocol, 'HTTPS') then
begin
  // Just check can we do SSL
  if not Assigned(IOHandler) or (not (IOHandler is TIdSSLIOHandlerSocket)) then
    raise EIdIOHandlerPropInvalid.Create(RSIOHandlerPropInvalid)

Esto es algo importante a considerar, ahora que suelen verse en la Red muchos sitios que son «https://…».

Para cumplir con este requisito, hago uso de un componente TIdSSLIOHandlerSocket. Aún cuando los sitios a los que deseo acceder después de este aprendizaje sean de protocolo HTTP y no HTTPS, me interesa lograr hacer pruebas exitosas con HTTPS también. Aclaro que la excepción elevada que menciono ocurre por otras causas.

Depurando paso a paso el código de las unidades involucradas (con la opción Use Debug DCUs, que permite que uno pueda meterse hasta la cocina), encontré que la causa de este error se origina en el hecho de que la función Load de la unidad IdSSLOpenSSLHeaders.pas no logra cargar correctamente algunas DLLs.

Según este enlace de Borland:
http://support.borland.com/entry.jsp...externalID=406, se requiere un software llamado OpenSSL, específicamente los archivos libeay32.dll y ssleay32.dll para poder usar los componentes Indy con SSL (Secure Socket Layer), que es la especificación utilizada por una página HTTPS.

El sitio oficial de OpenSSL es http://www.openssl.org/, sin embargo no encontré en él un instalador que proporcione de manera fácil las dos DLLs que necesito. Así que descargué OpenSSL 0.9.8d para Win32 del sitio http://www.slproweb.com/products/Win32OpenSSL.html y lo instalé.

Pero aún así la excepción mencionada sigue apareciendo al intentar hacer la llamada al método Post. Haciendo un examen más minucioso de la citada función Load, descubrí que las DLLs sí logran cargarse, más no las funciones IdSslCtxSetInfoCallback, IdSslX509StoreCtxGetAppData, IdSslSessionGetId, IdSslSessionGetIdCtx, IdSslCtxGetVersion, IdSslCtxSetOptions, IdSslX509GetNotBefore, IdSslX509GetNotAfter, iddes_set_odd_parity, iddes_set_key e iddes_ecb_encrypt, que probablemente pertenecen a esas DLLs.

Ante esto, sospecho que debo utilizar otra versión de OpenSSL (no la 0.9.8d) para conseguir que tales funciones se carguen correctamente y con ello poder utilizar el componente TIdHTTP con sitios que utilizan Secure Socket Layer (HTTPS).
--------------------------------------------------------------------------

Les agradezo de antemano su ayuda.

Un abrazo neófito.

Al González.
Responder Con Cita
  #4  
Antiguo 06-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Cita:
Empezado por Al González
Por cierto, recuerdo haber visto un par de muy acertadas intervenciones de Román en este hilo, pero ya no están aquí. ¿Alguna razón especial por la que hayan desaparecido?
A mi también me parecieron muy interesantes los argumentos de Roman. ¿Que habrá pasado?
Responder Con Cita
  #5  
Antiguo 06-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Al
Me llamó la atención otro detalle de la línea

<form method="post" action="https://login.yahoo.com/config/login?"

Entiendo que el atributo Action de la etiqueta Form indica la URL que el sistema deberá ejecutar al someter (submit) los datos, y que el signo de interrogación (“?”) se utiliza para dar inicio a los parámetros enviados en la misma URL cuando se utiliza el método Get. Mi pregunta entonces es ¿por qué aparece ahí el signo de interrogación si el método que utiliza la página es Post y no Get?
No debes preocuparte. El signo de interrogación no hace nada, simplemente, en este caso. Es posible que Yahoo! tenga algún sistema (entre otros muchos) que se encarge de construir las URLs (hablo para entendernos) y, sencillamente, dicho sistema añada las variables que sean necesarias en la URL... y si no encuentra variables que agregar no lo hace, pero, deja en la URL ese signo de interrogación seguido del cual irían las variables. En este caso no le des más vueltas: lo mismo da un "action" que el otro:

Código:
<form method="post" action="https://login.yahoo.com/config/login?"

// Es lo mismo que

<form method="post" action="https://login.yahoo.com/config/login"
Cita:
Empezado por Al
Ante esto, sospecho que debo utilizar otra versión de OpenSSL (no la 0.9.8d) para conseguir que tales funciones se carguen correctamente y con ello poder utilizar el componente TIdHTTP con sitios que utilizan Secure Socket Layer (HTTPS).
Lo que puedo decir es que hace un tiempito me puse a escribir a modo de prueba un cliente de correo (muy sui generis) que se conectaba a GMail y descargaba los nuevos correos de determinadas cuentas de usuario. Hube de usar las librerías que mencionas con los componentes de Indy y, bueno, todo fue bastante bien. De hecho son librerías que usan no pocos programas para bregar con el protocolo SSL, como bien dices.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 06-11-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola a todos!

Cita:
Empezado por seoane
...Espero que este hilo no decaiga ...
Yo espero lo mismo.

Cita:
Empezado por dec sobre OpenSSL
...Hube de usar las librerías que mencionas con los componentes de Indy y, bueno, todo fue bastante bien. De hecho son librerías que usan no pocos programas para bregar con el protocolo SSL, como bien dices.
Que bien. ¿Podrías decirme qué versiones de Delphi y OpenSSL utilizaste?

Gracias.

Al González.
Responder Con Cita
  #7  
Antiguo 08-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Casi se me pasa responder a esto Al, te pido disculpas. Yo utilizé la última versión de ambos "programas", es decir, la última versión de las librerías que pude conseguir y a la vez la versión 10 de los componentes Indy. De echo hace poco probé el programa que escribí a modo de ejemplo y traté de hacerlo funcionar con Indy 9 y no pude hacerlo. Lo digo para que conste. Con Delphi 10 y lo que yo recuerdo son la última versión de OpenSSL pude hacer lo que quería: conectar con Gmail y traer los nuevos correos de varias cuentas.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 13-02-2008
hach hach is offline
Miembro
 
Registrado: mar 2007
Ubicación: Bariloche, Argentina
Posts: 44
Poder: 0
hach Va por buen camino
Hola Al
como dec, yo accedo a Gmail con indy y tambien tuve problemas con las versiones de libeay32.dll y ssleay32.dll
No recuerdo como pero logre dar con las versiones indicadas
uso delphi 7 con las indy que el trae... que versión serán? parece que 9.00.10
las versiones de dll que me funcionan son las de indy_OpenSSL096m
Si no las consigues te las paso

Saludos

Pablo
Responder Con Cita
  #9  
Antiguo 13-02-2008
hach hach is offline
Miembro
 
Registrado: mar 2007
Ubicación: Bariloche, Argentina
Posts: 44
Poder: 0
hach Va por buen camino
Perdón, me pasa por apurado y no leer todo!!!
Ya estaba resuelto este tema...
Muy interesante el hilo!!!!!
Saludos otra vez

Pablo
Responder Con Cita
  #10  
Antiguo 27-09-2010
djemix djemix is offline
Miembro
 
Registrado: ago 2006
Posts: 46
Poder: 0
djemix Va por buen camino
Hola chicos!!!

Perdón por reabrir este antiguo hilo, pero la verdad es que me ha venido genial el trabajo realizado por todos.

Pero me surge una duda/cuestión, a ver si saben como atacarla. ¿Como realizo las llamadas a las funciones Javascript que contiene la web solicitada?

Un saludo!!
Responder Con Cita
  #11  
Antiguo 29-09-2010
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 30
jachguate Va por buen camino
No existe tal cosa como "llamadas a las funciones Javascript".

Y pues... qué hacer dependería de lo que queres lograr. Si lo que queres es, por ejemplo, imitar una llamada al servidor (típico ajax), lo que toca es "armar" una llamada identica a la que generaría el javascript y lanzarla desde Delphi.

Por el contrario, si el javascript modifica elementos del DOM, pues tocaría primero interpretar el HTML para tener una estructura similar en memoria y luego utilizar, por ejemplo, algún interprete de javascript para delphi que le permita a dicho "script" interactuar con el DOM que vos mismo has armado...

En fin... la pregunta es demasiado general como para darte una respuesta más cercana a una solución.

Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #12  
Antiguo 15-12-2006
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 25
Crandel Va por buen camino
Cita:
Empezado por seoane
Aquí os dejo un juguetito, que se conecta al club delphi con tu nombre de usuario y contraseña, y comprueba si tienes mensajes sin leer.
Al fin me he dignado a usar tu código de acceso a paginas web con WinInet y he mirado el código del programa que escribiste.

He visto que repites varias veces la sentencia:
Código Delphi [-]
FreeAndNil(Respuesta);
Respuesta:= TStringStream.Create('');

Se reemplazar por esta para que quede mejor:
Código Delphi [-]
Respuesta.Size := 0;
__________________
[Crandel]
Responder Con Cita
  #13  
Antiguo 15-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Muy cierto Crandel, es mejor poner la propiedad size a cero. Por cierto, no comentas que te parece el resto del código.

PD: Aprovecho para preguntar ¿que le paso a este hilo? ¿se puede considerar muerto? ¿nadie mas saco algo en limpio?
Responder Con Cita
  #14  
Antiguo 15-12-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile A jíjole, ya es tarde

¡Hola a todos!

Cita:
Empezado por seoane
...Aprovecho para preguntar ¿que le paso a este hilo? ¿se puede considerar muerto? ¿nadie mas saco algo en limpio?...
Hace unos minutos me dije: «voy a revisar el correo mientras Pepe realiza esas últimas pruebas» y entonces descubro esta pregunta de Domingo.

Mañana instalaremos la primera versión de la solución a nuestro cliente. Ya es funcional la automatización sobre dos de los tres sitios Web (en una versión básica). Faltará hacer algunas mejoras, pero confío en que pronto tendremos esto al 100%.

Algunos datos clave para quienes deseen desarrollar este tipo de soluciones:

El componente TIdHTTP es excelente, pero no es la única herramienta que utilizamos. En cada caso primero hay que estudiar las tripas del sitio Web, elaborando un "mapa" de las URLs que se mandan llamar y sus parámetros. Un largo trabajo de arqueología informática, donde se requiere mucha paciencia. En este punto, mi recomendación es usar un componente TWebBrowser para saber cuáles son los parámetros que la página envía al servidor Web, y entonces después poder automatizar esos envíos con TIdHTTP. Domingo Seoane nos expone un buen ejemplo del evento TWebBrowser.OnBeforeNavigate2 en este mensaje.

(la sentencia "ShowMessage(Values['P1']);" puede ser sustituida por "ShowMessage(Text);" para mostrar todos los parámetros (nombres y valores) que están a punto de enviarse en la petición).

Gracias Domingo, ese ejemplo me sirvió muchísimo cuando no encontraba la manera de ver los parámetros que una página enviaba bajo el método Post. Lo que usualmente hacía para averiguarlo era guardar una copia local de la página como archivo .htm, cambiar su método Post por Get y ejecutar tal archivo, pero por alguna razón no se guardaba correctamente (incluso hasta instalé Firefox por primera vez para intentarlo con ese otro navegador ). Pero definitivamente es más profesional hacer trabajo de arqueología con herramientas más finas y no puro pico y pala.

La esencia de automatizar un sitio Web ya sea con TIdHTTP o con rutinas de más bajo (y flexible) nivel como las propuestas por Domingo, consiste en conocer las URLs (direcciones Web) a las cuales hay que ordenarles algo y los parámetros que habremos de enviarles para que ese algo ocurra de manera correcta. Dichas URLs aparecen en los atributos "Action" de las etiquetas HTML "Forms" (¿cómo? ¿el lector todavía no ha usado la opción "Ver código fuente" de su navegador? ).

Generalmente, cuando se invoca a una de esas direcciones Web, el misterioso programa servidor que se encuentra del otro lado de la línea (generalmente Apache), nos envía como respuesta un flujo de bytes HTML, una página vaya. El resto del trabajo consiste en analizar ese flujo de bytes como una cadena de caracteres, buscando en posiciones específicas el dato que deseamos extraer.

Esto no quiere decir que vamos a estudiar la cadena que regresó byte por byte. La cadena de bytes puede ser guardada como una página .htm y verla con mayor detalle en cualquier editor de texto. De hecho esto se hace generalmente desde antes de empezar a programar (me meto al navegador, consulto un dato y la página que me regresa la guardo como archivo local). Se estudia ese archivo de texto para encontrar patrones comunes que ayuden a identificar con seguridad la posición donde siempre aparece el dato que buscamos. Es decir, ya se ha familiarizado uno con el código fuente de una página de resultados y es entonces cuando podemos escribir un algoritmo que acaricie a esos caracteres y bese a la parte más sensible de la cadena, obteniendo ese «¡Si, aquí!» que todos deseamos escuchar.

Código Delphi [-]
    { Primera fila de datos es el último producto consultado de la
      cotización }
    I := Pos ('dp[1]=new Prt(', Respuesta);

    If I = 0 Then
      Exit;

    Contador := 0;

    For I := I + 14 To MaxInt Do
      If Respuesta [i] = ',' Then
      Begin
        Inc (Contador);

        { Después de la tercera coma está el valor para el parámetro "whs"
          usado en la consulta de disponibilidad }
        If Contador = 3 Then
        Begin
          ParametroWhs := Copy (Respuesta, I + 2,
            PosEx ('''', Respuesta, I + 2) - (I + 2));
        End
          Else
          { Después de la octava coma está el precio }
          If Contador = 8 Then
          Begin
            Precio := ValorNumerico (Copy (Respuesta, I + 2,
              PosEx ('''', Respuesta, I + 2) - (I + 2)));
          End
          Else
            { Después de la vigésima coma está el valor para el parámetro
              "invtid" usado en la consulta de disponibilidad }
            If Contador = 20 Then
            Begin
              ParametroInvtid := Copy (Respuesta, I + 2,
                PosEx ('''', Respuesta, I + 2) - (I + 2));
              Break;
            End;
      End;

En las próximas versiones vamos a utilizar alguna biblioteca (esas que creíamos que eran librerías en el siglo pasado) especial para análisis sintáctico HTML y reconocimiento de expresiones regulares. Esto con el fin de hacer más segura la extracción de datos. Porque como el propietario del sitio cambie ligeramente el diseño de la página...¡pabernosmatao!

Todo esto que escribí fue a botepronto (palabra hermana de pabernosmatao) y en base a mis escasos conocimientos sobre la Web. Aún así, espero que resulte de utilidad y de antemano pido disculpas por si dije alguna babosada.

Ahora sí me voy a cenar, mañana será al gran día (a ver cómo me sale la quincena ).

Un abrazo parseado.
Responder Con Cita
  #15  
Antiguo 15-12-2006
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 25
Crandel Va por buen camino
Cita:
Empezado por seoane
Muy cierto Crandel, es mejor poner la propiedad size a cero. Por cierto, no comentas que te parece el resto del código.
Por un lado te comento que tu función SendRequest funciona de maravillas, yo estaba implementando mi programa con TidHttp y tenia problemas que no me guardaba la sesión de conexión, entonces cuando una vez me autentificaba y luego pedia otra página que necesitara parametros (signo ? despues de la dirección de la página) ya me pedia que me registre de nuevo.

Ahora lo implemente con SendRequest y no tengo ese problema, en realidad se adapta mejor a mi problema porque realmente simula que es el IE y no un programa de automatización

Por otro lado estoy usando una clase llamada THTMLParser para analizar el texto de las paginas web con buenos resultados, ya me pondre mas a delante a estudiar "Expresiones regulares" que parece ser una mejor herramienta.
__________________
[Crandel]
Responder Con Cita
  #16  
Antiguo 16-12-2006
Avatar de Roger007
Roger007 Roger007 is offline
Registrado
 
Registrado: oct 2006
Posts: 9
Poder: 0
Roger007 Va por buen camino
Viendo todo esto: ¿Se podria ejecutar un navegar pasandole los parametros necesarios para el login?

Ejemplo:

Código Delphi [-]
WinExec('C:\Archivos de programa\Internet Explorer\iexplore.exe http://clubdelphi/foros/login.phpvb_login_username=usuariovb_login_password=password s= do=login',1);

O algo asi, para que habra el navegador con la web del foro y ya logeado con mi usuario y password.

Un saludo, Roger.
Responder Con Cita
  #17  
Antiguo 16-12-2006
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 25
Crandel Va por buen camino
Lo que puedes hacer, es usar la función SendRequest de seoane con la que te logueas, y luego envias la orden que se habra la pagina que quieras con el IE sin necesidad de mandar parámetros.

No lo he probado pero deberia funcionar.
__________________
[Crandel]
Responder Con Cita
  #18  
Antiguo 16-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Cita:
Empezado por Roger007
Viendo todo esto: ¿Se podria ejecutar un navegar pasandole los parametros necesarios para el login?
Pues no lo he probado, pero pasarle los parámetros por Get no es lo mismo que pasarle los parámetros por Post. Si el diseñador de la pagina ha tenido en cuenta la posibilidad de pasar lo parámetros por Get, puede que funcione, aunque lo mas seguro es que no.

Cita:
Empezado por Crandel
Lo que puedes hacer, es usar la función SendRequest de seoane con la que te logueas, y luego envias la orden que se habra la pagina que quieras con el IE sin necesidad de mandar parámetros.
No creo que eso funcione, cuando nos logueamos con mi función recibimos un identificador de sesión, un identificador que solo es valido dentro de nuestra aplicación. Así que si abrimos el explorador, este estará dentro de una sesión nueva, a menos que seamos capaces de enviarle de alguna manera el valor de la cookie de sesión, aunque lo veo difícil.

Lo que si podríamos hacer en el caso del ClubDelphi, es loguearnos usando la función SendRequest, pero marcando la opción "Recuerdame", de esta forma la información de login se guardara en una cookie persistente que la nueva ventana del explorer si podrá utilizar.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Automatizacion de word (generar documentos) alt126 C++ Builder 4 24-04-2007 04:19:27
Automatizacion de word (insertar tablas) alt126 C++ Builder 2 04-11-2005 10:44:29
Consejo Automatizacion Excel Builder C++ alt126 C++ Builder 0 14-04-2005 10:52:04
HTTP Indy bochi Internet 1 27-12-2003 01:57:34
Http Server ebeltete Internet 0 17-05-2003 02:57:39


La franja horaria es GMT +2. Ahora son las 08:05:44.


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
Copyright 1996-2007 Club Delphi