使用phpbb-Delphi发送私人消息

使用phpbb-Delphi发送私人消息,delphi,Delphi,我花了几个小时试图理解为什么这根本不起作用,但没有成功;( 我想用我的delphi应用程序发送私人消息 我可以登录、阅读和删除消息,但我无法发送消息(我的论坛使用phpbb3) 通过分析post数据,我得出以下结论: Post URL: http://example.com/ucp.php?i=pm&mode=compose&action=post&sid=xxxxx Post Data: username_list= icon=0 subject=assunto me

我花了几个小时试图理解为什么这根本不起作用,但没有成功;(

我想用我的delphi应用程序发送私人消息

我可以登录、阅读和删除消息,但我无法发送消息(我的论坛使用phpbb3)

通过分析post数据,我得出以下结论:

Post URL: http://example.com/ucp.php?i=pm&mode=compose&action=post&sid=xxxxx

Post Data:
username_list=
icon=0
subject=assunto
message=texto
address_list[u][2]=to
lastclick=xxxx
status_switch=0
post=Submit
attach_sig=on
creation_time=xxxx
form_token=xxx
发送前需要获取的xxx值。我已手动检查了这些值,它们是正确的

我的代码:

procedure Envia();
var
  form_token, cr_time, sid: string;
  pp: TStringList;
begin
  //download the page to get the values (token, sid...)
  FPageSource.Text := FCon.Get('http://example.com/ucp.php?i=pm&mode=compose&u=2');

  //form token
  form_token := TRegEx.Match(FPageSource.Text, 'form_token" value="(\w+)"').Groups[1].Value;

  //creation time
  cr_time := TRegEx.Match(FPageSource.Text, 'creation_time" value="(\w+)"').Groups[1].Value;

  //sid
  sid := TRegEx.Match(FPageSource.Text, 'sid=(\w+)').Groups[1].Value;

  //data
  pp := TStringList.Create;
  pp.Add('username_list=');
  pp.Add('icon=0');
  pp.Add('subject=assunto');
  pp.Add('message=mensagem');
  pp.Add(HttpEncode('address_list[u][2]') + '=to');
  pp.Add('lastclick=' + cr_time);
  pp.Add('status_switch=0');
  pp.Add('post=Submit');
  pp.Add('attach_sid=on');
  pp.Add('creation_time=' + cr_time);
  pp.Add('form_token=' + form_token);

  //send
  FPageSource.Text := FCon.Post('http://example.com/ucp.php?i=pm&mode=compose&action=post&sid=' + sid, pp);

  //The result in FPageSource is my inbox, my post data was
  //ignored by phpbb ;(

end;
注:

  • FCon=TIdHttp
  • FPageSource=TStringList
  • HttpEncode=HttpApp单元中的函数
  • 使用delphixe6

--我用Opera发送了一条消息,用Fiddler捕获了post数据。正如您所见,数据结构是相同的,为什么不工作?

主要问题是简单的等待时间(垃圾邮件保护)。另外,您可能应该先添加用户-再添加一个请求

这段代码应该可以正常工作

  s:=FCon.Get('http://.../ucp.php?i=pm&mode=compose');

  pp.Add('username_list=UserToADd');
  pp.Add('add_to=Add');
  pp.Add('icon=0');
  pp.Add('subject=');
  pp.Add('addbbcode20=100');
  pp.Add('message=');
  pp.Add('lastclick='+...);
  pp.Add('status_switch=0');
  pp.Add('creation_time='+...);
  pp.Add('form_token='+...);

  s:=FCon.Post('http://.../ucp.php?i=pm&mode=compose&action=post&sid=...', pp);

  Sleep(2000); // <-- wait here

  pp.Clear;
  pp.Add('username_list=');
  pp.Add('icon=0');
  pp.Add('subject=XX');
  pp.Add('addbbcode20=100');
  pp.Add('message=YY');
  pp.Add('address_list[u][2]=to');
  pp.Add('lastclick='+...);
  pp.Add('status_switch=0');
  pp.Add('post=Submit');
  pp.Add('attach_sid=on');
  pp.Add('creation_time='+...);
  pp.Add('form_token='+...);  // new one

  s:=FCon.Post('http://.../ucp.php?i=pm&mode=compose&action=post&sid=...', pp);
s:=FCon.Get('http://.../ucp.php?i=pm&mode=compose');
pp.Add('username_list=UserToADd');
pp.Add('Add_to=Add');
pp.Add('icon=0');
pp.Add('主题=');
pp.Add('addbbcode20=100');
pp.Add('message=');
pp.Add('lastclick='+…);
pp.Add('status_switch=0');
pp.Add('创建时间='+…);
pp.Add('form_token='+…);
s:=FCon.Post('http://.../ucp.php?i=pm&mode=compose&action=post&sid=...",pp),;

睡眠(2000年);//您捕获了Opera的请求;您的程序中的等效捕获在哪里?它们匹配吗?换句话说,您如何知道您真正发送的是您认为正在发送的内容?@RobKennedy post数据是相同的,但返回代码是302,如果仔细查看,您会发现主体大小是0。检查新图像:--编辑:HandlerRedirects=true,相同的结果>。头呢?发送和接收的头都是一样的吗?@RobKennedy你认为是keep alive造成的吗?我怀疑,尽管Expect头在它的位置看起来可疑。我想你越来越近了。从IP地址来看,我假设你可以访问服务器。也许你可以检查一下它的日志用来查看服务器认为正在发生什么。天哪,工作得很好!但是我已经把睡眠移到了FCon.Post上面。谢谢。