我无法在PHPBB3论坛上创建线程

我的问题是我得到了来自服务器的0字节响应(我正在使用Fiddler2来检查它)。

图片: WTF

我在做什么:

  1. 登录。我收到了cookies。
  2. 创建线程

public void CreateTopic(string subject, string message, string forumId) { HttpWebResponse response = null; string source = string.Empty; string lastClick= string.Empty; string creationTime= string.Empty; string formToken = string.Empty; // GET while(true) { webRequest = (HttpWebRequest) HttpWebRequest.Create(Url + "posting.php?mode=post&f=" + forumId + "&sid=" + sid); webRequest.KeepAlive = true; webRequest.Method = "GET"; webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.Host = Url.Replace("http://", "").Replace("/", ""); webRequest.CookieContainer = cookieJar; ServicePointManager.Expect100Continue = false; try { response = (HttpWebResponse) webRequest.GetResponse(); UpdateSid(Url + "posting.php?mode=post&f=" + forumId + "&sid=" + sid); } catch (Exception ex) { continue; } break; } StreamReader streamReader = new StreamReader(response.GetResponseStream()); source = streamReader.ReadToEnd(); streamReader.Close(); response.Close(); // Get stuff // last click Match lastClickMatch = Regex.Match(source, "name=\"lastclick\" value=\"([0-9]{10})\" />"); if (lastClickMatch.Success) lastClick = lastClickMatch.Groups[1].Value; // creation time Match creationTimeMatch = Regex.Match(source, "name=\"creation_time\" value=\"([0-9]{10})\" />"); if (creationTimeMatch.Success) creationTime = creationTimeMatch.Groups[1].Value; // form token Match formTokenMatch = Regex.Match(source, "name=\"form_token\" value=\"(.{40})\" />"); if (formTokenMatch.Success) formToken = formTokenMatch.Groups[1].Value; // POST webRequest = (HttpWebRequest)WebRequest.Create(Url + "posting.php?mode=post&f=" + forumId + "&sid=" + sid); webRequest.Method = "POST"; webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.Host = Url.Replace("http://", "").Replace("/", ""); webRequest.CookieContainer = cookieJar; string data = "icon=&subject=" + Encode(subject) + "&addbbcode20=100&message=" + Encode(message) + "&attach_sig=on&post=Submit&lastclick=" + lastClick + "&creation_time=" + creationTime + "&form_token=" + formToken; byte[] byte1 = Encoding.UTF8.GetBytes(data); webRequest.ContentLength = byte1.Length; ServicePointManager.Expect100Continue = false; Stream stream = webRequest.GetRequestStream(); stream.Write(byte1, 0, byte1.Length); stream.Close(); response = (HttpWebResponse)webRequest.GetResponse(); UpdateSid(Url + "posting.php?mode=post&f=" + forumId + "&sid=" + sid); response.Close(); } 

我在小提琴手上得到这个:RAW:

 POST http://stuff.com/posting.php?mode=post&f=8&sid=6d278be1e705fe0261f253bbc96ab7a4 HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: stuff.com Cookie: phpbb3_goeyz_u=55443;phpbb3_goeyz_k=;phpbb3_goeyz_sid=6d278be1e705fe0261f253bbc96ab7a4 Content-Length: 165 icon=&subject=g&addbbcode20=100&message=d&attach_sig=on&post=Submit&lastclick=1323904393&creation_time=1323904393&form_token=b81c23e308f0bd3a0a73907efcc8c18e5dba0f7f 

响应RAW:

 HTTP/1.1 302 Found Date: Wed, 14 Dec 2011 23:13:14 GMT Server: Apache/2.2.14 (Ubuntu) X-Powered-By: PHP/5.3.2-1ubuntu4.10 Location: http://stuff.com/games.html Vary: Accept-Encoding Content-Length: 0 Connection: close Content-Type: text/html 

我不知道发生了什么事。 如果你能帮助我,我将不胜感激。 对不起我的英语。

我在phpBB 3.0.9的源代码中找到了这个代码片段:

 203 // Check permissions 204 if ($user->data['is_bot']) 205 { 206 redirect(append_sid("{$phpbb_root_path}index.$phpEx")); 207 } 

所以他们可能会在这里拉你一招。 你确定你被允许做你想做的事吗?

无论如何,我想您可能想要更改您的用户代理 :

 webRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7"; 

这可能有助于不被识别为机器人,这可能是因为默认的UserAgent值为null

我发现了为什么它没有创建线程。 它检查:

 if ($user->data['is_bot']) 

如果你不想成为机器人,那么在发送POST之前你必须等待8秒钟:

 Thread.Sleep(8100); 

它为我解决了所有问题。

它返回的状态代码为302 Found,这意味着服务器正在尝试将您重定向到另一个页面(在您的示例中,“http://stuff.com/games.html”)。