当前位置 : 主页 > 编程语言 > delphi >

delphi – 如何下载所有问题和答案的ask.fm特定用户墙源代码?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我正在尝试从用户个人资料中下载所有问题和答案,但是有一个问题,如果用户有大量问题我必须点击“显示更多”来扩展该列表.如果我尝试下载例如这个人的问题和答案: http://ask.fm/
我正在尝试从用户个人资料中下载所有问题和答案,但是有一个问题,如果用户有大量问题我必须点击“显示更多”来扩展该列表.如果我尝试下载例如这个人的问题和答案: http://ask.fm/UnaRamekic(随机选择),我只会得到那些被展示的,我点击后显示更多的那些没有被获取请求检索.我怎么能得到ICS或Indy组件的所有问题.谢谢.

我的代码:

procedure TForm1.sButton1Click(Sender: TObject);
begin
With HttpCli1 do begin
    URL            := sedit1.Text;
    RequestVer     := '1.1';
    RcvdStream := TMemoryStream.Create;
    try
        Get;
    except
        ShowMessage('There has been an error , check your internet connection !');
        RcvdStream.Free;
        Exit;
    end;

    RcvdStream.Seek(0,0);
    Memo1.Lines.LoadFromStream(RcvdStream);
    RcvdStream.Free;
 end;
 end;
警告:

这种做法很蹩脚,非常危险.它类似于Show more按钮发布表单数据,但它使用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;
网友评论