IE旺旺快速登陆分析

IE浏览器上的旺旺快速登陆功能是用AliIMSSOLogin.SSOLoginCtrl.1这个ActiveX控件实现的。javascript访问AliIMSSOLogin.SSOLoginCtrl.1的相关代码如下。


创建并初始化:

var sso = new window.ActiveXObject("AliISOLogin.SSOLoginCtrl.1");
sso.InitSSOLoginCtrl(sso.CreateSSOData(), 0);

注:AliIMSSOLogin.SSOLoginCtrl.1只能在https://login.taobao.com的页面创建。

获取本机已登陆旺旺或千牛的账号列表:

var usrlist = sso.GetUserList(0, 0);

已登陆账号的数量:

usrlist.getSize();

第i个账号(索引从0开始)

var usr = usrlist.GetItemData(i);

账号名:

usr.GetDataStr("strKey_ShortUserID");

快速登陆:

usr.SetDataStr("strKey_SrcURL", "http://trade.taobao.com/trade/itemlist/list_bought_items.htm"); 
sso.Go(0, usr);

需要注意的是,调用后,页面会自动跳转到https://login.taobao.com/member/loginByIm.do?XXXXXX(这里的XXXXXX代指相关参数)。在我们自己的程序里用WebBrowser控件,在BeforeNavigate2事件里页面拦截到这个url,并阻止WebBrowser跳转,就可以使用这个url用来在自己程序里登陆淘宝了。

procedure TFrmTaobaoFastLogin.WebViewBeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL, Flags,
  TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool);
begin
  OutputDebugStringW(PWideChar(WideString(URL)));


  if Pos('//login.taobao.com/member/loginByIm.do', URL) > 0 then
  begin
    FastLoginUrl := URL;
    Cancel := True;
  end;
end;

以下是完整代码:

uFrmTaobaoFastLogin.dfm

 
object FrmTaobaoFastLogin: TFrmTaobaoFastLogin
  Left = 0
  Top = 0
  Caption = #33719#21462#33258#21160#30331#38470#21442#25968
  ClientHeight = 319
  ClientWidth = 622
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnClose = FormClose
  PixelsPerInch = 96
  TextHeight = 13
  object WebView: TWebBrowser
    Left = 0
    Top = 0
    Width = 622
    Height = 319
    Align = alClient
    TabOrder = 0
    OnBeforeNavigate2 = WebViewBeforeNavigate2
    OnDocumentComplete = WebViewDocumentComplete
    ExplicitLeft = 304
    ExplicitTop = 160
    ExplicitWidth = 300
    ExplicitHeight = 150
    ControlData = {
      4C00000049400000F82000000000000000000000000000000000000000000000
      000000004C000000000000000000000001000000E0D057007335CF11AE690800
      2B2E12620A000000000000004C0000000114020000000000C000000000000046
      8000000000000000000000000000000000000000000000000000000000000000
      00000000000000000100000000000000000000000000000000000000}
  end
end

uFrmTaobaoFastLogin.pas

unit uFrmTaobaoFastLogin;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, WideStrings,
  Dialogs, OleCtrls, SHDocVw, MSHTML, uOleAuto;


const
  CM_FAST_LOGIN = WM_APP + 1;
  CM_GET_USER_LIST = WM_APP + 2;


type
  TCMFastLogin = record
    MsgId: Cardinal;
    nick: WideString;
    url: PAnsiString;
    Result: Longint;
  end;


  TCMGetUserList = record
    MsgId: Cardinal;
    NickList: TStrings;
    lparam: Longint;
    Result: Longint;
  end;
  
  TFrmTaobaoFastLogin = class(TForm)
    WebView: TWebBrowser;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure WebViewBeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName,
      PostData, Headers: OleVariant; var Cancel: WordBool);
    procedure WebViewDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  private
    FastLoginUrl: AnsiString;
    Initialized: Boolean;
    function LoginUser(const nick: WideString): Boolean;
    function _GetFastLoginUrl(const nick: WideString): AnsiString;
    procedure _GetUserList(strs: TStrings);
    procedure CMFastLogin(var msgr: TCMFastLogin); message CM_FAST_LOGIN;
    procedure CMGetUserList(var msgr: TCMGetUserList); message CM_GET_USER_LIST;
  public
    procedure GetUserList(strs: TStrings);
    function IsWangwangLogined(const nick: WideString): Boolean;
    function GetFastLoginUrl(const nick: WideString): AnsiString;
  end;


var
  FrmTaobaoFastLogin: TFrmTaobaoFastLogin;


implementation


{$R *.dfm}


const BROWSER_SCRIPTS: WideString = 'var sso = new window.ActiveXObject("AliIMSSOLogin.SSOLoginCtrl.1");'
  + 'sso.InitSSOLoginCtrl(sso.CreateSSOData(), 0);'
  + 'function GetUserList(){return sso.GetUserList(0, 0);}'
  + 'function GetUser(nick){ulist=sso.GetUserList(0,1); for(i=0;i<ulist.getSize();++i){'
  + 'user = ulist.GetItemData(i); if (nick==user.GetDataStr("strKey_ShortUserID")) return user;} return null;}'
  + 'function IsUserLogined(nick){return GetUser(nick)?true:false}'
  + 'function LoginUser(nick){ulist=sso.GetUserList(0,1); for(i=0;i<ulist.getSize();++i){'
  + 'user = ulist.GetItemData(i); if (nick==user.GetDataStr("strKey_ShortUserID")){' +
  ' user.SetDataStr("strKey_SrcURL", "http://trade.taobao.com/trade/itemlist/list_bought_items.htm"); sso.Go(0, user); return true;}} return false;}';


