网站自动刷帖,刷赞,刷评论等网络推广方式的基本实现

上周写了一个腾讯旗下的一个小说网站的自动回帖程序:

  具体怎么实现的呢?

  其实它就是一个,找到评论接口,然后利用程序模拟HTTP请求的过程。再结合爬虫的相关技术具体实现。 大概分为这么几步:

  第一步:先找到评论接口:

使用chrome或者火狐浏览器,或者专业点的fiddler对评论过程抓包

得到具体的请求为:

POST http://chuangshi.qq.com/bookcomment/replychapterv2 HTTP/1.1
Host: chuangshi.qq.com
Connection: keep-alive
Content-Length: 102
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://chuangshi.qq.com
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://chuangshi.qq.com/bk/xh/AGkEMF1hVjEAOlRlATYBZg-r-69.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: xxxxxx

bid=14160172&uuid=69&content=%E4%B9%A6%E5%86%99%E7%9A%84%E4%B8%8D%E9%94%99&_token=czo4OiJJRm9TQ0RnbSI7

第二步:模拟请求,它的逻辑是:首先通过频道页(玄幻·奇幻 武侠·仙侠 都市·职场 历史·军事 游戏·体育 科幻·灵异 二次元)抓取文章信息。

如玄幻小说的频道页为:http://chuangshi.qq.com/bk/huan/

然后提取文章标题、文章ID,章节ID等数据

注入cookie等参数,模拟请求核心代码:

  1     public class AutoCommentService : AutoComment.service.IAutoCommentService
  2     {
  3         public delegate void CommentHandler(Article article,Comment comment);
  4         public event CommentHandler Commented;
  5         bool stop;
  6         /// <summary>
  7         /// 是否停止服务
  8         /// </summary>
  9         public bool Stop
 10         {
 11             get { return stop; }
 12             set { stop = value; }
 13         }
 14
 15         /// <summary>
 16         /// 初始化数据库
 17         /// </summary>
 18         public void InitDatabase()
 19         {
 20             SQLiteConnection.CreateFile(AppSetting.DB_FILE);//创建SQL文件
 21             SQLiteConnection con = new SQLiteConnection();//建立连接
 22             SQLiteConnectionStringBuilder sqlstr = new SQLiteConnectionStringBuilder();//构建连接字符串
 23             sqlstr.DataSource = AppSetting.DB_FILE;
 24             con.ConnectionString = sqlstr.ToString();
 25             con.Open();//打开连接
 26             string cmdStr = @"create table comment (
 27                                   id integer primary key autoincrement,
 28                                   content varchar(500),
 29                                   articleId varchar(50),
 30                                   articleName varchar(50),
 31                                   url varchar(50)
 32                                 )";
 33             SQLiteCommand cmd = new SQLiteCommand(cmdStr, con);
 34             cmd.ExecuteNonQuery();
 35             con.Close();//关闭连接
 36         }
 37
 38         /// <summary>
 39         /// 运行自动评论
 40         /// </summary>
 41         public void RunAutoComment()
 42         {
 43             this.Stop = false;
 44             List<string> articleTypes = AppSetting.articleType;
 45             while (!Stop)
 46             {
 47                 foreach (var type in articleTypes)
 48                 {
 49                     string url = AppSetting.WEB_HOME_URL + "/bk/" + type;
 50                     var list = GetArticles(url);
 51                     foreach (var article in list)
 52                     {
 53                         AddComment(article, new Comment(AppSetting.commentContent));
 54                         System.Threading.Thread.Sleep(AppSetting.waitSecond * 1000);
 55                         if (Stop)
 56                             break;
 57                     }
 58                     if (Stop)
 59                         break;
 60                 }
 61             }
 62         }
 63
 64         public void StopAutoComment()
 65         {
 66             this.Stop = true;
 67         }
 68
 69         /// <summary>
 70         /// 获取频道页下所有最新发布的文章
 71         /// </summary>
 72         /// <param name="typeUrl">玄幻,军事等频道页URL</param>
 73         /// <returns></returns>
 74         public List<Article> GetArticles(string typeUrl)
 75         {
 76             var html = HttpHelper.GetString(typeUrl);
 77             html = Regex.Match(html, "<div class=\"update_list\">.*?(?=</div>)</div>").Value;
 78             var arcticleUrlMatch = "<a class=‘gray2‘ title=‘(?<title>[^‘]*)‘ href=‘(?<url>[^‘]*)‘>";
 79             MatchCollection matches = Regex.Matches(html, arcticleUrlMatch);
 80             List<Article> articles = new List<Article>();
 81             if (matches != null)
 82             {
 83                 foreach (Match match in matches)
 84                 {
 85                     if (match != null)
 86                     {
 87                         string url = match.Groups["url"].Value;
 88                         string subTitle = match.Groups["title"].Value;
 89                         string title = match.Groups["title"].Value;
 90                         if (string.IsNullOrEmpty(url) == false)
 91                         {
 92                             Article article = new Article(title,subTitle,url);
 93                             articles.Add(article);
 94                         }
 95                     }
 96                 }
 97             }
 98             return articles;
 99         }
