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:
deshabilite el indicador
hoForceEncodeParams
para que los valores deTStringList
se transmitan tal como están. Entonces sería responsable de codificarlos manualmente.deje el indicador
hoForceEncodeParams
activado y cambielparamlist.Add(''email=myeMail%40mysite.com'');
alparamlist.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.