警告:
このアプローチは不十分であり、非常に危険です。[もっと見る] ボタンと同様にフォーム データを投稿しますが、(すべてのページを受け取るために) 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;