警告:
这种方法是蹩脚的,而且相当危险。它与“显示更多”按钮类似地发布表单数据,但它使用一个 while 循环(接收所有页面),该循环重复直到找到响应中的确切常量(在代码中它是LastPageResponse
常量),所以当响应内容页面将在一段时间内更改,并且该常量不会出现在响应中,您会发现自己处于无限循环中。
在GetAllQuestions
函数中,您可以指定:
- AUser - 是 URL 中斜杠后的用户名
- AFromDate - 是您想要从中获取结果的开始日期时间
- AStartPage - 是您想要从中获取结果的 AFromDate 日期时间的起始页面
该GetAllQuestions
函数返回一个基本用户的页面,后跟换行符分隔的内容,范围从基本页面到您指定的时间和页面中的所有页面。忘了注意,您需要以不同于基本页面的方式解析的附加内容,因为它不是 HTML 内容。
uses
IdHTTP;
implementation
function GetAllQuestions(const AUser: string; AFromDate: TDateTime;
AStartPage: Integer = 1): string;
var
Response: string;
LastPage: Integer;
TimeString: string;
HTTPClient: TIdHTTP;
Parameters: TStrings;
const
LineBreaks = sLineBreak + sLineBreak;
LastPageResponse = '$("#more-container").hide();';
begin
Result := '';
HTTPClient := TIdHTTP.Create(nil);
try
Result := HTTPClient.Get('http://ask.fm/' + AUser) + LineBreaks;
Parameters := TStringList.Create;
try
LastPage := AStartPage;
TimeString := FormatDateTime('ddd mmm dd hh:nn:ss UTC yyyy', AFromDate);
Parameters.Add('time=' + TimeString);
Parameters.Add('page=' + IntToStr(LastPage));
while LastPage <> -1 do
begin
Parameters[1] := 'page=' + IntToStr(LastPage);
Response := HTTPClient.Post('http://ask.fm/' + AUser + '/more',
Parameters);
if Copy(Response, Length(Response) - Length(LastPageResponse) + 1,
MaxInt) = LastPageResponse
then
LastPage := -1
else
LastPage := LastPage + 1;
Result := Result + Response + LineBreaks;
end;
finally
Parameters.Free;
end;
finally
HTTPClient.Free;
end;
end;
以及用法:
procedure TForm1.Button1Click(Sender: TObject);
begin
try
Memo1.Text := GetAllQuestions('TLama', Now);
except
on E: Exception do
ShowMessage(E.Message);
end;
end;