PDA

Ver la Versión Completa : enviar información desde excel a una pagina WEB


fqm33
16-08-2016, 20:53:57
Buenas tardes, es mi primera participación directa en el foro, sin embargo desde hace años he venido buscando información aquí y me ha sido de gran ayuda, sin embargo no he encontrado lo que paso a preguntar, necesito realizar una aplicación que me permita entrar a una pagina por medio de usuario y contraseña, estos datos son dinámicos pues son entregados al usuario por medio de un token, luego de entrar a la pagina debo ingresar unos datos que están en una tabla de excel. este procedimiento me arroja dos datos, los cuales debo incorporar a la fila de excel del archivo de origen, he buscado y encontré información sobre archivos XML, sobre Indy, wininet, y por mucho que he leído, no he logrado avanzar, quisiera una luz al respecto desde donde comenzar ojala de ceros pues al leer la información que les comento me quedo corto. muchas gracias, (si he fallado en la guía de estilo perdonaran es mi primera participación). olvida decir que tengo delphi 7 Enterprise,

Casimiro Notevi
16-08-2016, 20:56:35
¿En qué parte necesitas ayuda?
Yo no entiendo mucho de ese tema, pero otros compañeros podrán ayudarte.

fqm33
16-08-2016, 21:04:31
gracias por la respuesta tan rápida. necesito que delphi me lea la fila de excel, llene el formulario de la pagina web, con esto la pagina me genera dos datos, esos datos necesito llevarlos a la hoja de excel a la misma fila del archivo de origen. ademas dentro del formulario hay una lista desplegable, para elegir una opcion (siempre es la misma), y se deben dar click a un botón, (muy complicada la explicación?). gracias.

Casimiro Notevi
16-08-2016, 21:08:55
Si está claro lo que quieres conseguir. Mi pregunta era más bien en qué parte necesitas ayuda. Qué no sabes hacer de eso.
Divide el trabajo en pequeñas partes y ve haciendo cada una, no pienses como un "todo". Primero busca cómo conectar a una web. Cuando lo consigas busca cómo descargar el excel. Cuando lo consigas... etc. etc.
Paso a paso.

fqm33
16-08-2016, 21:26:07
Gracias Casimiro; pues se traer los datos de excel a un grid o DBgrid, se escribir los datos a excel, pues he hecho algunas aplicaciones locales que lo hacen; pero nunca me he conectado a una pagina web desde delphi. de nuevo gracias por el interés

bitbow
16-08-2016, 21:28:29
Creo que es uno de los pocos casos en que te recomendaria Intraweb y desde ahi haces todo.

Casimiro Notevi
16-08-2016, 21:32:43
.pero nunca me he conectado a una pagina web desde delphi Bien, pues eso te preguntaba, que especificaras exactamente qué necesitas. Por cierto, no olvides leer nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), gracias.

Haz una búsqueda en los foros por este concepto (https://duckduckgo.com/?q=intraweb+site%3Awww.clubdelphi.com&t=canonical&ia=web).

fqm33
17-08-2016, 02:19:30
buenas gracias a todo, siguiendo la sugerencia de bitbow, he encontrado un manual de intraweb, esta en ingles,ya comencé a leerlo a ver como me va, muchas gracias, por el gran interés de parte de ustedes.
en otro lugar encontré como abrir una pagina web con shellExecute, me abre perfecto pero ahora el siguiente paso es poder entrar el usuario y la contraseña (estos dos datos cambian cada vez pues son suministrados por un token, por lo tanto se deben dar directo en la pagina), y ahora en vez de una pregunta, tengo dos, la primera Shellexecute es el camino correcto? (sus opiniones por favor), y la segunda como hago para que el foco vaya al campo de usuario de la pagina web. muchas gracias.

fqm33
17-08-2016, 03:53:42
buena noches, les comento que siguiendo con el ShellExecute, ya solucione lo del usuario y contraseña, pero ahora debo dar click en una opción del menú que se llama "captura cliente por Crédito", ya baje el código fuente, sin embargo la duda es como se donde esta esa opción pues en el código fuente no aparece ningún texto así.

les voy contando paso a paso como voy avanzando pues como soy nuevo en esto de la WEB, cualquier aporte para mi es valioso,
muchas gracias,

mamcx
17-08-2016, 20:19:27
No veo que pinta intraweb aqui.

Lo que fqm33 esta pidiendo es como hacer web scrapping o automatizacion web.

Primero que todo, es usando ese formulario la unica forma? Seria ideal si pudieras hacer un api para ello.

De lo contrario, tienes es que saber como parsear HTML y hacer llamadas POST & GET.

fqm33
18-08-2016, 01:30:09
Gracias mamcx, algún manual que me puedas recomendar, y una pregunta es ShellExecute el camino, o reinicio por otro?, pues les cuento que ando bastante confundido con este tema, que no he podido cogerlo como es, de nuevo gracias a todos,

Delphius
18-08-2016, 04:37:54
Con los Indy puedes hacer el trabajo.
Básicamente le indicas a un TidHTTP la página a navegar (en lo posible utilizar sólo GET pero quizá en alguna parte necesites enviarle un POST) y luego interpretas el HTML devuelto. Puedes usar algún Parser de HTML, o bien hacer el trabajo a mano.
El truco está en pasarle a la URL los parámetros que solicita del formulario. Básicamente la URL espera algo como: www.lapagina.php?param1=valor1&param2=valor&...paramN=valorN

Utiliza las herramientas que tanto Firefox como Chrome ofrecen.
La parte más complicada es pasar la seguridad de usuario y contraseña. Existe la posibilidad que los datos pasados a los parámetros en este etapa no vayan en texto plano. Vas a tener que hacer un poco de ingeniería inversa a la página ;) Si no logras sortear esa etapa es muy poco probable que puedas ir al 2do paso que es en última lo que necesitas. Si el sitio está bien diseñado, e implementa una buena seguridad hasta es probable que todo viaje de forma cifrada.

