2013-04-27 47 views
8

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. 
+2

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. –

+2

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'). –

+2

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. –

Trả lời

5

Nếu cờ hoForceEncodeParams được kích hoạt trong TIdHTTP.HTTPOptions tài sản (mà nó là theo mặc định), sau đó bạn cần điền vào số đăng ký TStringList với un giá trị được mã hóa. TIdHTTP.Post() sau đó sẽ mã hóa các giá trị cho bạn khi truyền chúng.

Giả sử cờ hoForceEncodeParams được kích hoạt, lparamlist.Add('email=myeMail%40mysite.com'); sẽ được truyền như email=myeMail%2540mysite.com vì nhân vật % được mã hóa như %25. Facebook sẽ giải mã đó là email=myeMail%40mysite.com và từ chối nó dưới dạng email không hợp lệ.

Bạn có thể:

  1. vô hiệu hóa các hoForceEncodeParams cờ để các giá trị TStringList được truyền như nó vốn có. Sau đó, bạn sẽ chịu trách nhiệm mã hóa chúng theo cách thủ công.

  2. để cờ hoForceEncodeParams được bật và thay đổi lparamlist.Add('email=myeMail%40mysite.com'); thành lparamlist.Add('[email protected]'); thay thế. TIdHTTP.Post() trong Indy 9 sau đó sẽ truyền nó thành [email protected] vì Indy 9 không mã hóa ký tự @. Điều đó có thể hoặc có thể không hoạt động, tùy thuộc vào cách Facebook nhân hậu.

Nếu bạn nâng cấp lên Indy 10, TIdHTTP.Post() sẽ mã hóa các nhân vật @ như %40 như mong đợi khi lá cờ hoForceEncodeParams được kích hoạt.

+0

Ok, tôi đã xem xét điều đó và bây giờ tôi đã gần hơn một chút. Mặc dù tôi có trình quản lý cookie, nhưng nó cho tôi biết rằng tôi cần bật cookie. –

+0

BTW. Indy 9 chuyển đổi thành công '@' sang '% 40' –

+1

@BenjaminWeiss: Hỗ trợ cookie của Indy 9 không tốt lắm. Hỗ trợ cookie của Indy 10 tốt hơn nhiều. 'TIdHTTP.Post()' trong Indy 9 không mã hóa '@'. Nó sử dụng 'TIdURI.ParamsEncode()' để mã hóa thực tế và '@' nằm trong danh sách các ký tự * an toàn mà 'ParamsEncode()' không mã hóa. Nhưng sau đó, tôi nhìn vào mã cho Indy 9.0.50, và bạn đang sử dụng 9.0.10 thay vào đó, vì vậy có lẽ 9.0.10 là khác nhau. –

0

Đối với bất kỳ ai quan tâm, mã OP hoạt động tốt với các phiên bản di động của Facebook, vì vậy chỉ cần thay thế www.facebook.com bằng touch/m.facebook.com.

Bây giờ, nếu OP cũng đủ tốt để chia sẻ cách anh ấy có phiên bản đầy đủ để hoạt động (ít nhất là phần không được bật cookie), tôi chắc chắn tất cả chúng ta đều biết ơn.

Các vấn đề liên quan