Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Problema al enviar PDF's vía WhatsApp Web (https://www.clubdelphi.com/foros/showthread.php?t=95751)

azdin 10-07-2022 20:50:20

Problema al enviar PDF's vía WhatsApp Web
 
1 Archivos Adjunto(s)
Hola comunidad, espero todos estén teniendo un excelente día :D

Para poner en contexto, me solicitaron que desarrollé un programa que guarde reportes de notas de estudiantes hechos en Excel en PDF y después estos sean enviados vía WhatsApp a los respectivos padres de los mismos. En teoría muy sencillo ya que todo estaba ordenado por códigos y números telefónicos en hojas de Excel. Guardar los reportes en PDF fue muy sencillo, una simple macro en VBA. El problema comenzó para enviar los PDF's por WhatsApp Web. Como debía enviar un mensaje a un número x desde el vamos usé el clic para chatear para el texto, pero tenía que ver la forma de enviar los archivos.

Opte por hacerlo apoyado por Selenium trabajando directamente en VBA desde Excel. En principio bien, me apoye del siguiente vídeo
Automate Image PDF Videos Upload Via WhatsApp - YOUTUBE

Pero después empezaron los problemas. De por sí no era eficiente con los tiempos de espera entre evento, es decir no se detectaba cuando ya había cargado la página o cuando ya el PDF se había terminado de subir para poder cambiar a otro número. También había problemas con la actualización de versiones de Chrome, Chromiun y Selenium. Por último lo más evidente cada vez que se quería trabajar en otra PC se debían instalar todos los componentes. La verdad un caos!

Así que me plantee hacer el mismo programa pero con Delphi, teniendo la ventaja del navegador incorporado. Bastaría con crear los PDF's desde Excel. Después seleccionar las carpetas donde están guardados e indicar la lista de códigos y números de WhatsApp.

Al menos eso pensé... Bueno de por sí el navegador de Delphi no soporta WhatsApp Web, así que procedí a instalar la versión más reciente que encontré del Componente Chromiun para Delphi. Aquí todo bien, después era solo cargarla la URL y ejecutar JS para que se dé Clic en los respectivos botones de envío. Tuve problemas para indicar el Path del archivo tal como se hacía en Selenium

Código:

driver.FindElementByXPath("//input[@accept='image/*,video/mp4,video/3gpp,video/quicktime']").SendKeys (filepath)
Así que opte por en vez de pasar las teclas directamente al elemento HTML, darle clic y enviar las pulsaciones con SendKeys hecho en Delphi.

Código Delphi [-]
 

procedure SendKeys(const S: String);
var
  InputEvents: PInput;
  I, J: Integer;
begin
  if S = '' then Exit;
  GetMem(InputEvents, SizeOf(TInput) * (Length(S) * 2));
  try
    J := 0;
    for I := 1 to Length(S) do
    begin
      InputEvents[J].Itype := INPUT_KEYBOARD;
      InputEvents[J].ki.wVk := 0;
      InputEvents[J].ki.wScan := Ord(S[i]);
      InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE;
      InputEvents[J].ki.time := 0;
      InputEvents[J].ki.dwExtraInfo := 0;
      Inc(J);
      InputEvents[J].Itype := INPUT_KEYBOARD;
      InputEvents[J].ki.wVk := 0;
      InputEvents[J].ki.wScan := Ord(S[i]);
      InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;
      InputEvents[J].ki.time := 0;
      InputEvents[J].ki.dwExtraInfo := 0;
      Inc(J);
    end;
    SendInput(J, InputEvents[0], SizeOf(TInput));
  finally
    FreeMem(InputEvents);
  end;
end;



///

  SendKeys('C:\Users\Administrador\Desktop\Reporte.pdf');
  Delay(2500);
  keybd_event(VK_RETURN, 0,0, 0);
  keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
  Delay(4000);

Y efectivamente ya enviaba el PDF, el problema es en las acciones anteriores. Ya que en WhatsApp Web para que cargue el cuadro de Dialogo para Insertar el Archivo primero se debe dar Clic en el Botón "Adjuntar" Y después Clic en "Documento"


Aquí como mencioné ejecuto JS para hacer el manejo de elementos. Claro, le paso el JS minificado.

