Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TWebBrowser, OAuth y reCaptcha (https://www.clubdelphi.com/foros/showthread.php?t=90676)

AgustinOrtu 10-08-2016 06:34:32

TWebBrowser, OAuth y reCaptcha
 
Saludos a todos, me encuentro con una dificultad que me tiene algo atonito


Estoy intentando crear una biblioteca orientada a objetos para la API Rest de Mercado Libre

Leyendo la documentacion, veo que una ves registrada nuestra aplicacion y obtenido un "ID", debemos implementar autorizacion mediante OAuth

Para ello, lo unico que hay que hacer, es abrir un navegador de internet, ir a cierta url, y luego si el usuario se logea correctamente, se lo redirige a otra url que yo mismo puedo especificar, y al final le agrega el token de autorizacion generado para que yo lo capture.

La famosa Url en cuestion es la siguiente:


En donde mi Client ID es: 2010039294220063 (no tengo problemas en compartirlo porque es solo de prueba)

Si hago las pruebas desde un navegador cualquiera (Chrome, Vivaldi, Internet Explorer) el proceso es exitoso y cuando inicio sesion en Mercado Libre me envia a "https://www.google.com.ar/aca-un-string-que-es-el-token" y todo perfecto

Ahora bien, quiero hacer lo mismo desde Delphi y no puedo.

He creado una aplicacion vacia, coloque un TWebBrowser y luego invoque al metodo Navigate, con la URL que deje arriba

La pagina de Mercado Libre se muestra, en esta instancia, correctamente y puedo colocar usuario y contraseña. Pero el problema es cuando aparece el bendito captcha: En realidad el captcha no aparece. Con captcha me refiero al "chirimbolo" ese que te dice que le hagas click para demostrar que no sos un robot. Ok, el bendito captcha no aparece y no puedo iniciar sesion y seguir con el proceso :(

Por si no soy claro, esto es lo que veo desde Chrome por ejemplo:



Esto veo desde Delphi (siempre estamos hablando de la misma URL)



Lo mas chistoso es que si uno insiste y decide volver a poner usuario y contraseña y hace click en "Ingresar", aparece la leyenda de error de "haga click en el cuadro para continuar", como se ve en la imagen y que es lo que ocurre cuando no tildas el captcha

Por supuesto que algun error aparece, es uno de esos errores del Internet Explorer (tengo entendido que el TWebBrowser envuelve IE). Ninguna expcecion es generada en tiempo de ejecucion. El error (o mas bien advertencia, tiene el cartelito con el signo de admiracion y fondo amarillo) es este:




Agradezco enormemente si alguien puede darme una mano

dec 10-08-2016 12:02:10

Hola,

Lo primero que yo probaría sería indicar a Windows que nuestro "WebBrowser" ha de emular una versión más o menos "moderna" de Internet Explorer. Por ejemplo, la siguiente unidad (copiada aquí ahora un poco deprisa, creo que funcionará sin cambio alguno) lo que hace es indicar que nuestro "WebBrowser" quiere comportarse como un Internet Explorer 11, si es que este se encuentra instalado en el sistema.

Código Delphi [-]
unit IEBrowserFix;

interface

type
  TIEBrowserFix = class(TObject)
  public
    class procedure Initialize();
    class procedure Uninitialize();
  end;

implementation

uses
  Windows, SysUtils, Registry;

const
  REG_KEY = 'Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION';

  { TIEBrowserFix }

class procedure TIEBrowserFix.Initialize();
const
  // http://msdn.microsoft.com/en-us/libr...wser_emulation
  MAGIC_CONSTANT = 11001;
var
  exeName: string;
begin
  exeName := ExtractFileName(ParamStr(0));
  with TRegistry.Create() do
    try
      RootKey := HKEY_CURRENT_USER;
      if OpenKey(REG_KEY, true) then
      begin
        if not ValueExists(exeName) then
          WriteInteger(exeName, MAGIC_CONSTANT);
        CloseKey();
      end;
    finally
      Free();
    end;
end;

class procedure TIEBrowserFix.Uninitialize();
var
  exeName: string;
begin
  exeName := ExtractFileName(ParamStr(0));
  with TRegistry.Create() do
    try
      RootKey := HKEY_CURRENT_USER;
      if OpenKey(REG_KEY, false) then
      begin
        if ValueExists(exeName) then
          DeleteValue(exeName);
        CloseKey();
      end;
    finally
      Free();
    end;
end;

initialization
  TIEBrowserFix.Initialize();

finalization
  TIEBrowserFix.Uninitialize();

end.

Creo que eso ya podría solucionar el problema, Agustín. Si no es así, tal vez podamos intentar alguna otra cosa. :)

AgustinOrtu 10-08-2016 18:34:03

David, genio, funciona excelente.

Nunca se me hubiese ocurrido que podria ser eso.

Lo mas probable es que si consigo completar esta biblioteca la publique. Podria incluir esta unidad de codigo en ella? Y adaptarla de acuerdo a mi estilo particular?

dec 10-08-2016 18:37:47

Hola Agustín,

Me alegro de que funcionase. Por supuesto, puedes adaptar el código a tus necesidades. De hecho la unidad de más arriba lo que hace es añadir en el registro la clave correspondiente al iniciarse el programa, y, borrar dicha clave cuando el programa se cierra. No hay nada de particuar ahí, lo que tenemos que hacer es escribir la clave de marras en el registro. :)

AgustinOrtu 11-08-2016 21:29:49

Bueno al menos la parte del OAuth ya esta funcionando bien y se puede recuperar facilmente el token

Aca esta el codigo que lo implementa y hay demo para Vcl y FMX

https://github.com/ortuagustin/Delph.../Mercado Libre

Saludos!


La franja horaria es GMT +2. Ahora son las 02:18:02.

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