Si el sitio ofreciera un WebService la cosa sería más llevadera y relativamente más sencilla.

Saludos,

fqm33
19-08-2016, 20:59:42
gracias a todos, había olvidado algo muy importante, y es que la pagina a la que quiero acceder solo funciona con Interner Explorer, voy a tratar con las Indy aunque reconozco que no se nada al respecto pero me voy a documentar, por los comentarios que ustedes han hecho supongo que el shellexecute no es el camino indicado?.
muchas gracias.

Casimiro Notevi
19-08-2016, 21:22:14
... la pagina a la que quiero acceder solo funciona con Interner Explorer... ¿Existe algo así?

Delphius
19-08-2016, 22:32:55
¿Existe algo así?
Pues si... y no necesito irme demasiado lejos, te podría citar por ejemplo la página de un organismo público que queda a 8 cuadras de mi casa. La página brinda un servicio de mucha importancia para los agrimensores e ingenieros civiles de acá y se ven condicionados a emplear IE para poder utilizarlo.
Es más, hasta da problemas en versiones nuevas de Windows. En XP funciona bien, mientras que en Windows Vista y 8 tiene sus fallos y en ocasiones hace falta recargar la página varias veces para poder acceder. Todo esto por culpa de un maldito plug-in que fue diseñado para IE6 y nunca más se renovó ni el Depto de dicho Organismo se calentó en migrar las cosas a una mejor tecnología.
Como yo tengo contacto con varios de los profesionales que consultan al organismo de vez en cuando recibo llamadas por problemas por eso, y tengo que responder que lamentablemente no depende de mi.
Hace no mucho también me reportaron que otro de los servicios que brindan, empezó a dar problemas en Windows superiores a XP. Es algo curioso ya que ese servicio al menos podía usarse en otros navegadores... pero se ve que el Depto de Informática del organismo a estado trasteando algo.

Estas cosas pasan cuando un gobierno decide tranzar con Microsoft.

También lo hace la Dirección de Rentas de la provincia, y se que algunos sistemas y servicios web de la AFIP también funcionan con tecnología basada en IE y dan problemas con otros navegadores.

Saludos,

Casimiro Notevi
19-08-2016, 22:35:51
Sí, pero una cosa es que dé problemas y otra es que no se pueda acceder.

Delphius
19-08-2016, 22:41:25
gracias a todos, había olvidado algo muy importante, y es que la pagina a la que quiero acceder solo funciona con Interner Explorer, voy a tratar con las Indy aunque reconozco que no se nada al respecto pero me voy a documentar, por los comentarios que ustedes han hecho supongo que el shellexecute no es el camino indicado?.
muchas gracias.
Si sólo anda con IE, no te puedo garantizar que tanto sea posible hacerlo con Indy... Se supone que Indy no depende de IE ni lo emula. Desde Indy 10 pone esfuerzo en ser multiplaforma ya que es compatible con Lazarus, y éste es Multiplataforma.

Tienes algo de chances mientras el uso de dicho sitio no haga usos de complementos o plug-ins, etc que sean propios de IE. Pero yo no te garantizo nada.

Saludos,

Delphius
19-08-2016, 22:47:37
Sí, pero una cosa es que dé problemas y otra es que no se pueda acceder.
Para los casos que yo cité es lo mismo. Logres o no, acceder, da problemas. En ocasiones logras entrar con la cuenta, pero quieres usar un servicio y pum. En otras ni entras.

Te condicionan a usar IE.

Saludos,

Casimiro Notevi
19-08-2016, 23:37:29
A ver si fqm33 nos indica la página que es, y la probamos.

fqm33
20-08-2016, 00:18:15
buenas tardes, me explico el sistema funciona en otros navegadores pero cuando entramos a las opciones tiene fallos de manera recurrente si no es IE. por eso solo se usa IE.
señores noto el interés por ayudarme y lo agradezco, entonces ahora por favor orientenme estudio las Indy, sigo con shellExecute, Intraweb?, que seria lo mas recomendable? en su experiencia, de nuevo muchas gracias.

Casimiro Notevi
20-08-2016, 00:25:21
... orientenme estudio las Indy, sigo con shellExecute, Intraweb?, que seria lo mas recomendable? en su experiencia, de nuevo muchas gracias.
Tendrás que explicarnos detalladamente lo que intentas hacer, datos, información, la web... etc.
En caso contrario solamente podemos dar información general.

Delphius
20-08-2016, 01:47:51
Usar el TIdHTTP es relativamente simple:

HTTP := TidHTTP.Create;
try
HTTP.Post(laurl);
finally
// hacer algo más
HTTP.Free;
end;

Ese es un ejemplo burdo de como navegar una URL. El componente en cuestión tiene varios métodos Post y Get sobrecargados. El que más te interesa es uno que recibe como parámetro adicional un Stream en donde puedes recibir el código fuente.

