【问题标题】:How can I remotely downvote a Stack Overflow post with C#? [closed]如何使用 C# 远程对 Stack Overflow 帖子投反对票? [关闭]
【发布时间】:2012-03-10 18:34:12
【问题描述】:

我可能正在尝试做一些不可能或非常困难的事情,但我还是想尝试一下。我一直在编写一个可以自动为我对 Stack Overflow 帖子投反对票的程序。

因此,我合乎逻辑的第一步是找出当我按下否决按钮时幕后发生的事情。我使用了一个 HTTP 网络分析器来查看浏览器如何与我想要投票的服务器进行通信。这就是它向我展示的内容。

然后我想,如果我编写一个 C# 程序,该程序发送的 HTTP 请求与我按下否决按钮时发送的请求相同,我应该能够远程否决它。所以我想出了这个:

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();

有些标题不允许我写。对于标题AcceptRefererUser-AgentConnection,它会抛出如下错误:

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

Host 标头导致了这个错误:

“Host”标头不能直接修改。

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

{"Success":false,"Warning":false,"NewScore":0,"Message":"","Refresh":false}

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

有人知道我是否走在正确的道路上,我可以做些什么来让它发挥作用,或者是否有可能让它发挥作用?

【问题讨论】:

  • 我对这类事情知之甚少,但出于好奇,您知道 fkey 是否是随机生成的(用于安全措施之类的)吗?或者我在这方面做得不够好?另外,为了记录,这是我一整天看到的最好的问题。 :)
  • 这是你真正应该做的事情吗?更糟糕的是,你真的应该分享吗?
  • @M.Babcock 我们都是这里的程序员,迟早会有人想办法以编程方式操作这个网站。
  • 对很多人来说有点宠坏了,不明白为什么有人会投票给这样一个糟糕的问题。
  • 彼得你正在尝试修改一些受限的标题。看看这个stackoverflow.com/questions/239725/…

标签: c# http httpwebrequest


【解决方案1】:

您可能不认为这是一个答案,但我认为;您正在尝试做的事情被视为滥用系统。出于多种原因,我们不提供 API,并且尝试对不属于已发布 API 的内容进行逆向工程......令人讨厌。

感谢您发布安全 cookie。因此,我将点击一个按钮将您从 SE 中注销,以保护您的帐户免受滥用。您将能够正常重新登录。

如果您坚持试图滥用系统,我们保留坦率地说完全幼稚和幼稚的权利;如果我们认为您正在尝试做令人讨厌的事情,我们总是很乐意引入额外的障碍和障碍,随机更改 API 等。或者只是暂停帐户或阻止网络访问。

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

【讨论】:

  • +1 当然不是我想要的答案,但我很高兴能得到这样的“官方”答案。
  • @Peter 如前所述,我点击了“到处注销”按钮 - 这纯粹是为了保护您 - 如果您发现自己已注销,这并不是因为我对您的帐户做了任何事情.
  • Marc - 拥有高“声誉”的人一直在滥用系统。他们不屑一顾地投了反对票,没有留下任何理由。我相信我已经成为用户的目标,因为突然之间我发布的每个问题都会遭到反对。我什至让其他“声誉良好”的用户对我的问题投反对票。您为什么不要求人们解释拒绝投票的原因。如果该系统旨在提高问题的质量,那么它就失败了,因为发布者无法表明他们的错误是什么。 - 李
  • 试图对不属于已发布 API 的东西进行逆向工程是……令人讨厌的 I... 嗯……well... gulps
  • @Josh 我们在聊天和问答之间的保护意识有些不同
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多