100
101         /// <summary>
102         /// 提交评论
103         /// </summary>
104         /// <param name="article"></param>
105         /// <param name="comment"></param>
106         /// <returns></returns>
107         public bool AddComment(Article article, Comment comment)
108         {
109             bool successed = false;
110             var html = HttpHelper.GetString(article.Url);
111             article.BID = Regex.Match(html, "var bid = \"(?<bid>[\\d]+)\"").Groups["bid"].Value;
112             article.UUID = Regex.Match(html, "uuid = \"(?<uuid>[\\d]+)\";").Groups["uuid"].Value;
113             article.Title = Regex.Match(html, "<title>(?<title>[^<]+)</title>").Groups["title"].Value.Replace("_创世中文", "");
114             dal.CommentDal dal = new dal.CommentDal();
115             if (dal.CanComment(article))
116             {
117                 HttpRequestParam param = new HttpRequestParam();
118                 string url = "http://chuangshi.qq.com/bookcomment/replychapterv2";
119                 param.Cookie = AppSetting.Cookie;
120                 param.Method = "post";
121                 string token = AppSetting.Token;
122                 string body = string.Format("bid={0}&uuid={1}&content={2}&_token={3}", article.BID, article.UUID, HttpHelper.UrlEncode(comment.Content), token);
123                 param.Body = body;
124                 var result = HttpHelper.GetHtml(url, param);
125                 comment.Result = result.UnicodeToChinese();
126                 successed = result.Contains("status\":true");
127                 if (successed)
128                 {
129                     comment.Successed = 1;
130                     dal.AddComment(comment, article);
131                 }
132                 else
133                 {
134                     comment.Successed = 0;
135                 }
136
137                 if (Commented != null)
138                 {
139                     Commented(article, comment);
140                 }
141             }
142             return successed;
143         }
144
145     }

  其他的刷赞、和刷收藏方法都类似,都是找到接口,然后再模拟请求。

  但大部分网站的这种类似登录,评论,刷赞等接口都是有一定的反机器人策略的。

  比如常见的策略:验证码、IP限制、账号限制、接口调用频次限制。

但做数据挖掘,做爬虫和这种自动刷评论和系统方总是不断博弈。一方攻,一方守,也都有应对的策略,那就简单谈下攻守方式吧。

一、验证码:

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序
防止恶意破解密码、刷票、论坛灌水、刷页。

当然,种类繁多啊

简单验证码自动识别:

灰化》二值化》去噪》分割 》字符识别

第一步:灰化

就是把图片变成黑白色

第二步:二值化

通过指定筛选的阈值,将特定灰度的像素点转化成黑白两色。

中值二值化:中值127为阈值

均值二值化 :图片所有像素的平均值
直方图二值化:使用直方图方法来寻找二值化阈值
维纳滤波二值化:最小均方误差

第三步:去噪

删除掉干扰的冗余像素点,即为去噪

第四步:分割

将验证码根据边界切割成单个字符

第五步:字符识别

根据匹配字符库中的样本,取相似度最高的字符来实现识别。

相关开源的ORC字符识别模块可参考google开源的

Tesseract

二、IP限制

这个的话,使用多台服务器、或者使用IP代理解决。

三、账号限制

那就多个账号呗,万能的淘宝,啥都有卖。两元一个的QQ号,几十块钱一大把的邮箱都是有的。有了账号后再使用代码实现自动登录,自动切换账号。

