关于怎样突破1个微信投一票及人工刷票微信号推荐的相关介绍
很多人其实现在对于怎样突破1个微信投一票是一无所知的,大家应该都知道现在的微信投票评选活动几乎都是限制了一个微信只能让你投一票的,那么当我们面对到这样的情况的时候,我们应该怎么去突破呢?还有就是人工刷票微信号推荐这个问题,毕竟现在大家都是有需要微信刷票的,没有找到渠道肯定是非常苦恼的,所以今天我就来给大家详细的介绍下吧
越来越多的人在平常生活中使用微信,以微信为载体的许多功能就被开发和使用了起来,比如——微信投票。于是乎,微信上兴起了各种投票,从小学生到gov部门的投票活动都有,,刷票交易也越来越火。刷票单纯在请求的技术手段上,都是正常的访问请求,基本是没法识别的,但它真的像吃瓜群众一样说的没法认出来吗?未必!
1.水军为了做更多生意自曝身份,在微信昵称上用了显而易见的刷票词语,比如用“票”筛选投票数据,就得到了大量的刷票信息,见图:
这样,只要通过一定的规则来匹配投票人的微信昵称,判断出投票人是否是刷票的,如果是进入黑名单。如果一个被投票的有大量黑名单的人给他投票,那么他就有花钱买票嫌疑。
2.每天投票量统计分析,如果是持续几天的投票。我们设想被投票人每天都在努力地拉票,从开始到结束应该是一个影响力越来越大或者影响力在结束的时候弱一点,所以每天的投票量统计曲线是先抑后扬或呈正态分布。把每个选 手的每天投票量曲线做出来,和其他人不一样的就一眼看出来了。
3.时段投票量统计分析,这个应该比较容易理解,投票时间应该符合一般人的作息时间,如果在凌晨一、两点某个选手出现大量的投票,而他白天投票量反正少,这就很难用正常投票解释了。
4.投票数爆发点与超越关系的分析。买票是需要成本的,被投票人买票的话当然是想用最少的成本取得第一。如果他被别人超越了的话,不想让自己先期投入变成“沉没成本”,只能加钱再买票再次超越别人。所以,如果一个选手多次被别人超越后投票数立马上升,特别是上升的票数都差不多(想象一下每次都是一百一百地买票),那就基本是刷票了。
5. 多人刷票的情况。这种情况下就有点好玩了,发展的结果是:
a.谁也不服谁,杠上了,超越关系明显。最后钱多的2,3个人超过其他人好多倍的票;
b.为了节约成本,保持第二或第三,在最后时段为了夺冠冲刺刷票,产生了一个非常异常的投票量曲线。
谁最清楚哪个人是刷票水军呢?应该是疼xun。如果是专门做投票系统,积累了大量数据的话,是可以建立模型识别是刷票行为的(至于为了点击量是否愿意做这个,或者做了这个不启用就不得而知了),小公司的话也可以用第1点做简单地判断,另外可以加验证码,增加投票时间操作,提高刷票水军的时间成本,另外验证码看多了眼睛也会花的偷笑。
延伸阅读:
1.分析
既然是网页投票,那肯定可以伪造HTTP请求来实现刷票。需要分析的就是该网站到底采用了哪些防止刷票的措施。原投票已经停了,我给大家描述一下。
(1).首先,这是公开给所有人的投票,没有必须是其用户的限制。
(2).先按F12查看网络情况,抓取投票的HTTP请求。点投票,截取,发现是Get方式,QuerySting值有一个随机数,一个候选人的编号,还有一个不清楚的值,初步猜测是用Cookie限制的。
(3).投完票再点投票,显示“你已经参与过,每天只能投一次”。
(4).在Chrome浏览器,设置,隐私设置,查看Cookie里,找该网站的Cookies,发现多了一个不清楚的,还有一个存着候选人编号的Cookie。把这俩都删了,再点投票,显示“投票失败”。虽然没投票成功,但是返回信息不一样了,说明肯定和Cookie有关。
(5).直接禁用该网站的Cookie,点投票还是显示“投票失败”。
(6).这时候仔细看了看QueryString那一长传不清楚的值,和Cookie里那个不清楚的值是相同的,投票按钮的事件应是不会变的,那估计页面加载的时候这俩就一起加载了。然后刷新页面,果然这个值变了。
(7).然后只删除存候选人编号的Cookie,保留这个Cookie,再点投票,成功了!
这个网站防刷票的措施比较简陋,只要仔细看看就能发现这个问题。然后我做了第一版。
2.构造HTTP请求
(1).获取SID。先把上面我说的那个一长串不清楚的值叫做SID吧,应该是为了验证Cookie是否起作用。
1).获取SID。先把上面我说的那个一长串不清楚的值叫做SID吧,应该是为了验证Cookie是否起作用。
private string GetSid() { string url = "http://www.xxxxxx.com/xxxx/list-510-1.html"; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); var res = req.GetResponse() as HttpWebResponse; string sid= res.Headers.GetValues(5)[0].Split('=')[1];//把Response里第一个Cookie的的值从Headers里取出来。 return sid; }
(2).根据浏览器抓取的HTTP请求模拟一个HTTP请求
private HttpWebRequest CreatHttp() { Random rnd = new Random(); string rndstr = rnd.NextDouble().ToString();//这是模仿QueryString里那个随机数的,没有估计也不影响结果 string url = "http://www.xxxxxx.com/xxxx/api.php?op=qgtp&id=32&sid=" + sid + "&r=" + rndstr; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); CookieCollection cookies = new CookieCollection(); //添加Cookie cookies.Add(new Cookie("xxxxaction", sid, "/rail", "www.peoplerail.com")); cookies.Add(new Cookie("xxxxxxxrand", rndstr, "/rail", "www.peoplerail.com")); //存的也是随机数,生命周期只有2秒,所以分析的时候没发现,为了仿的逼真就也写上了 req.CookieContainer = new CookieContainer(); req.CookieContainer.Add(cookies); req.Method = "GET"; req.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"; req.Timeout = 10000; req.Referer = "http://www.xxxxxx.com/xxxxxx/index.php?m=content&c=index&a=lists&catid=517&page=6"; req.KeepAlive = true; req.Headers.Add("x-requested-with", "XMLHttpRequest"); //以上全部按照浏览器里抓取的结果一一对应 return req; }
(3).刷票,并观察刷票状况。就是将返回的内容里找到票数,更新到TextBox上。
private void Go() { HttpWebRequest req = CreatHttp(); var res = req.GetResponse() as HttpWebResponse; Stream st = res.GetResponseStream();//读取Response StreamReader sr = new StreamReader(st); string result = sr.ReadToEnd().ToString(); try { textBox1.Text = result.Split(':')[1].Split('<')[0];//从返回的内容里找出票数 } catch { timer1.Stop(); label2.Text = "刷票暂停"; } }
(4).设置循环。用For循环发请求的话,嗖一下几百次循环完了,而那边还没反应过来。中间用Sleep()的话,程序有时会陷入假死的状态,不能实时观察到刷票的情况。所以我们就用Winform自带的控件Timer,在页面加载的时候先停了,设置时间间隔,然后在Timer的事件里加上上面的方法就可以了。
private void Form1_Load(object sender, EventArgs e) { timer1.Stop(); timer1.Interval = 1000; }
3.改进
上面几步完成后试着刷了一下,发现刷太快系统会返回“投票失败,疑似刷票”的提示,又调整了一下间隔时间。可过了两天,突然又不好使了,几番分析,发现是加了IP限制。找代理比较麻烦,所以就用宽带重连的方法不停的换IP吧。每刷一票断线重连一次就可以了。
public static string Connect(string UserS,string PwdS) { string arg = @"rasdial.exe 宽带连接" + " " + UserS + " " + PwdS; return InvokeCmd(arg); } public static string Disconnect() { string arg = string.Format("rasdial \"{0}\" /disconnect", "宽带连接"); return InvokeCmd(arg); } private static string InvokeCmd(string cmdArgs) { string Tstr = ""; Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.StandardInput.WriteLine(cmdArgs); p.StandardInput.WriteLine("exit"); Tstr = p.StandardOutput.ReadToEnd(); p.WaitForExit(); p.Close(); return Tstr; }