2013-04-27 2 views
8

인디와 내 페이스 북 계정에 로그인하고 싶습니다. 버전은 9.00.10이고 OpenSSL을 TIDHTTP와 함께 사용하고 쿠키 관리자를 할당했습니다. 모든 것이 잘 작동 (내가 POST 요청 GET 등을 보낼 수 있습니다) 인디와 페이스 북에 로그인

나는 페이스 북의 실제 로그인을 맡아 나는 다음과 같은 정보가 있습니다

  • 해당 UserAgent : 모질라/5.0 (윈도우, U를 ; 윈도우 NT 6.0; EN-US; RV : 1.9.2) 게코/20100115 파이어 폭스/3.6 (.NET의 CLR 3.5.30729)

  • 여러 POST 매개 변수가 있습니다 = 나는

    • LSD가 그것이 무엇인지 전혀 모른다.
    • 이메일 = 실제 facebook 사용자 이름/이메일.
    • pass = 비밀번호 (암호화되지 않은) -> 나는 일반 텍스트로 보아 충격을 받았습니다.
    • "로그인 상태 유지"에 대한 default_persistent = (0 또는 1)
    • timezone = 시간대 코드.
    • lgnrnd = 나는 그것이 무엇인지 전혀 모른다.
    • lgnjs = 나는 그것이 무엇인지 전혀 모른다.
    • 로켈 소식 https://www.facebook.com/login.php?login_attempt=1에 이루어진다

= GeoIP가 위치 (e.x. ko 페이지). 그러나 로그인하려고하면 잘못된 이메일을 입력했습니다. 나는 적당한 eMail과 Password를 사용했다고 확신한다.

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; 

은 내가 LiveHTTPHeaders에서 가져온 매개 변수를 사용 :

여기 내 코드입니다. 어떻게하면 성공적으로 페이스 북에 로그인 할 수 있습니까? 당신에게 다음

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

스니퍼가 있습니다. Indy가 전송하는 데이터를 냄새 맡고 웹 브라우저가 전송하는 데이터와 비교하십시오. –

+2

Fiddler를 사용하여 SSL 데이터를 로컬 프록시로 사용하기 때문에 스니핑 할 수 있습니다. Internet Explorer를 포함하여 WinInet 기반 응용 프로그램이 실행되는 동안 자동으로 연결되도록합니다. 'TIdHTTP' ('ProxyParams' 속성을 가짐)를 포함하여 수동으로 다른 앱을 설정해야합니다. –

+2

필자는 TIdHTTP 트래픽을 포함하여 SSL 트래픽을 스니핑하기 위해 Fiddler를 사용하므로 실제로 작동한다는 사실을 알고 있습니다. 'TIdHTTP.ProxyParams' 속성을 설정하여 TIdHTTP가 HTTPS 서버가 아닌 Fiddler에 직접 연결되도록하십시오. –

답변

5

hoForceEncodeParams 플래그 (기본값 임) TIdHTTP.HTTPOptions 속성에 사용할 수있는 경우 :

편집 : XE2와 인디 10이 시도하지만 난 '잘못된 이메일'오류 게시 된 TStringList으로 설정하고으로 인코딩 된 값을 입력해야합니다. 그런 다음 TIdHTTP.Post()은 전송할 때 값을 인코딩합니다. % 문자 %25로 인코딩됩니다 때문에 hoForceEncodeParams 플래그가 활성화되어 가정

lparamlist.Add('email=myeMail%40mysite.com');email=myeMail%2540mysite.com로 전송된다. Facebook은이를 email=myeMail%40mysite.com으로 디코딩하고이를 유효하지 않은 이메일로 거부합니다.

중 하나를 수행 할 수 있습니다-그대로 TStringList 값을 전송받을 수 있도록

  1. hoForceEncodeParams 플래그를 해제합니다. 그런 다음 수동으로 인코딩해야합니다.

  2. hoForceEncodeParams 플래그를 활성화하고 lparamlist.Add('email=myeMail%40mysite.com');lparamlist.Add('[email protected]');으로 변경하십시오. Indy 9가 @ 문자를 인코딩하지 않기 때문에 Indy 9의 TIdHTTP.Post()[email protected]으로 전송합니다. 페이스 북이 얼마나 관대한지에 따라 작동하지 않을 수도 있습니다. 당신이 인디 10로 업그레이드하면 hoForceEncodeParams 플래그를 사용할 때 예상대로

TIdHTTP.Post()%40@ 문자를 인코딩합니다.

+0

좋아, 나는 그것을 고려했고 나는 조금 더 가깝다. 쿠키 관리자가 있지만 쿠키를 사용하도록 설정해야합니다. –

+0

BTW. Indy 9는'@'를'% 40'으로 성공적으로 변환합니다. –

+1

@BenjaminWeiss : Indy 9의 쿠키 지원은별로 좋지 않았습니다. Indy 10의 쿠키 지원이 훨씬 좋습니다. Indy 9의'TIdHTTP.Post()'는'@'를 인코딩하지 않습니다. 실제 인코딩에'TIdURI.ParamsEncode()'를 사용하고'@'는'ParamsEncode()'가 인코딩하지 않는 * safe * 문자 목록에 있습니다. 하지만 인디 9.0.50에 대한 코드를보고 있는데 9.0.10 대신 9.0.10을 사용하고 있습니다. –

0

OP의 코드는 Facebook의 모바일 버전에서 잘 작동하므로 www.facebook.com을 touch/m.facebook.com으로 바꾸십시오.

OP가 정식 버전으로 작동하는 방법을 공유 할만큼 친절한 경우 (적어도 쿠키를 사용할 수없는 부분) 적어도 우리 모두는 감사 할 것입니다.

관련 문제