{ TFrmTaobaoFastLogin }


procedure TFrmTaobaoFastLogin.CMFastLogin(var msgr: TCMFastLogin);
begin
  if (msgr.nick <> '') and Assigned(msgr.url) then
  begin
    msgr.url^ := Self._GetFastLoginUrl(msgr.nick);
    msgr.Result := 1;
  end
  else DefWindowProc(Self.Handle, msgr.MsgId, WPARAM(msgr.nick), LPARAM(msgr.url));
end;


procedure TFrmTaobaoFastLogin.CMGetUserList(var msgr: TCMGetUserList);
begin
  if Assigned(msgr.NickList) then
  begin
    Self._GetUserList(msgr.NickList);
    msgr.Result := 1;
  end
  else DefWindowProc(Self.Handle, msgr.MsgId, WPARAM(msgr.NickList), msgr.lparam);
end;


procedure TFrmTaobaoFastLogin.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  WebView.Stop;
end;


function TFrmTaobaoFastLogin._GetFastLoginUrl(const nick: WideString): AnsiString;
var
  msgr: MSG;
begin
  Result := '';
  FastLoginUrl := '';
  
  if not Initialized then
  begin
    WebView.Navigate('https://login.taobao.com/member/login.jhtml');
    Self.ShowModal;
  end;


  if Initialized and LoginUser(nick) then
  begin
    while not Application.Terminated and (FastLoginUrl = '') and GetMessage(msgr, WebView.Handle, 0, 0) do
    begin
      TranslateMessage(msgr);
      DispatchMessage(msgr);
    end;


    Result := FastLoginUrl;
  end;
end;


procedure TFrmTaobaoFastLogin._GetUserList(strs: TStrings);
var
  UserList: OleVariant;
  i: Integer;
begin
  if not Initialized then
  begin
    WebView.Navigate('https://login.taobao.com/member/login.jhtml');
    Self.ShowModal;
  end;




  if not Initialized then Exit;


  strs.Clear;


  if CallDispMethod((WebView.Document as IHTMLDocument2).parentWindow, GetThreadLocale, 'GetUserList', [], @UserList)
    and not VarIsNull(UserList) then
  begin
    for i := 0 to UserList.getSize - 1 do
      strs.Add(UserList.GetItemData(i).GetDataStr('strKey_ShortUserID'));
  end;
end;


function TFrmTaobaoFastLogin.GetFastLoginUrl(const nick: WideString): AnsiString;
var
  ret: DWORD;
begin
  if GetCurrentThreadId = MainThreadID then Result := _GetFastLoginUrl(nick)
  else SendMessageTimeout(Self.Handle, CM_FAST_LOGIN, WPARAM(nick), LPARAM(@Result),
    SMTO_ABORTIFHUNG or SMTO_BLOCK, 5000, ret);
end;


procedure TFrmTaobaoFastLogin.GetUserList(strs: TStrings);
var
  ret: DWORD;
begin
  if GetCurrentThreadId = MainThreadID then _GetUserList(strs)
  else SendMessageTimeout(Self.Handle, CM_GET_USER_LIST, WPARAM(strs), 0,
    SMTO_ABORTIFHUNG or SMTO_BLOCK, 5000, ret);
end;


function TFrmTaobaoFastLogin.IsWangwangLogined(const nick: WideString): Boolean;
var
  user: OleVariant;
begin
  Result := CallDispMethod((WebView.Document as IHTMLDocument2).parentWindow, GetThreadLocale, 'GetUser', [nick], @user)
    and not VarIsNull(user);
end;


function TFrmTaobaoFastLogin.LoginUser(const nick: WideString): Boolean;
var
  success: OleVariant;
begin
  Result := CallDispMethod((WebView.Document as IHTMLDocument2).parentWindow, GetThreadLocale, 'LoginUser',
    [nick], @success) and not VarIsNull(success) and BOOL(success);
end;


procedure TFrmTaobaoFastLogin.WebViewBeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL, Flags,
  TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool);
begin
  OutputDebugStringW(PWideChar(WideString(URL)));


  if Pos('//login.taobao.com/member/loginByIm.do', URL) > 0 then
  begin
    FastLoginUrl := URL;
    Cancel := True;
  end;
end;


procedure TFrmTaobaoFastLogin.WebViewDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
var
  ibrowser: IWebBrowser;
begin
  if Succeeded(pDisp.QueryInterface(IID_IWebBrowser2, ibrowser)) and (ibrowser = WebView.DefaultInterface) then
  begin
    if Pos('https://login.taobao.com/member/login.', URL) = 1 then
    begin
      Initialized := True;
      (WebView.Document as IHTMLDocument2).parentWindow.execScript(BROWSER_SCRIPTS, 'Javascript');
    end;
    
    Self.ModalResult := mrOk;;
  end;
end;


end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值