** Запрос сделан на форуме 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)