facebook delphi post indy

Inicia sesión en Facebook con Indy



delphi post (2)

Me gustaría iniciar sesión en mi cuenta de Facebook con Indy. La versión es 9.00.10 y uso OpenSSL con TIDHTTP y le asigné un administrador de cookies. Todo funciona bien (puedo enviar una solicitud POST a GET, etc.)

Olfateé el inicio de sesión real en Facebook y tengo la siguiente información:

  • UserAgent: Mozilla / 5.0 (Windows; U; Windows NT 6.0; en-US; rv: 1.9.2) Gecko / 20100115 Firefox / 3.6 (.NET CLR 3.5.30729)

  • Hay varios parámetros de POST:

    • lsd = No tengo idea de qué es eso.
    • email = El nombre de usuario / correo electrónico real.
    • pass = La contraseña (sin cifrar) -> Me sorprendió ver en texto claro.
    • default_persistent = (0 o 1) para "mantenerme conectado"
    • timezone = Código de zona horaria.
    • lgnrnd = No tengo idea de qué es eso.
    • lgnjs = No tengo idea de qué es eso.
    • locale = ubicación GEOIP (ex en_US)

La publicación se realiza en https://www.facebook.com/login.php?login_attempt=1 . Sin embargo, cuando intento iniciar sesión, devuelvo que he ingresado un correo electrónico incorrecto. Estoy seguro de que utilicé el correo electrónico y la contraseña correctos.

Aquí está mi código:

procedure TForm1.Button1Click(Sender: TObject); var TEST : STRING; lParamList: TStringList; i : Integer; begin lParamList := TStringList.Create; lparamlist.Add(''lsd=AVoBzJ5G''); lparamlist.Add(''email=myeMail%40mysite.com''); lparamlist.Add(''pass=mypass''); lparamlist.Add(''default_persistent=0''); lparamlist.Add(''timezone=240''); lparamlist.Add(''lgnrnd=210302_FeQV''); lparamlist.Add(''lgnjs=1367035381''); lparamlist.Add(''locale=en_US''); IDHTTP1.Request.UserAgent := ''Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)''; Test := IdHTTP1.Get(''https://www.facebook.com''); // To get the first cookies. for i := 0 to IDHTTP1.CookieManager.CookieCollection.Count - 1 do begin ShowMessage(IDHTTP1.CookieManager.CookieCollection.Items[i].CookieText); // Show me the cookies. end; TEST := IDHTTP1.Post(''https://www.facebook.com/login.php?login_attempt=1'', lParamList); StrToFile (''text.html'', test); ShellExecute (0, ''open'', ''text.html'', '''', '''', SW_SHOW); end;

Usé los parámetros que obtuve de LiveHTTPHeaders. ¿Cómo podría iniciar sesión exitosamente en Facebook con Indy?

EDITAR: Intenté esto con XE2 e Indy 10 pero recibí el error de "correo electrónico incorrecto":

unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdCookieManager, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdBaseComponent, IdComponent, DateUtils, ShellAPI, IdTCPConnection, IdTCPClient, IdHTTP, Vcl.StdCtrls; type TForm1 = class(TForm) IdHTTP1: TIdHTTP; IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; IdCookieManager1: TIdCookieManager; Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function GetBetween (Str: String; StrStart : String; StrEnd : String) : String; var iPos : Integer; BackUp : String; begin result := ''''; iPos := Pos (StrStart, Str); if iPos <> 0 then begin Delete (Str, 1, iPos + Length (StrStart) - 1); iPos := Pos (StrEnd, Str); if iPos <> 0 then begin result := Copy(Str,1, iPos - 1); end; end; end; function StrToFile(szFilePath:string; dwPosition:DWORD; szInput:string):Boolean; var hFile: DWORD; dwSize: DWORD; dwWritten: DWORD; begin Result := FALSE; hFile := CreateFileW(PWideChar(szFilePath), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0); if hFile <> INVALID_HANDLE_VALUE then begin dwSize := Length(szInput) * 2; if dwSize > 0 then begin SetFilePointer(hFile, dwPosition, nil, FILE_BEGIN); WriteFile(hFile, szInput[1], dwSize, dwWritten, nil); if dwWritten = dwSize then Result := TRUE; end; CloseHandle(hFile); end; end; procedure TForm1.Button1Click(Sender: TObject); var Response : String; lparamList : TStringList; begin IDHTTP1.Request.UserAgent := ''Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)''; try Response := IDHTTP1.Get(''https://www.facebook.com/''); except end; lParamList := TStringList.Create; lParamList.Add(''lsd=''+GetBetween (Response, ''name="lsd" value="'', ''"'')); lParamList.Add(''[email protected]''); lParamList.Add(''pass=myPassword''); lParamList.Add(''default_persistent''+GetBetween (Response, ''name="default_persistent" value="'', ''"'')); lParamList.Add(''timezone=240''); lParamList.Add(''lgnrnd=''+GetBetween (Response, ''name="lgnrnd" value="'', ''"'')); lParamList.Add(''lgnjs=''+inttostr(DateTimeToUnix(Now))); lParamList.Add(''locale=en_US''); IDHTTP1.Request.Referer := ''https://www.facebook.com/''; try Response := IDHTTP1.Post(''https://www.facebook.com/login.php?login_attempt=1'', lparamList); except end; StrToFile (''test.html'', 0, Response); ShellExecute (0, ''open'', ''test.html'', '''', '''', SW_SHOW); end; end.


Para cualquiera que esté interesado, el código del OP funciona muy bien con las versiones móviles de Facebook, así que simplemente reemplace www.facebook.com con touch / m.facebook.com.

Ahora, si el OP también tiene la amabilidad de compartir cómo obtuvo la versión completa (al menos, la parte de Cookies no habilitadas), estoy seguro de que todos lo agradeceremos.


Si el indicador hoForceEncodeParams está habilitado en la propiedad TIdHTTP.HTTPOptions (que es por defecto), entonces debe completar el TStringList publicado con valores no codificados. TIdHTTP.Post() codificará los valores para usted cuando los transmita.

Suponiendo que el indicador hoForceEncodeParams está habilitado, lparamlist.Add(''email=myeMail%40mysite.com''); se transmitirá como email=myeMail%2540mysite.com porque el carácter % se codifica como %25 . Facebook decodificaría eso como email=myeMail%40mysite.com y lo rechazaría como un correo electrónico no válido.

Tu también puedes:

  1. deshabilite el indicador hoForceEncodeParams para que los valores de TStringList se transmitan tal como están. Entonces sería responsable de codificarlos manualmente.

  2. deje el indicador hoForceEncodeParams activado y cambie lparamlist.Add(''email=myeMail%40mysite.com''); a lparamlist.Add(''[email protected]''); en lugar. TIdHTTP.Post() en Indy 9 lo transmitirá como [email protected] porque Indy 9 no codifica el carácter @ . Eso puede o no funcionar, dependiendo de lo indulgente que sea Facebook.

Si actualiza a Indy 10, TIdHTTP.Post() codificará el carácter @ como %40 como se espera cuando el indicador hoForceEncodeParams esté habilitado.