{
code by siow
http://blog.csdn.net/siow
ver 0.2 2009-04-16
修正了分组信息与好友信息获取不到的bug
ver 0.1 2009-04-15
初步实现QQ账号的Web登陆,个人信息和头像的获取
}
unit Unit1;
interface
{.$DEFINE ID10}
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP, StdCtrls,jpeg,IdHashMessageDigest,IdHash,StrUtils;
type
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Image1: TImage;
btn2: TButton;
edt1: TEdit;
edt2: TEdit;
edt3: TEdit;
lbl1: TLabel;
lbl2: TLabel;
lbl3: TLabel;
btn1: TButton;
mmo1: TMemo;
Edit1: TEdit;
img1: TImage;
btn3: TButton;
btn5: TButton;
btn6: TButton;
procedure FormCreate(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure btn6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
cookie:string;
implementation
{$R *.dfm}
//提取字符串
function SubString(html,Cstr_L,Cstr_R:string):string;
var
sPosB,sPosE:integer;
Lwhtml,LwCstr_L,LwCstr_R:string;
begin
Result:='';
if trim(html)='' then exit;
Lwhtml:=LowerCase(html);
LwCstr_L :=LowerCase(Cstr_L);
LwCstr_R :=LowerCase(Cstr_R);
sPosB:=Pos(LwCstr_L,Lwhtml)+Length(LwCstr_L);
sPosE:=PosEx(LwCstr_R,Lwhtml,sPosB);
if (sPosB<sPosE) and (sPosE>0) then
Result:=copy(html,sPosB,sPosE-sPosB);
end;
function HashStr2BinStr(Hash:string):string;
var
buf:array[0..63] of Char;
i:Integer;
begin
Result:='';
FillChar(buf,SizeOf(buf),0);
SetLength(Result,Round(Length(Hash)/2));
FillChar(Result[1],Length(Result),0);
HexToBin(PChar(Hash),buf,SizeOf(buf));
for i:=0 to Round(Length(Hash)/2)-1 do
Result[i+1]:=buf[i];
end;
function Fmd5(str:string):string;
var
md5 : TIdHashMessageDigest5;
longWordRec : T4x4LongWordRecord;
begin
md5 := TIdHashMessageDigest5.Create;
try
{$IFDEF ID10}
Result:=md5.HashStringAsHex(str);
{$ELSE}
longWordRec:=md5.HashValue(str);
Result:=md5.AsHex(longWordRec);
{$ENDIF}
finally
md5.Free;
end;
end;
function md5_3(str:string):string;
begin
Result:=Fmd5(str);
Result:=HashStr2BinStr(Result);
Result:=Fmd5(Result);
Result:=HashStr2BinStr(Result);
Result:=Fmd5(Result);
end;
function preprocess(pass,verifycode:string):string;
begin
Result:=Fmd5(md5_3(pass)+UpperCase(verifycode));
end;
function GetVerifyPic(IdHTTP:TIdHTTP;Img:TImage):boolean;
var
ms:TMemoryStream;
pic:TJPEGImage;
begin
Result:=False;
try
ms:=TMemoryStream.Create;
try
IdHTTP.Get('http://ptlogin2.qq.com/getimage',ms);
ms.Position:=0;
pic:=TJPEGImage.Create;
try
pic.LoadFromStream(ms);
Img.Picture.Assign(pic);
finally
pic.Free;
end;
cookie:=SubString(IdHTTP.Response.RawHeaders.Text,'Set-Cookie: verifysession=',';');
cookie:='Cookie: verifysession='+cookie+';';
IdHTTP.Request.CustomHeaders.Clear;
IdHTTP.Request.CustomHeaders.Add(cookie);
finally
ms.Free;
end;
Result:=true;
except
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
GetVerifyPic(idhttp1,Image1);
end;
procedure TForm1.btn2Click(Sender: TObject);
var
Params:TStrings;
url:string;
tmp:string;
ms:TMemoryStream;
bmp:TBitmap;
begin
Params :=TStringList.Create;
try
Params.Append('u='+edt1.Text);
Params.Append('p='+preprocess(edt2.Text,edt3.Text));
Params.Append('verifycode='+edt3.Text);
Params.Append('u1=http://my.qq.com');
Params.Append('aid=8000203');
try
url := 'http://ptlogin2.qq.com/login';
IdHTTP1.HandleRedirects:=False;
tmp:=idhttp1.Post(url,Params);
except
end;
finally
Params.Free;
end;
tmp:=SubString(IdHTTP1.Response.RawHeaders.Text,'Set-Cookie: pt2gguin=',';');
cookie:=cookie+' pt2gguin='+tmp+';';
tmp:=SubString(IdHTTP1.Response.RawHeaders.Text,'Set-Cookie: uin=',';');
cookie:=cookie+' uin='+tmp+';';
tmp:=SubString(IdHTTP1.Response.RawHeaders.Text,'Set-Cookie: skey=',';');
cookie:=cookie+' skey='+tmp+';';
tmp:=SubString(IdHTTP1.Response.RawHeaders.Text,'Set-Cookie: ptcz=',';');
cookie:=cookie+' ptcz='+tmp+';';
IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.Add(cookie);
tmp:=Utf8ToAnsi(idhttp1.Get('http://my.qq.com'));
mmo1.Text:=tmp;
tmp:=Utf8ToAnsi(idhttp1.Get('http://city.qzone.qq.com/pingcity.php'));
mmo1.Text:=tmp;
tmp:=SubString(IdHTTP1.Response.RawHeaders.Text,'Set-Cookie: qzone_city_key=',';');
cookie:=cookie+' qzone_city_key='+tmp+';';
IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.Add(cookie);
tmp:=Utf8ToAnsi(IdHTTP1.Get('http://my.qq.com/my_login_info.php'));
mmo1.Text:=tmp;
ms:=TMemoryStream.Create;
try
IdHTTP1.Get('http://my.qq.com/qq_face.php',ms);
bmp:=TBitmap.Create;
try
ms.Position:=0;
bmp.LoadFromStream(ms);
img1.Picture.Assign(bmp);
finally
bmp.Free;
end;
finally
ms.Free;
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
mmo1.Text:= Utf8ToAnsi(idhttp1.Get(Edit1.Text));
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
GetVerifyPic(idhttp1,Image1);
end;
procedure TForm1.btn5Click(Sender: TObject);
begin
//获取用户分组
mmo1.Text:=Utf8ToAnsi(idhttp1.Get('http://users.qzone.qq.com/cgi-bin/tfriend/friend_getgroupinfo.cgi?uin='+edt1.Text));
end;
procedure TForm1.btn6Click(Sender: TObject);
begin
//获取好友信息
mmo1.Text:= idhttp1.Get('http://show.qq.com/cgi-bin/qqshow_user_friendgroup');
end;
end.
{
code by siow
http://blog.csdn.net/siow
ver 0.2 2009-04-16
修正了分组信息与好友信息获取不到的bug
ver 0.1 2009-04-15
初步实现QQ账号的Web登陆,个人信息和头像的获取
}
unit Unit1;
interface
{.$DEFINE ID10}
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP, StdCtrls,jpeg,IdHashMessageDigest,IdHash,StrUtils;
type
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Image1: TImage;
btn2: TButton;
edt1: TEdit;
edt2: TEdit;
edt3: TEdit;
lbl1: TLabel;
lbl2: TLabel;
lbl3: TLabel;
btn1: TButton;
mmo1: TMemo;
Edit1: TEdit;
img1: TImage;
btn3: TButton;
btn5: TButton;
btn6: TButton;
procedure FormCreate(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure btn6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
cookie:string;
implementation
{$R *.dfm}
//提取字符串
function SubString(html,Cstr_L,Cstr_R:string):string;
var
sPosB,sPosE:integer;
Lwhtml,LwCstr_L,LwCstr_R:string;
begin
Result:='';
if trim(html)='' then exit;
Lwhtml:=LowerCase(html);
LwCstr_L :=LowerCase(Cstr_L);
LwCstr_R :=LowerCase(Cstr_R);
sPosB:=Pos(LwCstr_L,Lwhtml)+Length(LwCstr_L);
sPosE:=PosEx(LwCstr_R,Lwhtml,sPosB);
if (sPosB<sPosE) and (sPosE>0) then
Result:=copy(html,sPosB,sPosE-sPosB);
end;
function HashStr2BinStr(Hash:string):string;
var
buf:array[0..63] of Char;
i:Integer;
begin
Result:='';
FillChar(buf,SizeOf(buf),0);
SetLength(Result,Round(Length(Hash)/2));
FillChar(Result[1],Length(Result),0);
HexToBin(PChar(Hash),buf,SizeOf(buf));
for i:=0 to Round(Length(Hash)/2)-1 do
Result[i+1]:=buf[i];
end;
function Fmd5(str:string):string;
var
md5 : TIdHashMessageDigest5;
longWordRec : T4x4LongWordRecord;
begin
md5 := TIdHashMessageDigest5.Create;
try
{$IFDEF ID10}
Result:=md5.HashStringAsHex(str);
{$ELSE}
longWordRec:=md5.HashValue(str);
Result:=md5.AsHex(longWordRec);
{$ENDIF}
finally
md5.Free;
end;
end;
function md5_3(str:string):string;
begin
Result:=Fmd5(str);
Result:=HashStr2BinStr(Result);
Result:=Fmd5(Result);
Result:=HashStr2BinStr(Result);
Result:=Fmd5(Result);
end;
function preprocess(pass,verifycode:string):string;
begin
Result:=Fmd5(md5_3(pass)+UpperCase(verifycode));
end;
function GetVerifyPic(IdHTTP:TIdHTTP;Img:TImage):boolean;
var
ms:TMemoryStream;
pic:TJPEGImage;
begin
Result:=False;
try
ms:=TMemoryStream.Create;
try
IdHTTP.Get('http://ptlogin2.qq.com/getimage',ms);
ms.Position:=0;
pic:=TJPEGImage.Create;
try
pic.LoadFromStream(ms);
Img.Picture.Assign(pic);
finally
pic.Free;
end;
cookie:=SubString(IdHTTP.Response.RawHeaders.Text,'Set-Cookie: verifysession=',';');
cookie:='Cookie: verifysession='+cookie+';';
IdHTTP.Request.CustomHeaders.Clear;
IdHTTP.Request.CustomHeaders.Add(cookie);
finally
ms.Free;
end;
Result:=true;
except
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
GetVerifyPic(idhttp1,Image1);
end;
procedure TForm1.btn2Click(Sender: TObject);
var
Params:TStrings;
url:string;
tmp:string;
ms:TMemoryStream;
bmp:TBitmap;
begin
Params :=TStringList.Create;
try
Params.Append('u='+edt1.Text);
Params.Append('p='+preprocess(edt2.Text,edt3.Text));
Params.Append('verifycode='+edt3.Text);
Params.Append('u1=http://my.qq.com');
Params.Append('aid=8000203');
try
url := 'http://ptlogin2.qq.com/login';
IdHTTP1.HandleRedirects:=False;
tmp:=idhttp1.Post(url,Params);
except
end;
finally
Params.Free;
end;
tmp:=SubString(IdHTTP1.Response.RawHeaders.Text,'Set-Cookie: pt2gguin=',';');
cookie:=cookie+' pt2gguin='+tmp+';';
tmp:=SubString(IdHTTP1.Response.RawHeaders.Text,'Set-Cookie: uin=',';');
cookie:=cookie+' uin='+tmp+';';
tmp:=SubString(IdHTTP1.Response.RawHeaders.Text,'Set-Cookie: skey=',';');
cookie:=cookie+' skey='+tmp+';';
tmp:=SubString(IdHTTP1.Response.RawHeaders.Text,'Set-Cookie: ptcz=',';');
cookie:=cookie+' ptcz='+tmp+';';
IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.Add(cookie);
tmp:=Utf8ToAnsi(idhttp1.Get('http://my.qq.com'));
mmo1.Text:=tmp;
tmp:=Utf8ToAnsi(idhttp1.Get('http://city.qzone.qq.com/pingcity.php'));
mmo1.Text:=tmp;
tmp:=SubString(IdHTTP1.Response.RawHeaders.Text,'Set-Cookie: qzone_city_key=',';');
cookie:=cookie+' qzone_city_key='+tmp+';';
IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.Add(cookie);
tmp:=Utf8ToAnsi(IdHTTP1.Get('http://my.qq.com/my_login_info.php'));
mmo1.Text:=tmp;
ms:=TMemoryStream.Create;
try
IdHTTP1.Get('http://my.qq.com/qq_face.php',ms);
bmp:=TBitmap.Create;
try
ms.Position:=0;
bmp.LoadFromStream(ms);
img1.Picture.Assign(bmp);
finally
bmp.Free;
end;
finally
ms.Free;
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
mmo1.Text:= Utf8ToAnsi(idhttp1.Get(Edit1.Text));
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
GetVerifyPic(idhttp1,Image1);
end;
procedure TForm1.btn5Click(Sender: TObject);
begin
//获取用户分组
mmo1.Text:=Utf8ToAnsi(idhttp1.Get('http://users.qzone.qq.com/cgi-bin/tfriend/friend_getgroupinfo.cgi?uin='+edt1.Text));
end;
procedure TForm1.btn6Click(Sender: TObject);
begin
//获取好友信息
mmo1.Text:= idhttp1.Get('http://show.qq.com/cgi-bin/qqshow_user_friendgroup');
end;
end.
view plaincopy to clipboardprint?
object Form1: TForm1
Left = 253
Top = 129
Width = 596
Height = 480
Caption = 'Ver 0.2'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Image1: TImage
Left = 4
Top = 88
Width = 129
Height = 57
end
object lbl1: TLabel
Left = 8
Top = 8
Width = 28
Height = 13
Caption = 'QQ'#21495
end
object lbl2: TLabel
Left = 8
Top = 40
Width = 24
Height = 13
Caption = #23494#30721
end
object lbl3: TLabel
Left = 8
Top = 64
Width = 36
Height = 13
Caption = #39564#35777#30721
end
object img1: TImage
Left = 32
Top = 192
Width = 105
Height = 105
end
object btn2: TButton
Left = 64
Top = 152
Width = 75
Height = 25
Caption = #30331#38470
TabOrder = 0
OnClick = btn2Click
end
object edt1: TEdit
Left = 64
Top = 8
Width = 121
Height = 21
TabOrder = 1
end
object edt2: TEdit
Left = 64
Top = 32
Width = 121
Height = 21
PasswordChar = '*'
TabOrder = 2
end
object edt3: TEdit
Left = 64
Top = 56
Width = 121
Height = 21
TabOrder = 3
end
object btn1: TButton
Left = 472
Top = 8
Width = 57
Height = 25
Caption = 'GetUrl'
TabOrder = 4
OnClick = btn1Click
end
object mmo1: TMemo
Left = 192
Top = 40
Width = 297
Height = 409
Lines.Strings = (
'mmo1')
TabOrder = 5
end
object Edit1: TEdit
Left = 192
Top = 8
Width = 273
Height = 21
TabOrder = 6
end
object btn3: TButton
Left = 136
Top = 104
Width = 49
Height = 25
Caption = #30475#19981#28165
TabOrder = 7
OnClick = btn3Click
end
object btn5: TButton
Left = 496
Top = 40
Width = 75
Height = 25
Caption = #33719#21462#20998#32452
TabOrder = 8
OnClick = btn5Click
end
object btn6: TButton
Left = 496
Top = 72
Width = 75
Height = 25
Caption = #33719#21462#22909#21451
TabOrder = 9
OnClick = btn6Click
end
object IdHTTP1: TIdHTTP
MaxLineAction = maException
ReadTimeout = 0
AllowCookies = True
ProxyParams.BasicAuthentication = False
ProxyParams.ProxyPort = 0
Request.ContentLength = -1
Request.ContentRangeEnd = 0
Request.ContentRangeStart = 0
Request.ContentType = 'text/html'
Request.Accept = 'text/html, */*'
Request.BasicAuthentication = False
Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
HTTPOptions = [hoForceEncodeParams]
Left = 464
Top = 72
end
end