Código Delphi [-]
Chromium1.Browser.MainFrame.ExecuteJavaScript(StringReplace('var eventFire=(b,c)=>{var...

Y bueno aquí es donde empieza el problema, ya que cuando empieza la secuencia en el primer recorrido ejecuta el primer botón "Adjuntar" pero no da clic al segundo botón de "Documento" y por ende no carga el cuadro de dialogo y no se envía el documento.

Cuando empieza el segundo recorrido, probablemente como ya quedó pulsado el primer botón ahora ya pulsa el segundo botón y se envía el PDF. Pero claro poniendo esto en bucle lo que ocasiona es que envía dejando un Reporte. Bueno esto probandolo sin cambiar de URL's porque si fuera el caso se reiniciaría el sitio y nunca enviaría ningún PDF.

En pocas palabras, no llega a enviar el PDF, por más que ya he probado los códigos JS desde la consola en Chrome y aquí sí ejecuta ambos botones correctamente.


El código JS que estoy usando para dar Clic en los botones es

Código:


var eventFire = (MyElement, ElementType) => {
    var MyEvent = document.createEvent("MouseEvents");
    MyEvent.initMouseEvent
    (ElementType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    MyElement.dispatchEvent(MyEvent);
};

eventFire(document.querySelector('div[title="Adjuntar"]'), 'click');

Código:


var eventFire = (MyElement, ElementType) => {
    var MyEvent = document.createEvent("MouseEvents");
    MyEvent.initMouseEvent
    (ElementType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    MyElement.dispatchEvent(MyEvent);
};

eventFire(document.querySelector('button[aria-label="Documento"]'), 'click');

Adjunto el archivo donde estuve haciendo las pruebas para que puedan hacer sus observaciones y gracias de antemano me puedan ayudar en lo que debo mejorar para que pueda funcionar correctamente.

Muchas Gracias

Neftali [Germán.Estévez] 11-07-2022 12:50:11

Una pregunta.
¿Estás trabajando con WhatsApp Business API?
(diseñado específicamente para lo que necesitas)

lucho6007 11-07-2022 15:10:13

WPP4Delphi
 
Hola!
Podés usar, en cambio, WPP4Delphi (https://github.com/wppconnect-team/WPP4Delphi), permite incluso leer mensajes desde una aplicación Delphi de escritorio.
Recomiendo su uso.


Saludos

azdin 14-07-2022 05:07:51

Respuesta a lucho6007
 
Hola muchas gracias por tu respuesta, estuve revisando y me parece un proyecto bastante interesante.
Instale los componentes y cuando fui a ejecutar la Demo me salieron estás advertencias:

Erro HTTP GET fis.abr) Error connecting with SSL. error:1407742E:SSL routines:SSL23_GET_SERVER HELLO:t1svl alert protocol version

Y por último está:
Console ainda nao obteve os comandos de INJECT JS

Y bueno básicamente cuando intento usar la demo me salen nuevamente esas advertencias y no consigo iniciarlas, alguna idea de cómo solucionar?

lucho6007 14-07-2022 13:21:29

Hola!
Ese proyecto está basado en TInject (https://github.com/mikelustosa/Projeto-TInject), quizá buscando en ese proyecto lo hagas funcionar.


Saludos

Natasha78 20-07-2023 07:44:44

Cita:

Empezado por azdin (Mensaje 547482)
Hola muchas gracias por tu respuesta, estuve revisando y me parece un proyecto bastante interesante.
Instale los componentes y cuando fui a ejecutar la Demo me salieron estás advertencias:

Erro HTTP GET fis.abr) Error connecting with SSL. error:1407742E:SSL routines:SSL23_GET_SERVER HELLO:t1svl alert protocol version

Y por último está:
Console ainda nao obteve os comandos de INJECT JS

Y bueno básicamente cuando intento usar la demo me salen nuevamente esas advertencias y no consigo iniciarlas, alguna idea de cómo solucionar?

Las dificultades que está viendo parecen estar relacionadas con problemas del protocolo SSL y la incapacidad de conectarse con éxito al servidor. El error "SSL23_GET_SERVER_HELLO" indica un problema con la negociación del protocolo de enlace SSL/TLS. Esto puede deberse al uso de una versión de SSL/TLS obsoleta que no es compatible con la configuración del servidor. Para remediar esto, asegúrese de estar utilizando la versión más reciente de SSL/TLS que admita el servidor. Compruebe si hay alguna configuración de seguridad relacionada con la inyección de Javascript que pueda estar impidiendo que se ejecute la demostración. Considere ponerse en contacto con el equipo de soporte del sitio web para obtener más ayuda.


La franja horaria es GMT +2. Ahora son las 16:19:07.

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