如何使用C#远程下推堆栈溢出帖子?

如何使用C#远程下推堆栈溢出帖子?,c#,http,httpwebrequest,C#,Http,Httpwebrequest,我可能试图做一些不可能或非常困难的事情,但无论如何我都想尝试一下。我一直在写一个程序,可以自动向下投票堆栈溢出的职位为我 因此,我合乎逻辑的第一步是找出当我按下向下投票按钮时幕后发生了什么。我使用HTTP网络分析器来查看浏览器如何与我要向下投票的服务器通信。这就是它给我看的 然后我想,如果我编写一个C#程序,发送一个HTTP请求,该请求与我按下downvote按钮时发送的请求相同,那么我应该能够远程对其进行downvote。所以我想到了这个: WebRequest req = WebReque

我可能试图做一些不可能或非常困难的事情,但无论如何我都想尝试一下。我一直在写一个程序,可以自动向下投票堆栈溢出的职位为我

因此,我合乎逻辑的第一步是找出当我按下向下投票按钮时幕后发生了什么。我使用HTTP网络分析器来查看浏览器如何与我要向下投票的服务器通信。这就是它给我看的

然后我想,如果我编写一个C#程序,发送一个HTTP请求,该请求与我按下downvote按钮时发送的请求相同,那么我应该能够远程对其进行downvote。所以我想到了这个:

WebRequest req = WebRequest.Create("http://stackoverflow.com/posts/3905734/vote/3");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = 37;

req.Headers.Add("Request", "POST /posts/3905734/vote/3 HTTP/1.1");
req.Headers.Add("Accept", "application/json, text/javascript, */*; q=0.01");
req.Headers.Add("X-Requested-With", "XMLHttpRequest");
req.Headers.Add("Referer", "http://stackoverflow.com/questions/3905734/how-to-send-100-000-emails-weekly");
req.Headers.Add("Accept-Language", "en-us");
req.Headers.Add("Accept-Encoding", "gzip, deflate");
req.Headers.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)");
req.Headers.Add("Host", "stackoverflow.com");
req.Headers.Add("Connection", "Keep-Alive");
req.Headers.Add("Cache-Control", "no-cache");
req.Headers.Add("Cookie", "__utmc=140029553; __utma=140029553.1661295586.1330352934.1331336368.1331402208.44; __utmz=140029553.1331159433.33.7.utmcsr=meta.stackoverflow.com|utmccn=(referral)|utmcmd=referral|utmcct=/users/153008/cody-gray; __qca=P0-1737884911-1330352934366; usr=t=TJUTES9CakOu&s=f3MgHSwW2EWk; km_ai=91003; km_uq=; km_lv=x; km_ni=91003; __utmb=140029553.17.10.1331402208");

var requestMessage = Encoding.UTF8.GetBytes("fkey=abfd538253d7ca1e988f306ea992eda0");
var strm = req.GetRequestStream();
strm.Write(requestMessage, 0, requestMessage.Length);
strm.Close();

var rep = req.GetResponse();
strm = rep.GetResponseStream();
var rdr = new StreamReader(strm);
string responseFromServer = rdr.ReadToEnd();
Console.WriteLine(responseFromServer);
rdr.Close();
strm.Close();
Console.Read();
有些标题不允许我写。对于标题
Accept
Referer
User Agent
Connection
,它抛出了如下错误:

必须使用适当的属性或方法修改此标头

主机头导致此错误:

无法直接修改“主机”标题

我只是注释掉了引起麻烦的标题,乐观地希望它仍然可以工作,但我从服务器上得到了这条消息

{“成功”:错误,“警告”:错误,“新闻核心”:0,“消息”:“,”刷新:错误}

“Success”:false
似乎表明它没有成功地否决该帖子,我转到该页面,它的票数与我运行该程序之前的票数相同。换句话说,我的程序不起作用


有没有人知道我是在正确的道路上,我能做些什么使它有效,或者它甚至可以使它起作用?< / P> < P>你可能不认为这是一个答案,但我确实这样认为;你试图做的事被认为是对系统的滥用。出于许多原因,我们不提供API,而尝试对不属于已发布API一部分的内容进行反向工程是。。。讨厌的

感谢您发布您的安全cookies。因此,我将点击一个按钮,让您退出SE,以保护您的帐户不被滥用。您将能够正常重新登录

如果你坚持试图滥用该系统,我们保留坦率地表现出十足的孩子气和幼稚的权利;如果我们认为你试图做一些令人讨厌的事情,我们总是乐于引入额外的限制和障碍,随机更改API等等。或者只是挂起帐户或阻止网络访问


请允许我总结一下:我们真的不希望您这样做。

我对这类事情知之甚少,但出于好奇,您知道fkey是否是随机生成的(用于安全措施或其他用途)?还是我在这方面做得太差了?另外,为了记录在案,这是我一整天看到的最好的问题这是你真正应该做的吗?更糟糕的是,你真的应该分享怎么做吗?@M.Babcock我们都是这里的程序员,迟早会有人想办法通过编程操纵这个网站。对很多人来说,这有点破坏了它,我不明白为什么有人会投这么差的一个问题。彼得,你正在试图修改一些限制性标题。看看这个+1当然不是我想要的答案,但我有点兴奋能得到这样的“官方”答案。@Peter如前所述,我已经点击了“到处注销”按钮-这纯粹是为了保护你-如果你发现自己注销了,那不是因为我对你的帐户做了任何事情。马克-有着高“声誉”的人一直在滥用系统。他们不费吹灰之力就否决了投票。我相信我已经成为了用户的目标,因为我发布的每一个问题都会突然遭到否决票。我甚至有其他“声誉良好”的用户质疑我的问题的否决票。你为什么不要求人们解释投票失败的原因呢。如果这个系统是为了提高问题的质量,那么它就是失败的,因为海报不能显示出他们的错误所在。-Lee试图对一些不属于已发布API的内容进行反向工程是。。。讨厌的嗯。。。gulps@Josh我们在聊天和问答之间的保护意识有些不同