其实自动切换账号,这个挺折腾的,尤其是大公司的网站。脚本写的非常复杂,你要想实现自动登录,你就必须先得看懂它的代码,提取它的登录逻辑就行封装。比如腾讯的WEB自动登录密码加密的方法:

它会hash,MD5,位移,编码来来回回加密十来次,封装起来还是有点费劲的。

function getEncryption(password, salt, vcode, isMd5) {
        vcode = vcode || ‘‘;
        password = password || ‘‘;
        var md5Pwd = isMd5 ? password : md5(password),
        h1 = hexchar2bin(md5Pwd),
        s2 = md5(h1 + salt),
        rsaH1 = $pt.RSA.rsa_encrypt(h1),
        rsaH1Len = (rsaH1.length / 2).toString(16),
        hexVcode = TEA.strToBytes(vcode.toUpperCase(), true),
        vcodeLen = Number(hexVcode.length / 2).toString(16);
        while (vcodeLen.length < 4) {
            vcodeLen = ‘0‘ + vcodeLen
        }
        while (rsaH1Len.length < 4) {
            rsaH1Len = ‘0‘ + rsaH1Len
        }
        TEA.initkey(s2);
        var saltPwd = TEA.enAsBase64(rsaH1Len + rsaH1 + TEA.strToBytes(salt) + vcodeLen + hexVcode);
        TEA.initkey(‘‘);
        setTimeout(function () {
            __monitor(488358, 1)
        }, 0);
        return saltPwd.replace(/[\/\+=]/g, function (a) {
            return {
                ‘/‘: ‘-‘,
                ‘+‘: ‘*‘,
                ‘=‘: ‘_‘
            }
            [
                a
            ]
        })
    }

  

四、接口次数限制

降低接口调用速度再配合多账号可以解决问题。

那么自己的网站怎么防止爬虫和恶意接口调用呢?

验证码:使用更复杂的验证码,字母重叠的,连到一块的。

IP限制:这个算了,限制没啥用。

账号限制:一旦监测到机器人行为,根据情况封号,先封1小时、还敢调用封它一天,还敢?那永久封号,这招很狠的。

核心接口使用HTTPS协议

当然我遇到过的最牛逼的反爬系统则是阿里的钉钉了,据说是采用阿里最牛的加密技术做的。好奇的朋友可以去抓下包看看,真的是啥线索都没有。

时间: 2024-08-07 20:02:08

网站自动刷帖,刷赞,刷评论等网络推广方式的基本实现的相关文章

网站收录之网络推广

先对你的公司.产品.目标消费者等定位,然后使用下面的推广方法. 1.定位你的目标客户群体. 2.分析你的目标客户群体. 3.根绝上面的定位分析,选择适合你网站的推广方法,推广方法不是越多越好,而是越合适越好,集中精力做好一件事比四处撒网会更好. 4.预算一下所需要用到的费用,大概能得到的效果. 5.根据统计的数据,分析你所选择的推广方式是否正确,那个推广方法来的客户性价比最高,这是为你更精准的选择最合适的推广方法. 6.不断关注新的网络推广模式出来,并加于利用! 一.常规推广方式1.关于交换链接

基于Ip的刷投票排名及刷百度推广的自动化实现

所有基于Ip的刷投票排名,只要不涉及用户登录情况,都可以在手机端自动化实现,因为电信运营商的ip地址段是无限的,理论上,飞行模式开关一次,所分配ip地址是变化的,这就有了大量的ip可用 在手机端写个app+自动化点击代码(或者app模拟投票http请求),自动打开关闭飞行模式,循环往复,就以实现 PS: android实现,手机必须root. 承接刷投票和刷百度推广业务,费用详谈 基于Ip的刷投票排名及刷百度推广的自动化实现,布布扣,bubuko.com

叮咚recovery——想刷什么包就刷什么包

我手机vivo s11t,我之前试过刷机,刷过很多包,发现只有官网下载的相同版本的固件包可以成功刷入,其他的任何的包都不行,我弟弟的手机vivo x3L,遇见和我一样的情况,他想刷小米的MIUI,开始一直失败,后来某一天告诉我他成功刷好了,奇怪,我问了之后发现使用的是叮咚工具箱,这个工具其实就是改变手机默认的recovery为叮咚recovery,叮咚recovery可以刷入其他的固件包如我前面所说的MIUI,所以其实原理就是说之前手机自带的recovery不支持刷入其他的固件包,是有很多限制的

