Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Indy登录facebook_Facebook_Delphi_Post_Indy - Fatal编程技术网

使用Indy登录facebook

使用Indy登录facebook,facebook,delphi,post,indy,Facebook,Delphi,Post,Indy,我想登录到我在Indy的facebook帐户。版本是9.00.10,我使用OpenSSL和TIDHTTP,并为其分配了一个cookie管理器。一切正常(我可以发送一个POST请求和GET等) 我嗅到了facebook的实际登录信息,我有以下信息: 用户代理: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) 有几个POST参数: lsd=我不知道那

我想登录到我在Indy的facebook帐户。版本是9.00.10,我使用OpenSSL和TIDHTTP,并为其分配了一个cookie管理器。一切正常(我可以发送一个POST请求和GET等)

我嗅到了facebook的实际登录信息,我有以下信息:

  • 用户代理: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)

  • 有几个POST参数:

    • lsd=我不知道那是什么
    • email=实际的facebook用户名/电子邮件
    • pass=密码(未加密)-->看到明文,我感到震惊
    • 默认值_persistent=(0或1)表示“让我登录”
    • 时区=时区代码
    • lgnrnd=我不知道那是什么
    • lgnjs=我不知道那是什么
    • 地区=地理位置(e.x.en_US)
这篇文章发表于。但是,当我尝试登录时,它返回我输入了错误的电子邮件。我确信我使用了正确的电子邮件和密码

这是我的密码:

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获得的参数。 我怎样才能成功地使用Indy登录facebook

编辑:尝试使用XE2和Indy 10,但我收到“错误电子邮件”错误:

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=myEmail@mySite.com');
  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.
单元1;
接口
使用
Winapi.Windows、Winapi.Messages、System.SysUtils、System.Variants、System.Classes、Vcl.Graphics、,
控件、窗体、对话框、IdCookieManager、IDoHandler、,
IDOIHandlerSocket、IDOIHandlerStack、IdSSL、IdSSLOpenSSL、IdBaseComponent、,
IdComponent、DateUtils、ShellAPI、IdTCPConnection、IdTCPClient、IdHTTP、Vcl.StdCtrls;
类型
TForm1=类(TForm)
IdHTTP1:TIdHTTP;
IdSSLIOHandlerSocketOpenSSL1:TIdSSLIOHandlerSocketOpenSSL;
IDCookieManager 1:TIdCookieManager;
按钮1:t按钮;
备忘录1:TMemo;
程序按钮1点击(发送方:ToObject);
私有的
{私有声明}
公众的
{公开声明}
结束;
变量
表1:TForm1;
实施
{$R*.dfm}
函数GetBetween(Str:String;StrStart:String;strud:String):String;
变量
iPos:整数;
备份:字符串;
开始
结果:='';
首次公开募股:=Pos(StrStart,Str);
如果IPO为0,则开始
删除(Str,1,iPos+长度(StrStart)-1);
首次公开募股:=Pos(强度,Str);
如果IPO为0,则开始
结果:=拷贝(Str,1,iPos-1);
结束;
结束;
结束;
函数strofile(szFilePath:string;dwPosition:DWORD;szInput:string):布尔值;
变量
hFile:DWORD;
dwSize:DWORD;
德沃德;
开始
结果:=假;
hFile:=CreateFileW(PWideChar(szFilePath),GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0);
如果hFile句柄值无效,则
开始
dwSize:=长度(szInput)*2;
如果dwSize>0,则
开始
SetFilePointer(hFile、dwPosition、nil、FILE_BEGIN);
WriteFile(hFile,szInput[1],dwSize,dwwrited,nil);
如果DWWRITED=dwSize,则
结果:=真;
结束;
闭合手柄(hFile);
结束;
结束;
程序TForm1.按钮1单击(发送方:TObject);
变量
响应:字符串;
lparamList:TStringList;
开始
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)”;
尝试
响应:=IDHTTP1.Get('https://www.facebook.com/');
除了
结束;
lParamList:=TStringList.Create;
lParamList.Add('lsd='+GetBetween(Response,'name=“lsd”value=“”,'”);
lParamList.Add('eMail=myEmail@mySite.com');
lParamList.Add('pass=myPassword');
添加('default_persistent'+GetBetween(Response,'name=“default_persistent”value=“”,'”);
lParamList.Add('timezone=240');
lParamList.Add('lgnrnd='+GetBetween(Response,'name=“lgnrd”value=“”,'”);
Add('lgnjs='+inttostr(DateTimeToUnix(Now));
lParamList.Add('locale=en_US');
IDHTTP1.Request.Referer:='https://www.facebook.com/';
尝试
响应:=IDHTTP1.Post('https://www.facebook.com/login.php?login_attempt=1',lparamList),;
除了
结束;
strofile('test.html',0,响应);
ShellExecute(0,'open','test.html','SW_SHOW','SW_SHOW);
结束;
结束。

如果在
TIdHTTP.HTTPOptions
属性中启用了
hoForceEncodeParams
标志(默认设置),则需要使用un编码值填充发布的
TStringList
TIdHTTP.Post()
将在传输值时为您编码这些值

假设启用了
hoForceEncodeParams
标志,
lparamlist.Add('email=myeMail%40mysite.com')
将作为
email=myeMail%2540mysite.com
传输,因为
%
字符被编码为
%25
。Facebook会将其解码为
email=myeMail%40mysite.com
,并将其作为无效电子邮件拒绝

您可以:

  • 禁用
    hoForceEncodeParams
    标志,使
    TStringList
    值按原样传输。然后,您将负责手动编码它们

  • 保持
    hoForceEncodeParams
    标志处于启用状态,并更改
    lparamlist.Add('email=myeMail%40mysite.com')
    lparamlist.Add('email=myeMail@mysite.com');取而代之TIdHTTP.Post()
    然后将其作为
    电子邮件发送=myeMail@mysite.com
    ,因为Indy 9不对
    @
    字符进行编码。这可能有效,也可能无效,这取决于Facebook的宽容程度


  • 如果升级到Indy 10,
    TIdHTTP.Post()
    @
    字符编码为
    %40
    ,这与启用
    hoForceEncodeParams
    标志时的预期一致。

    对于任何感兴趣的人来说,OP的代码与Facebook的移动版本配合得很好,因此,只要用touch/m.facebook.com替换www.facebook.com即可

    现在,如果OP也愿意分享他是如何让完整版本工作的(至少Cookies没有启用)