Post se utiliza mayormente para enviar y navegar a una web con ciertos parámetros, Get por su parte para solicitar devolver una web. Después de un Post suele haber un Get. En ocasiones se puede prescindir de Post y es posible directamente hacer un Get sobre la url y pasándole los parámetros.

En el foro ya una vez comenté sobre esto. Busca.

Pero insisto y apoyo a Casimiro, no nos has dicho cual es la web ni aportaste información adicional. Si tuvieramos algún dato extra como para ver si es posible encararlo de esta forma (que a mi entender de la que te estaban indicando es la más apropiada). Como he dicho: la primera barrera está en como la página recibe el usuario y contraseña y si los datos van cifrados y/o se reciben cifrados.

Saludos,

fqm33
25-08-2016, 14:48:45
buenos días, no les había podido contestar (ni agradecer), para casimiro y delphius, les comento, mas detalladamente el proceso
se ingresa a la pagina
la empresa propietaria de la web, le entrega un token al usuario este puede ser físico o virtual, dicho token ya tiene un usuario base, y la contraseña se genera cada vez que ingreso, pues el token genera contraseñas cada varios segundos para dicho usuario, por lo tanto ese paso no se puede automatizar pues el dato se debe ingresar respecto a la contraseña generada. hasta ahí no tengo problema,

