Многократный возврат POST-запроса 403 Запрещено - PullRequest
0 голосов
/ 09 марта 2020

** Запрос сделан на форуме Xenforo, чтобы отправить сообщение (я делаю P C клиент для создания инструмента для пользователей) РЕДАКТИРОВАТЬ : Примечание: я могу войти в систему правильно, но этот пакет использует параметры URL, а не составные параметры с границами. Может быть, я мог бы как-то отправить это в качестве параметра один?

Это запрос, который я хочу сделать:

content-type: multipart/form-data; boundary=----WebKitFormBoundaryXbKA9LAnz7mtDrMB
content-length: 1362
x-requested-with: XMLHttpRequest

Данные формы:

------WebKitFormBoundaryXbKA9LAnz7mtDrMB
Content-Disposition: form-data; name="message_html"

<p>Message here</p>
------WebKitFormBoundaryXbKA9LAnz7mtDrMB
Content-Disposition: form-data; name="attachment_hash"

eb1e7f44621360ec2dbffade55b211ce
------WebKitFormBoundaryXbKA9LAnz7mtDrMB
Content-Disposition: form-data; name="attachment_hash_combined"

{"type":"post","context":{"thread_id":3075},"hash":"eb1e7f44621360ec2dbffade55b211ce"}
------WebKitFormBoundaryXbKA9LAnz7mtDrMB
Content-Disposition: form-data; name="last_date"

1583778299
------WebKitFormBoundaryXbKA9LAnz7mtDrMB
Content-Disposition: form-data; name="last_known_date"

1583778299
------WebKitFormBoundaryXbKA9LAnz7mtDrMB
Content-Disposition: form-data; name="_xfToken"

143712896,f80153fecc37cd40d1796092b6f2ba53
------WebKitFormBoundaryXbKA9LAnz7mtDrMB
Content-Disposition: form-data; name="_xfRequestUri"

/threads/123
------WebKitFormBoundaryXbKA9LAnz7mtDrMB
Content-Disposition: form-data; name="_xfWithData"

1
------WebKitFormBoundaryXbKA9LAnz7mtDrMB
Content-Disposition: form-data; name="_xfToken"

143712896,f80153fecc37cd40d1796092b6f2ba53
------WebKitFormBoundaryXbKA9LAnz7mtDrMB
Content-Disposition: form-data; name="_xfResponseType"

json
------WebKitFormBoundaryXbKA9LAnz7mtDrMB--

Вот как я это реализую (используя HttpWebRequest):

 LoginReq.Method = "POST";
                    LoginReq.KeepAlive = true;
                    LoginReq.CookieContainer = Cookies;
                    LoginReq.ContentType = "multipart/form-data; boundary=" + Boundary;
                    LoginReq.Referer = "xenforo.com";
                    LoginReq.UserAgent = UA;

                    MemoryStream PostDataStream = new MemoryStream();
                    StreamWriter FormDataWriter = new StreamWriter(PostDataStream);

                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");
                    FormDataWriter.Write("Content-Disposition: form-data; name=\"message_html\"\r\n\r\n<p>{0}</p>", Message);
                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");
                    FormDataWriter.Write("Content-Disposition: form-data; name=\"attachment_hash\"\r\n\r\n1fc9b3ba411cb2b7f2302320a4dea08f");
                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");
                    FormDataWriter.Write("Content-Disposition: form-data; name=\"attachment_hash_combined\"\r\n\r\n{\"type\":\"post\",\"context\":{\"thread_id\":3060},\"hash\":\"1fc9b3ba411cb2b7f2302320a4dea08f\"}");
                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");
                    FormDataWriter.Write("Content-Disposition: form-data; name=\"last_date\"\r\n\r\n1583767454");
                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");
                    FormDataWriter.Write("Content-Disposition: form-data; name=\"last_known_date\"\r\n\r\n1583767454");
                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");
                    FormDataWriter.Write("Content-Disposition: form-data; name=\"_xfToken\"\r\n\r\n143712896,f80153fecc37cd40d1796092b6f2ba53");
                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");
                    FormDataWriter.Write("Content-Disposition: form-data; name=\"_xfRequestUri\"\r\n\r\n/threads/123");
                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");
                    FormDataWriter.Write("Content-Disposition: form-data; name=\"_xfWithData\"\r\n\r\n1");
                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");
                    FormDataWriter.Write("Content-Disposition: form-data; name=\"_xfToken\"\r\n\r\n143712896,f80153fecc37cd40d1796092b6f2ba53");
                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");
                    FormDataWriter.Write("Content-Disposition: form-data; name=\"_xfResponseType\"\r\n\r\njson");
                    FormDataWriter.Write("\r\n--" + Boundary + "\r\n");

                    FormDataWriter.Write("\r\n--" + Boundary + "--\r\n");
                    FormDataWriter.Flush();

                    LoginReq.ContentLength = PostDataStream.Length;

                    using (Stream S = LoginReq.GetRequestStream())
                    {
                        PostDataStream.WriteTo(S);
                    }
                    PostDataStream.Close();

                    HttpWebResponse LoginResp = (HttpWebResponse)LoginReq.GetResponse();
                    Cookies.Add(LoginResp.Cookies);
                    LoginResp.Close();

Пара вопросов:

1) Я могу переслать его с помощью инструментов разработчика chrome, захватив пакет запроса и повторно, но я не могу сделать это от моего. Я понимаю, что это может быть токен xenforo, но я использую токен по умолчанию из моего экземпляра входа в систему в браузере. Есть ли способ сгенерировать токен, поскольку у меня нет доступа к API для xenforo, который я мог бы использовать, и в будущем было бы полезно узнать

2) Я не уверен, как отформатировать форму данные в моем потоке запросов. Я использую / r / n, который использовал другой учебник. Я знаю, что / r означает go в начале строки, а / n означает перевод строки, но зачем это нужно веб-сайту? я правильно их использую?

3)

...