【安卓刷机】为什么刷机,怎样个性化的刷机

如果是第一次刷机,哪个心理紧张啊.其实紧张什么呢?就是因为不明白原理,只看到一堆的教程来依葫芦画瓢,生怕错了一步将手机变砖.其实对于刷机我们要了解的东西很多,就拿安卓系统来说,我们为什要刷机?怎样可以个性化的刷机? 刷机在我看来就是获得更好的使用体验,实现一些原本实现不了的功能,或者希望通过刷机来修复系统什么的,有的也是为了彰显个性,也可以表达为:一般刷机是解决手机无缘无故出现重启.卡机.无法启动.无法关机等问题:还有些是为了增强原机型的功能,比如增加数码变焦,像框种类,图象的编辑能力等等,在不

JS、JAVA刷题和C刷题的一个很重要的区别

就是最近在做树方面的题时,发现JS和JAVA刷题和C刷题的一个很重要的区别就是传入null的区别 当遍历的时候,C传参数时可以传进去null的指针,因为递归进去,出来时,指针还是指着那个地方 但是JS和JAVA的话,如果传入的不是引用,那么就要通过返回值来记录之前的值,不然的话会丢失之前的状态. 我经常就在null这里犯错误,因为null在C中是null指针,但是在JS和JAVA中null不是引用,仅仅是一种特殊的值. 所以使用JS和JAVA刷关于树递归的题时,最好就是把你要求的值传进去后再返回

2018微信运动公众号刷步数教程,刷98800步

炎炎夏日,人们都愿意躲在空调房中,谁都不敢踏入阳光下半步.但是有一群人却对此无可奈何,那就是在外跑业务的业务员们,为了工作在外中暑了那可真是得不偿失,所以很多怕热的员工往往都会在空闲之余找棵大树嬉戏乘凉. 万恶的资本家老板们哪能忍得住员工拿着工资却逍遥偷懒?于是乎很多公司为了让员工动起来,竟然把微信运动的步数作为考核任务,每天不走两万步竟然扣工资,这可让好多员工苦不堪言. 不过上有政策下就有对策,人们纷纷脑洞大开想出各种刷步数的法子,比如养宠物的竟然把手机绑在了宠物狗身上,让宠物替他"走路&qu

2020年微信怎么刷QQ币?不花钱刷QQ会员微信刷Q币代码最新代码2020年

么刷Q币?不花钱刷QQ会员怎么刷Q会员刷QQQ币 2020年最新怎么刷Q币刷Q币代码.不花钱刷Q币,刷QQQ币漏洞首先,俗话说得好(眼见为实,耳听为虚)没有按照教程操作的后果自负! 本代码只能刷一次,充值的数额因为是根据充值卡来计算的,必须为100面值,.第二次想刷可以找我们的客服去购买代码,黑暗地带工作室(862150685)  ------------------------------------------------------------------------网上到处可以看到有很多

手机访问网站自动跳转到手机版

目前很多网站已经出现了手机版的网站,手机网站是和互联网上的网站同步更新的,大多数人访问我们的网站是直接访问电脑上的域名,不可能为了手机网站重新记住一个域名,大家都知道,中国人都是比较懒的,那么遇到这个情况我们如何面对了,其实办法很简单就是在网站头加入一句判断语句,判断是手机访问网站时就自动跳入手机版,如果是电脑访问就显示正常版本的就可以了. 代码如下: 1 <script src="http://siteapp.baidu.com/static/webappservice/uaredire

C#_自动化测试1_模拟post,get_12306火车票网站自动登录工具

还记得2011年春运,12306火车票预订网站经常崩溃无法登录吗. 今天我们就开发一个12306网站自动登录软件. 帮助您轻松订票 通过前两篇博客Fiddler教程和HTTP协议详解,我们了解了Web的原理. Web的原理就是,浏览器发送一个Request给Web服务器,Web服务器处理完这个请求之后发送一个HTTP Response给浏览器. 如果我们用自己写的程序来发送Request给Web服务器,然后再捕获Web服务器发回来的Response. 检查它与期望值值是否一致. 这不就是Web自