luego de esto doy click en siguiente, y de ahí en adelante es cuando debo automatizar el proceso que es el siguiente:
escoger una opción del menú y del submenu (que siempre son las mismas - (hacer click en las opciones).
ingreso tipo de documento de una lista desplegable, numero de documento, nombre y apellidos
hago click en aceptar
se despliega otra pantalla
ingreso un numero de 17 dígitos pero en formato texto
otros datos como vendedor, dirección, ciudad, departamento, y
se hace click en aceptar
el sistema de la pagina con esa información me arroja otro numero en formato texto de diez dígitos,
ese dato lo debo tomar y grabar en mi tabla de excel desde donde estoy enviándole los datos a la pagina

así debe repetirse con todas las filas del archivo de excel hasta que termine, dicho archivo normalmente tiene de 5000 a 10000 registros sin embargo puede llegar el momento que el archivo a leer tenga menos de 1000.
la dirección de la pagina se las podría enviar pero de manera privada no por el foro, indiquen sus dos correos o la forma de hacerlo, sin embargo el solo les mostraría la pagina donde se debe ingresar el usuario y contraseña. como comentario final estoy leyendo una guía de Indy. muchas gracias por su colaboracion

Delphius
25-08-2016, 18:56:27
luego de esto doy click en siguiente, y de ahí en adelante es cuando debo automatizar el proceso que es el siguiente:
escoger una opción del menú y del submenu (que siempre son las mismas - (hacer click en las opciones).
ingreso tipo de documento de una lista desplegable, numero de documento, nombre y apellidos
hago click en aceptar
se despliega otra pantalla
ingreso un numero de 17 dígitos pero en formato texto
otros datos como vendedor, dirección, ciudad, departamento, y
se hace click en aceptar
el sistema de la pagina con esa información me arroja otro numero en formato texto de diez dígitos,
ese dato lo debo tomar y grabar en mi tabla de excel desde donde estoy enviándole los datos a la pagina

así debe repetirse con todas las filas del archivo de excel hasta que termine, dicho archivo normalmente tiene de 5000 a 10000 registros sin embargo puede llegar el momento que el archivo a leer tenga menos de 1000.
la dirección de la pagina se las podría enviar pero de manera privada no por el foro, indiquen sus dos correos o la forma de hacerlo, sin embargo el solo les mostraría la pagina donde se debe ingresar el usuario y contraseña. como comentario final estoy leyendo una guía de Indy. muchas gracias por su colaboracion
¡Vaya lio de proceso te espera!
Pues como he dicho, deberás aplicar un tanto de ingeniería inversa... examina el HTML que te regresa el server para ver como está presentada la página. También deberás hacer uso de las herramientas de desarrollor que ofrecen Firefox y/o Chrome para examinar que parámetros, orden, y como se pasan los valores...

Por ejemplo, tomemos esa lista desplegable para el tipo de DNI. En el HTML deberías ver algo como esto:

<select name="Tipo DNI">
<option value="1">(DNI) Documento Nacional de Identidad</option>
<option value="2">(LE) Libreta de Enrolamiento</option>
<option value="3">(LC) Libreta cívica</option>
<option value="4">Pasaporte extrangero</option>
</select>

El ejemplo está inspirado en el sistema Argentino.

Bueno, entonces ahora con la herramienta de Chrome para desarrolladores revisas la URL decodificada devuelta... probando con las diferentes opciones... Digamos que tu seleccionas LE, y ves un parámetro con nombre medio raro pIdType (es una manera de despistar a los curiosos del nombre real) y que justo recibió el valor 2. Repites el proceso cambiando opciones y así vas viendo si es una coincidencia.
Hagamos de cuenta que efectivamente el pIdType se corresponde al DNI y lo que se termina pasando es el valor asociado a <option>

Eso deberás ir haciendo para todo los parámetros... Pero en cuanto veas algo como OIUBKOJL224%e3$ ¡La tienes jodida! ¡Es un dato que va cifrado o vaya a saber de donde lo sacó!
Si tienes suerte, todo va sin cifrar y ya tienes ideas de como armar una URL y pasarle los valores a cada parámetro.

El trabajo final que te queda es obtener el HTML que te regresa y estudiarlo para recuperar ese número de 10 cifras.
Acá debo hacer una advertencia: No necesariamente el HTML que te devuelve Indy será igual al que veas con Firefox por ejemplo. ¿Porqué? Porque Indy devuelve el HTML en "original"... con sus posibles erratas de parte del desarrollador al elaborar el sitio mientras que FF, Chrome, Opera, y los demás van a tratar de armar el HTML de la mejor manera que cumpla con el estándar W3C. Un buen ejemplo: los navegadores van a tratar de poner los tags de cierre a las etiquetas opcionales.

Ya he dicho bastante, con esto deberás tener una buena idea de como encarar el trabajo.
Más no te podemos ayudar.

Saludos,

fqm33
26-08-2016, 23:44:07
Excelente, muchas gracias, encontré un archivo de indy. parece que están todos lo comandos, (voy en la pagina 300 de mas de 3000), sin embargo no tiene ejemplos, este tema me esta dando tan duro como cuando quise hacer por primera vez una conexión a base de datos sin el asistente del ADO, me demore pero lo hice espero que con este me pase lo mismo. ya encontré la lista desplegable, del tipo de documento. en el código fuente de la pagina, muchas gracias, por la orientación,

Delphius
27-08-2016, 00:12:09
Excelente, muchas gracias, encontré un archivo de indy. parece que están todos lo comandos, (voy en la pagina 300 de mas de 3000), sin embargo no tiene ejemplos, este tema me esta dando tan duro como cuando quise hacer por primera vez una conexión a base de datos sin el asistente del ADO, me demore pero lo hice espero que con este me pase lo mismo. ya encontré la lista desplegable, del tipo de documento. en el código fuente de la pagina, muchas gracias, por la orientación,
¿Comandos?
No hay ningún comando.
Me di cuenta que estás bastante perdido en cuanto leí la palabra "comando".
Esto es Delphi, Object Pascal; no hay comandos.
Lo que hay son clases, objetos, y lo que tu dices "comandos" son los métodos (funciones y/o procedimientos) que ofrecen las clases.

Si quieres hacer esto en serio, entonces toma las cosas en serio y empieza a utilizar los conceptos como corresponden. Evidentemente no vienes de una formación previa. Sugiero que leas La Cara Oculta de Delphi 4... te ayudará a canalizar las cosas a buen puerto. Parecerá viejo por lleer "Delphi 4", pero sus conceptos siguen vigentes y/o se pueden extrapolar a lo nuevo.

La documentación oficial de Indy la puedes consultar (http://www.indyproject.org/sockets/docs/index.en.aspx). Aunque si es cierto que no se caracteriza por tener demasiados ejemplos.

Para que te hagas una idea de como deberías trabajar con TidHHTP y navegar un sitio, mira esto (http://stackoverflow.com/questions/13950676/how-to-check-url-with-idhttp).
Y como he dicho, en otro hilo (http://clubdelphi.com/foros/showthread.php?t=89552) yo ya había comentado sobre Indy+Post+recuperar HTML. Si bien en esa oportunidad apunté al uso de Indy con Lazarus (que es lo que uso actualmente), estimo que las cosas con Delphi son iguales o bastante similares.

Saludos,

fqm33
23-09-2016, 15:36:36
Buenos días a todos, tomando de nuevo el tema en el que muy amablemente me están ayudando, tome la sugerencias de Delphius y casimiro, y he leído mucho al respecto, aunque por cuestiones de ocupaciones varias no he avanzado mucho, les comento que ya envio la información del usuario y contraseña a la pagina. muchas gracias, por eso, lo estoy elaborando con Webbrowser, sin embargo me he encontrado que después de entrar el usuario y su clave, con el siguiente código

procedure TF_activa.xpButton1Click(Sender: TObject);
begin
Webbrowser1.OleObject.Document.GetElementByID('ctl00$ContentPlaceHolder1$txtUserIni').SetAttribute(' value', 'ECM1112A');
Sleep(250);
WebBrowser1.OleObject.Document.Forms.Item(0).elements.item('ctl00$ContentPlaceHolder1$BtnIngresar'). Click;
end;

y funciona bien

al tratar de entrar un click en uno de los botones del menú, se saca un error de violación de memoria,
el código es el siguiente


procedure TF_activa.xpButton3Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.Forms.Item(1).elements.item('button2').Click;
Sleep(250);
end;

como ven lo monte en otro botón, pero también lo he intentado en el procedimiento anterior, y el error es el mismo, de nuevo muchas gracias por su ayuda

bitbow
23-09-2016, 16:35:24
No manchen, quien anda resucitando post de la prehistoria?

Casimiro Notevi
23-09-2016, 17:07:52
Buenos días a todos

Recuerda poner los tags al código fuente, ejemplo:

http://www.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)

fqm33
23-09-2016, 22:13:47
Casimiro, gracias por el comentario lo tendré en cuenta para la próxima, y bitbow, te comento, soy nuevo en el tema de Internet tengo delphi 7 enterprise, he usado lo que voy aprendiendo, si tienes una forma mas eficiente que me sirva para esta versión de Delphi bienvenida sera.

bitbow
23-09-2016, 22:28:12
Una disculpa, estaba viendo la fecha de un usuario (2006), no recuerdo bien de que iba el tema pero veo que tiene solo unos meses.

Saludos.

fqm33
24-09-2016, 05:53:52
no problema bitbow, bueno y yendo a mi pregunta, creo que el problema (fuera de no saber), es que cuando entro la contraseña, el me envía a la pagina del menú, por supuesto los items no los mismos, entonces la pregunta puntual es, como hago referencia a un elemento (id) de la pagina que me esta mostrando el webbrowser en ese momento si la cuenta de los items ya no es la anterior que tenia el Webbrowser?, (creo que esta mas difícil entender la preguntar que solucionarla, pero no encuentro una forma mas técnica de decirlo), gracias muchachos cualquier aporte es valioso.

fqm33
26-09-2016, 18:25:13
De nuevo buenos días, sigo con mi proyecto, y ahora me encuentro que debo seleccionar de una lista desplegable una opción (siempre la misma), como me indico Delphius hace algunas semanas encontré el código HTML, sin embargo opte por Webbrowser ( no se si es la mejor elección, pero es de la que mas encontré documentación), y necesito por favor ayuda para poder seleccionar esa opción con el Webbrowser, muchas gracias.

bucanero
27-09-2016, 19:23:36
Por lo que explicas de tu problema, se parece mucho a un sistema que tuve que desarrollar hace un tiempo para poder subir un catalogo de productos generado en CSV a una web de ventas de terceros.

Las instrucciones que esta web facilitaba para explicarle al usuario la subida de productos era el mismo proceso que indicas.
1.- Abres tu fichero CSV con EXCEL (Este CSV contiene los datos de los productos que vas a dar de ALTA)
2.- copias solamente la columna de tus códigos de producto a una pagina en blanco y la guardas como un nuevo CSV que
envías a través de su panel de administración, al que se accede con validación de usuario y clave,
3.- Descarga un nuevo CSV que te devuelve el sistema de ellos donde han añadido una columna mas junto a la los códigos tuyos de producto con un identificador que ellos le asignan a tus productos (el orden de los productos en este nuevo CSV es exactamente igual al que se le envía),
4.- Ahora abres este nuevo CSV también en EXCEL y copias la columna que ellos han añadido insertandola delante de tu columna de codigos, y gurdas de nuevo el fichero que ademas contiene el resto de la información de producto (nombre, descripción, precio, stocks ... ).
5.- Sube ese nuevo fichero de nuevo a la web para que se terminen de publicar los articulos.

Este proceso en realidad esta explicado en sus instrucciones de forma, por eso se abre con EXCEL, que el usuario lo vea simple,
y ademas poder hacerlo totalmente manual a partir de un listado de productos en CSV o incluso desde cero.
EXCEL salvo para tener claro que hacer en cada momento no lo necesite para nada.

En mi caso en particular para automatizarlo, utilice PHP y el proceso de envío lo hice a través de las librerías CURLS,
pero el proceso al final es muy parecido a como se haría en delphi
En todos las consultas CURLS o en delphi (TIDHTTP) es necesario incluir las cabezeras de identificación.

En cuanto a los datos a enviar, ademas de añadir el fichero CSV, también hay que añadir de forma manual los campos que monta el form de la web de ellos con las opciones que se desean seleccionar (Este es el método que te explico Delphius un poco mas arriba), en mi caso estas opciones siempre son las mismas y no suelen cambiar, y el envío para poder enviar un fichero se hace por el método POST.


Si todo va bien, en mi caso devuelven un numero, que es el identificador del fichero que has enviado en el sistema de ellos, a partir de este numero los siguientes ficheros de descarga son fáciles de identificar, pues siempre lo suelen incluir.

Y en cuanto a las respuestas de la pagina, suelen ser paginas relativamente cortas, con identificadores fáciles de encontrar dentro del código HTML, y se trata de buscar los enlaces que devuelve para la descarga de los ficheros que ellos te generan (realizar una especie de parseador, junto al identificador de fichero obtenido anteriormente)

El mayor problema esta en:
- acceder al área privada, a veces es necesario poner cierto parametros concretos en las cabezeras de envio,
- Saber que campos con sus correspondientes valores tienes que enviar
- y que datos vas a recibir.

No se si este caso que explico es parecido o similar a lo que quieres realizar
Si necesitas mas información, te puedo orientar

Un Saludo

Al González
27-09-2016, 20:15:48
En estos días de mensajes de 140 caracteres que duran no más de 140 segundos en la mente del lector, cualquier ayer es prehistoria. :rolleyes: :p

fqm33
30-09-2016, 03:33:37
Buenas Noches, compañeros, gracias por las respuestas, Bucanero tienes razón, lo que estoy tratando de crear es muy parecido, a lo que indicas, con alguna modificación muy pequeña (no se que tanto en código), que cuando lleno la información del formulario WEB desde Excel, el sistema verifica la información y me arroja un dato, que debo cargar al registro de Excel, y así con cada fila, y claro bucanero estoy muy interesado en tu asesoría y en la de todos, aunque tengo muchos vacíos, he aprendido un montón con sus comentarios.
como indicaba anteriormente estoy usando WebBrowser, y ahora estoy en la selección de una opción de un combobox, aquí el código HTML.


</td>
<td class="fila1">
<select name="ctl00$ph$ucProds$ddlClasificacion" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ph$ucProds$ddlClasificacion\',\'\')', 0)" id="ctl00_ph_ucProds_ddlClasificacion" tabindex="2" class="comboBox";">
<option selected="selected" value="">&lt;&lt;Seleccione&gt;&gt;</option>
<option value="29">Activa1</option>
<option value="27">Activa2</option>
<option value="28">Activa3</option>

</select>
</td>


he tratado de usar varias(muchas) alternativas para escogerla pero ninguna me funciona, anexo una que cuando doy click dice metodo no soportado, sin embargo otras sacan otros tipos de error.
esta y las demás las he encontrado navegando por ahi,


WebBrowser1.Oleobject.Document.GetElementByID('ctl00$ph$ucProds$ddlClasificacion').GetElementsByTagN ame('Option').element.GetAttribute('28').Click;


agradecería un ejemplo de como realizar la selección, o una forma mas optima y/o técnica de realizarlo, de nuevo muchas gracias.

Delphius
30-09-2016, 06:07:59
Yo no he usado el TWebBrowser, no al menos para algo como lo que pretendes hacer.

Yo no buscaría simular/emular las acciones por medio del Browser como si fuera un usuario... Al menos eso es lo que me queda y entiendo que estás intentando hacer. De lo que estoy percibiendo, pareciera, por ese código que estás intentando ejecutar un Click sobre una lista desplegable por medio del TWebBrowser.

Yo, como te dije, buscaría la forma de hacerlo por otra vía. Le pediría a la página que directamente me de los datos, y le pasaría los parámetros finales. No me tomaría la "molestia" de simular clics, seleccionar opciones, etc. Directamente le solicito al server lo que necesito y que el se encargue de generarme la página HTML final para que yo lea y guarde en mi archivo de excel, una base de datos, o lo que fuese lo que realmente necesito poder recuperar y tener de manera persistente.

Nota que todo con lo que interactúes se traduce en última en un valor que el escript php/asp se encargará de recibir por medio de un parámetro.

Necesariamente debe haber un trabajo de ingeniería inversa y ponerte a estudiar como es que recibe los datos.
Como te dije unos post antes... una selección por ejemplo desde una lista desplegable se traducirá en un valor que luego la página recibe como parámetro. De igual forma lo que le pongas en algún Edit/Caja de texto o como le llames. Al final todo se traduce en una orden POST o GET sobre la página y se le pasará los parámetros.
Empieza a hacer ese trabajo de ingeniería... prueba con cada opción, y fíjate que se le manda como parámetro, y como se construye la URL final.
Si no tienes idea de como hacer eso ¡dilo!

Luego simplemente lo que debes hacer es pedirle al componente Indy o el TWebBrowser que navege a esa URL. ¡Te evitas estar jugando la página! Directamente decile: "Mirá, dame esto". Y si el proceso implica interactuar con 2 o 3 páginas, no importa... cada una estará diseñada justamente para recibir los parámetros que espera. Lo que tu debes hacer es navegar en el orden correcto cada una y recuperar del HTML generado lo que necesites.

A lo que voy es que si no te tomas la molestia de hacer la ingeniería inversa vas a seguir lidiando con clicks, que navegar, esperar respuesta, volver a mandar otro click, etc.

Mi propuesta es justamente evitarte eso: ir a los bifes. Si tu proceso te lleva a lidiar con 3 o 5 páginas, no interesa. A todas les debes revisar como y que se pasan como parámetro.

Te estás complicando al pedo, y te lo digo con todo respeto. Y para poder ayudarte mucho más vas a tener que dejar de lado ese estado de secretismo. No hay otra forma de saber que estas haciendo realmente, si lo estás haciendo bien, o que... Ayúdanos a ayudarte. De otra forma seguirás lidiando y dando vueltas en lo mismo.

Saludos,

fqm33
30-09-2016, 07:18:08
Buenas Noches, Delphius tomo nota de tus comentarios gracias, pues lo que dices es precisamente lo que estoy haciendo (simulando acciones), cuando dices ingeniería inversa es mirar el código HTML?; les comento lo que he ido haciendo:
- abro la pagina (webbrowser)
- ingreso el usuario - Webbrowser1.OleObject.Document.GetElementByID('ctl00$ContentPlaceHolder1$txtUserIni').SetAttribute(' value', 'ECM1112A');
- me abre la pagina de la contraseña
- ingreso la contraseña que genera el token
- me abre la pagina del menú principal - escojo la opción del menú (href)

link := WebBrowser1.OleObject.Document.GetElementsByTagName('a');
for i := 0 To Link.length -1 do
if pos('/ACTIVACIONES/Http/Reingenieria/pagDispatcherEntrada.asp?Site=14',Link.item(i).href) <> 0 then
Begin
Link.item(i).Click;
Sleep(100);
End;


- me abre la pagina del ingreso de datos (hay es donde aparece el combobox del que les hablo) - hay voy.

como lo he hecho

miro el código fuente de cada pagina y asigno los clicks, que he ido necesitando, llenado los campos solicitados, y avanzando a los href correspondientes. Ahora he llegado a la pagina donde ingreso los
datos, dependiendo de la opción que seleccione, aparecen otros campos para llenar, y cuando acabo de llenar los campos se da click en un botón y el arroja el dato que necesito llevar a mi hoja de Excel.
No es ningún gran secreto (ja ja ja), es solo un aplicación para la empresa donde trabajo. tienes razón en que no tengo idea; Delphius dices que simular las acciones como si fuera un usuario,
y es que esa es la situación, a la empresa donde trabajo le asignan un usuario, y la contraseña se nos da por medio de un token. Ademas dices que esa no es vía - y creo que tienes razón, - pues te
comento por esta vía voy a pasos muy lentos, pero por las Indy que tu me recomendaste (y que la mayoría recomiendan), pues no encontré información básica como para ir aprendiendo y aplicando.
Agradezco sus orientaciones, y muchas gracias por tomarsen el trabajo de leer, analizar mis notas y apoyarmen.

Delphius
30-09-2016, 08:30:04
Ahora estoy por ir a dormir. Explicarte en profundidad el concepto de ingeniería inversa para este caso no me es posible ahora.
Si puedo darme un tiempo mañana por la tarde explico mejor el tema.
Y si en Delphi Starter está disponible Indy (no recuerdo ahora con seguridad si esta disponible) veo la posibilidad de dar un ejemplo básico para que te hagas una idea y extrapoles a tu caso.
Por lo pronto puedo decir que la idea es examinar con las herramientas para desarrolladores de los navegadores como se pasan los datos a los parámetros y de ir probando con la página hasta encontrar el dato en cuestion y de donde sale.
Si dices que todo depende de un token y una contraseña desde algún lado ese dato les he entregado. Si no es por medio o difundido desde el propio sitio, o bien haces que ese dato sea llenado por el usuario o le preguntas a él de donde lo saca y ves si hay forma de automatizarlo.
La ultima lección que te dejo es que no todo se puede (ni debiera) automatizar.

Saludos

fqm33
05-10-2016, 06:22:26
buenas noches, compañeros, les comento que ya supere lo del combobox, y ya pude escoger la opción, encontré este código, y me ha funcionado bien,

cb := WebBrowser1.OleObject.Document.GetElementByID('ctl00$ph$ucProds$ddlClasificacion');
cb.value := '28';
cb.FireEvent('onchange', v);

luego de esto viene el ciclo donde debo llenar los campos de la web, y traer lo que esta me arroja
inicialmente encuentro un input text, que corresponde al apellido del cliente; he tratado de llenarlo con este código
Webbrowser1.OleObject.Document.GetElementByID('ctl00$ph$ucFields$tbLastName').SetAttribute('value', 'rojas');
pero me saca error de violación de memoria, he aumentado el Sleep, pero sigue saliendo el mismo error, lo he probado con este otro pero me saca error metodo value no soportado

Webbrowser1.OleObject.Document.GetElementByID('ctl00$ph$ucFields$tbLastName').value, 'rojas');

Nota: lo de 'rojas', es por que estoy probando pero mas adelante debo asignarle el valor de la celda correspondiente

fqm33
10-10-2016, 02:54:33
Compañeros buenas noches; estoy en el mismo problema que les plantea de entrar el dato del apellido y lo he podido solucionar a medias, con el siguiente código
WebBrowser1.OleObject.Document.GetElementByID('ctl00$ph$ucFields$tbLastName').Value := Edit3.Text;, sin embargo sucede algo muy curioso (al menos para mi), si le pongo un
Showmessage, antes de la orden funciona pero si lo quito me sigue sacando error de violación de memoria, alguien me podría ayudar con esto, pues le he dado muchas vueltas y nada que le encuentro la solución, he pensado en automatizar el click sobre el boton del ShowMessage pero no se si se pueda hacer, he buscado pero no he encontrado información al respecto. de nuevo muchas gracias.

Delphius
15-10-2016, 18:29:42
He tratado de darme el tiempo para prepararte una especie de tutorial guiado de como proceder a realizar el proceso de ingeniería inversa. Pero tengo un par de trabajos que requieren de prioridad.
No estoy seguro de si es efectivamente los ids y names que tu mencionas pero es probable que si. Si es así, ya tienes la mitad hecho.

En pocas líneas el proceso de ingeniería inversa es examinar tanto el HTML e interpretarlo como examinar los parámetros que se esperan en cada página. Del HTML se trata de buscar aquellos elementos/datos que sirven tanto para mostrar al usuario, guardar en una base de datos, como así también los que serán de utilidad para saber que data y/o parámetros pasar a las páginas web para repetir o continuar con el trabajo.

Cuando se llega a la página final en tu caso (ya que debes interactuar con una serie de páginas, en cierto orden) lo que debes hacer es ir leyendo el HTML y extraer de éste lo que necesitas para pasar a tu archivo de excel. Estudia ese HTML, y si observas con atención muy posiblemente notes un patrón. Por ejemplo, digamos que el monto total de una factura se muestra en un tag p (tag de párrafo) que está en la línea 25, o que el detalle de la factura empieza en la línea 27 y el fin del detalle se detecta cuando se llega a una línea que tiene el tag de fin de tabla.
Teniendo eso como base simplemente lo que necesitas es pasar el HTML a un TStrings y proceder a leer las líneas y dentro de ésta en la "columna" adecuada. Para ello puedes ayudarte de funciones como Pos(), Copy() y demás funciones de tratamiento de strings. Es decir "leer" de cada líneas del HTML de interés el texto que necesitas y ahí ya pasarlo al excel.

Todo ese estudio previo es la ingeniería inversa. Y como he dicho y hasta incluso he comentado en otro hilo se puede evitar lidiar mucho si pasas a cada URL los parámetros adecuados. Si el proceso es tal que de pagina1 vas a pagina2 y así hasta paginaN. Debes hacer esto por cada pagina. La cosa se hace más sencilla si resulta ser que los elementos a buscar son siempre lo mismos y en la misma cantidad. Por ejemplo: digamos que pagina2 requiere como parámetro el tipo de DNI y el número. Es muy poco probable que la lista o combo para seleccionar el tipo de DNI se genere de forma dinámica (es decir, cada vez que se visita la página y desde el lado del server) y que cambie en cada visita. Lo de esperar es que esta lista sea fija. Entonces a esta página no necesitas hacerle reingeniería en cada ejecución. Si ya sabes que pasarle directamente se lo pasas al parámetro y ya está.
Distinto es cuando el contenido HTML de interés es totalmente dinámico y cambiante. Por ejemplo: la cantidad de items o artículos vendido de una factura. Para estos tipos de páginas vas a tener que leer cada vez el HTML y posicionarte en el lugar adecuado... Lo duro acá es estudiar el HTML para descubrir el "patrón". Cuando lo descifras, ya es cosa de implementar un algoritmo que sepa detectar la cantidad de items, etc.
Por ejemplo digamos que cuando la factura tiene un único item el HTML tiene 46 líneas. Entonces, si al leer el HTML generado observo que Count dice 79 es porque hay 33 items. Ya se la cantidad, y hasta incluso desde que línea a línea.

Es un trabajo tedioso hacer ese estudio, pero te garantiza de que vas a grano. Lees solamente lo que necesitas. No hay que estar interactuando con la página, nada de GetElementByID() o cosas así que demoran su tiempo. Estudia el "patrón" a cada página. Visitas la página, guardas el HTML de forma temporal y te vas a cada lugar clave.

Aquí hago una buena advertencia: el contenido HTML leído depende fuertemente del componente utilizado. Navegadores como FireFox y Chrome van a tratar de generarte el HTML completo y cumpliendo lo mejor posible el estándar. Distinto es si usas el componente Indy por ejemplo: éste recibe el HTML crudo, el que será producido por el server... y con las posibles pifias que pudiera haber cometido el desarrollor web al momento de programar el script.
Por tanto el HTML que leas y veas en un navegador no necesariamente va a ser el mismo del que puedas extraer desde el componente.

Sobre los parámetros que se necesiten en cada página ya he comentado: utiliza las herramientas que ofrecen Chrome o FireFox. Por ejemplo en FF: vas al Menú Desarrollador -> Red. En el Monitor de Red ve a la pestaña de Métodos y busca un GET sobre la URL con los parámetros. Seleccionalo. Ahora al costado derecho tienes la información exacta de la URL decodificada, los parámetros y sus valores.
Por ejemplo, visita el foros Varios de ClubDelphi. Si "auditas" la página notarás que detectará un único parámetro con el nombre f y el valor es 11. De esta forma podemos irnos a visitar cualquier foro de CD, si conocemos el "id" de cada uno simplemente con ir a la URL: http://clubdelphi.com/foros/forumdisplay.php?f=<ID>

¿De donde podemos sacar esos ID? Que te parece si examinamos la página principal: http://clubdelphi.com/foros/index.php. Dando una explorada al HTML encuentro que cada foro está listado así:


<div> <a href="forumdisplay.php?f=el id"><strong>Nombre del Foro</strong></a> <span class="smallfont">(42 Viendo)</span> </div>
Entonces, como se que es poco probable que estén poniendo y sacando foros, la cantidad es conocida. Es un trabajo de una única vez. Por caso, viendo el HTML puedo decir que Varios está en la línea 691.
SI quiero ir más lejos, y quiero hacer un sistema que me diga los últimos hilos de cada foro y el usuario que ha comentado también puedo hacerlo. Ahora el planteo es dinámico, el truco está en localizar el inicio y fin del tag tr que define la fila. En cada fila tengo separado en tag td el foro, el url e id del hilo, el usario, etc.

Espero que se entienda.
Si no sabes aunque sea lo mínimo de HTML, haz una pausa y aprendelo. Luego vuelve y empieza de nuevo con el sistema.
Más no puedo decir... sino ya es hacerte el trabajo. ¡Ya te he comentado todas las pistas y detalles! Y la verdad para serte franco, si no puedes lidiar con todo lo que dije, es que con todo respeto: no estás a la altura del trabajo.

Saludos,

Delphius
16-10-2016, 01:52:55
Y para que veas que soy considerado, como he dicho antes: ya había explicado en una oportunidad el tema (http://clubdelphi.com/foros/showpost.php?p=500503&postcount=8). Pero por lo visto ni te molestaste en buscar en el foro.

Combinando los conceptos: Navegar la URL codificada con los parámetros que necesita y luego procesar el HTML el trabajo se puede hacer lo que buscas.

El material está, el trabajo fuerte es sentarse y ponerse a estudiar el HTML de cada página involucrada, que parámetros necesita en cada caso. Para cuando entiendas el funcionamiento y operatoria del sitio podrás implementar tu propuesta.

Lo último (volcar la data a excel) ya queda peor tu cuenta.

Ya no tienes excusa. Todo se ha dicho, incluso hay hilos sobre como abrir un archivo de excel desde Delphi. Asi que el material está. No te sigas complicando con eso de lidiar con GetElementByID.

Saludos,