**向Xenforo论坛发出了请求,以发布消息(我正在制作PC客户端,目的是为用户制作工具) EDIT :提及:我能够正确登录,但该数据包使用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令牌,但是我正在使用浏览器登录实例中的默认令牌。因为我无法使用我可以使用的xenforo API,是否有一种生成令牌的方法,这对将来的了解很有帮助
2)我不确定如何格式化请求流中的表单数据。我正在使用另一个教程使用的/ r / n。我知道/ r表示转到行的开头,而/ n表示换行符,但是为什么网站需要这些内容?我可以正确使用它们吗?
3)