Tôi muốn đăng nhập vào tài khoản facebook của mình bằng Indy. Phiên bản là 9.00.10 và tôi sử dụng OpenSSL với TIDHTTP và gán một trình quản lý cookie cho nó. Tất cả mọi thứ hoạt động tốt (tôi có thể gửi một yêu cầu POST GET, vv)Đăng nhập vào facebook với Indy
Tôi ngửi đăng nhập thực tế để facebook và tôi có các thông tin sau:
UserAgent: Mozilla/5.0 (Windows; U ; Windows NT 6.0; en-US; rv: 1.9.2) Gecko/20.100.115 Firefox/3.6 (.NET CLR 3.5.30729)
có một số thông số POST:
- lSD = tôi có không biết đó là gì.
- email = Tên người dùng/email facebook thực tế.
- pass = Mật khẩu (không được mã hóa) -> Tôi đã bị sốc khi thấy văn bản rõ ràng.
- default_persistent = (0 hoặc 1) cho "giữ cho tôi đăng nhập"
- múi giờ = Mã múi giờ.
- lgnrnd = Tôi không biết đó là gì.
- lgnjs = Tôi không biết đó là gì.
- locale = GEOIP vị trí (e.x. en_US)
Các bài được thực hiện trên https://www.facebook.com/login.php?login_attempt=1. Tuy nhiên khi tôi cố gắng đăng nhập nó trả về rằng tôi đã nhập một email không chính xác. Tôi chắc rằng tôi đã sử dụng đúng eMail và Mật khẩu.
Đây là mã của tôi:
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;
tôi đã sử dụng các thông số mà tôi nhận được từ LiveHTTPHeaders. Làm cách nào để đăng nhập thành công vào facebook bằng Indy?
EDIT: Cố gắng này với XE2 và Indy 10 nhưng tôi nhận được lỗi 'email không chính xác':
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.
Bạn có người chơi sniffer. Ngửi dữ liệu mà Indy đang truyền và so sánh nó với dữ liệu mà trình duyệt web truyền đi. –
Bạn có thể sử dụng Fiddler để sniff dữ liệu SSL, bởi vì nó hoạt động như một proxy cục bộ. Nó tự động cấu hình các ứng dụng dựa trên WinInet, bao gồm cả Internet Explorer, để kết nối thông qua nó trong khi nó đang chạy. Bạn phải định cấu hình các ứng dụng khác theo cách thủ công, bao gồm 'TIdHTTP' (có thuộc tính' ProxyParams'). –
Tôi sử dụng Fiddler để thu gọn lưu lượng SSL, bao gồm lưu lượng truy cập 'TIdHTTP', vì vậy tôi biết thực tế là nó hoạt động. Đảm bảo bạn định cấu hình thuộc tính 'TIdHTTP.ProxyParams' để thông báo cho' TIdHTTP' kết nối với Fiddler chứ không phải máy chủ HTTPS trực tiếp. –