Я не могу создать тему на форуме PHPBB3

Моя проблема в том, что я получаю ответ 0 байт от сервера (я использую Fiddler2, чтобы проверить это).

Изображение: wtf

Что я делаю:

  1. Войти. Я получаю куки.
  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

Я понятия не имею, что происходит. Если вы мне поможете буду благодарен. Прошу прощения за мой английский.


person carck3r    schedule 14.12.2011    source источник
comment
Что вы видите в Fiddler, когда пытаетесь создать поток с веб-сайта phpbb3?   -  person M.Babcock    schedule 15.12.2011
comment
Вы не получаете 0 байт ответа, тело вашего ответа имеет длину 0, что определяется заголовком Content-Length.   -  person CodeCaster    schedule 15.12.2011


Ответы (3)


Я нашел этот фрагмент в исходниках 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.

person CodeCaster    schedule 15.12.2011
comment
@ carck3r, тогда, возможно, вам следует попробовать установить (приблизительно) ту же версию phpBB3 локально и убедиться, что вы получаете те же результаты. Затем вы можете приступить к отладке phpBB3 (что просто подразумевает тактическое размещение некоторых echo здесь и там в posting.php), чтобы увидеть, где что-то пойдет не так. - person CodeCaster; 15.12.2011
comment
Да, я проверю это на своем сервере. Если у вас есть другие идеи, то пишите. Сейчас я пойду спать. - person carck3r; 15.12.2011
comment
Я до сих пор понятия не имею, как это сделать. Я использую webClient, и он тоже не работает. - person carck3r; 15.12.2011

Я понял, почему он не создал тему. Он проверяет:

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

Если вы не хотите быть ботом, вам нужно ПОДОЖДИТЬ около 8 секунд перед отправкой POST:

Thread.Sleep(8100);

Это решило все проблемы для меня.

person carck3r    schedule 29.07.2012

Он возвращает код состояния 302 Found, что означает, что сервер пытается перенаправить вас на другую страницу (в вашем примере «http://stuff.com/games.html»).

person William Lawn Stewart    schedule 14.12.2011
comment
Предполагая, что URL-адреса в вашем примере не являются фактическими, последующее перенаправление может дать вам больше информации о том, почему оно не работает. Возможно, это также может потребовать POST вместо GET. - person William Lawn Stewart; 15.12.2011