function GetCallingsList(AUrl:
string;
var AErrorString:
string; APassword:
string = '
'; CSVIfTrueElseXML : Boolean = true; ADeleteOnBox: boolean = false):
string;
var
HTTP: TIdHTTP;
challenge,response,sid :
String;
function InternalGetChallenge :
String;
begin
Result := HTTP.Get('
http://'+AUrl+'
/cgi-bin/webcm?getpage=../html/login_sid.xml');
if Pos('
<challenge>',LowerCase(Result))=0
then
raise Exception.Create('
Fehler beim Initialisieren der Verbindung.');
System.Delete(Result,1,Pos('
<challenge>',LowerCase(Result))+10);
System.Delete(Result,Pos('
</',Result),Length(Result)-Pos('
</',Result)+1);
end;
function InternalGetResponse :
String;
var
Hash : TDCP_md5;
Digest:
array[0..15]
of byte;
str :
String;
i : Integer;
begin
str := challenge+'
-'+APassword;
Hash:= TDCP_md5.Create(
nil);
Hash.Init;
Hash.Update(str[1],Length(str)*2);
Hash.
Final(Digest);
// produce the digest
Hash.Burn;
Hash.Free;
Result := '
';
for i := 0
to 15
do
Result := Result + IntToHex(Digest[i],2);
Result := LowerCase(Result);
end;
function InternalGetSid :
String;
var
Params: TStringList;
begin
Result := '
';
Params:= TStringList.Create;
try
with Params
do
begin
Clear;
Add('
login:command/response=' + challenge+'
-'+response);
Add('
getpage=../html/login_sid.xml');
end;
Result := HTTP.Post('
http://'+AUrl+'
/cgi-bin/webcm',params);
if Pos('
<sid>',LowerCase(Result))=0
then
raise Exception.Create('
Fehler beim Generieren der Sitzungs-ID.');
System.Delete(Result,1,Pos('
<sid>',LowerCase(Result))+4);
System.Delete(Result,Pos('
</',Result),Length(Result)-Pos('
</',Result)+1);
finally
Params.Free;
end;
end;
function InternalLogout :
String;
begin
Result := HTTP.Get('
http://'+AUrl+'
/cgi-bin/webcm?security%3Acommand%2Flogout=0&sid='+sid);
end;
function InternalGetCalllist :
String;
var
response : TStringStream;
begin
//Anrufliste erzeugen
HTTP.Get('
http://'+AUrl+'
/cgi-bin/webcm?getpage=../html/de/menus/menu2.html&var:menu=fon&var:pagename=foncalls&sid='+sid);
if CSVIfTrueElseXML
then
Result := HTTP.Get('
http://'+AUrl+'
/cgi-bin/webcm?getpage=../html/de/'+'
FRITZ!Box_Anrufliste.csv'+'
&errorpage=..%2Fhtml'+'
%2Fde%2Fmenus%2Fmenu2.html&var%3Alang=de&var%3A
pagename=foncalls&var%3Aerrorpagename=foncalls&var%3Amenu=fon&var%3Apagemaster=&sid='+sid)
else
begin
response := TStringStream.Create('
',TEncoding.UTF8);
HTTP.Get('
http://'+AUrl+'
/cgi-bin/webcm?getpage=../html/de/home/'+'
foncallsdaten.xml'+'
&errorpage=..%2Fhtml'+'
%2Fde%2Fmenus%2Fmenu2.html&var%3Alang=de&var%3A
pagename=foncalls&var%3Aerrorpagename=foncalls&var%3Amenu=fon&var%3Apagemaster=&sid='+sid,response);
Result := Trim(response.DataString);
response.Free;
end;
end;
function InternalClearCalllist :
String;
var
Params : TStringList;
begin
Result := '
';
Params:= TStringList.Create;
try
with Params
do
begin
Clear;
Add('
getpage=../html/de/menus/menu2.html');
Add('
var:lang=de');
Add('
var:pagename=foncalls');
Add('
var:menu=fon');
Add('
telcfg:settings/ClearJournal=0');
Add('
sid='+sid);
end;
Result := HTTP.Post('
http://'+AUrl+'
/cgi-bin/webcm',Params);
finally
Params.Free;
end;
end;
begin
Result := '
';
AErrorString := '
';
HTTP := TIdHttp.Create(
nil);
try
HTTP.HandleRedirects := true;
HTTP.Request.ContentLength := -1;
HTTP.Request.Accept := '
text/html, */*';
HTTP.HTTPOptions := [hoForceEncodeParams];
try
challenge := InternalGetChallenge;
response := InternalGetResponse;
sid := InternalGetSid;
Result := InternalGetCalllist;
if ADeleteOnBox
then
InternalClearCalllist;
InternalLogout;
except
on E:
Exception do AErrorString := E.
Message;
end;
finally
HTTP.Free;
end;
end;