写在前面
无聊的时候总想搞点事情,自己没有什么思路,打开csdn看到别人的自动评论脚本,我想了想,不如搞一个贴吧自动灌水脚本。
主要代码
用到的包
#发起网页请求
import requests
#这个是配置文件,自己写的,主要保存cookies还有灌水的内容
import comment_conf as settings
#时间、随机、正则表达式
import time,random,re
#解析网页
from bs4 import BeautifulSoup as bs
浏览器标识符(请求头):
#这个用来抓取已有的楼层信息,不需要的话删掉
headers_get = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
}
#发起评论的post请求时要带上这个请求头,这里暂时缺少一个属性,获取帖子总页数后补齐
headers_post = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Host": "tieba.baidu.com",
"Origin": "https://tieba.baidu.com",
"Referer": "",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
}
获取帖子已有楼层总页数,并抓取楼层内容:
#url为帖子的网页地址,tid为帖子的唯一标识符,即url后面那串数字,get_page为一个布尔值,这里默认为False
def get_comment(url,tid,get_page=False):
#请求网页并编辑正则表达式,用于匹配帖子的总页数
req = requests.get(url = url,headers = headers_get)
pattern = re.compile('pn=(.*?)">尾页')
#当前请求的页数为最后一页时,无法匹配到page_num,所以捕捉一下异常
#其实总页数只需要获取一次就够了,这里懒得改了
try:
#查找帖子总页数,有时候会找到两个,任取一个即可
page_num = int(re.findall(pattern,req.text)[0])
except:
page_num = None
pass
#如果get_page指定为True,则完善headers属性,并返回总页数
if get_page:
headers_post['Referer'] = 'https://tieba.baidu.com/p/{}?pn={}'.format(tid,page_num)
return page_num
#否则的话输出第一页的楼层信息,并返回总页数
else:
req.encoding = 'utf-8'
html = bs(req.text,'lxml')
comments = html.find_all('div',class_ = 'd_post_content j_d_post_content')
for comment in comments:
print(comment.text.strip())
return page_num
发起评论:
#tid为帖子标识符,content为将要回复的内容,Cookie为你的登录Cookie
def publish_comment(tid,content,Cookie):
#贴吧回复接口
url = "https://tieba.baidu.com/f/commit/post/add"
#tbs是重要属性,等下会讲如何获取
data = {
'tid': tid,
"tbs": "b***********",
'content': content,
}
#发起回复
req = requests.post(url,data = data,cookies = Cookie,headers = headers_post)
req.encoding = 'utf-8'
#检查是否成功
req = req.json()
if req['err_code'] == 0:
print('{}发布成功'.format(content))
time.sleep(10)
else:
print(req)
主要函数:
#这里也指定一个布尔值,为True则发起回复,否则获取楼层信息
def run(publish:bool = False):
#帖子的网页地址,/p/后面的“*”替换为帖子的tid
url = "https://tieba.baidu.com/p/*********"
#将tid分离出来
tid = url.split('/')[-1]
#publish为False时获取楼层信息
if not publish:
#捕捉第一页时顺便获取总页数
page_num = get_comment(url = url,tid = tid)
#如果总页数大于等于2才有继续执行的必要
if page_num >= 2:
for i in range(2,page_num + 1):
#拼接当前页的url
url = "https://tieba.baidu.com/p/{}?pn={}".format(tid,i)
#获取当前页楼层信息
get_comment(url = url,tid = tid)
#publish为True时则进行灌水
else:
#也获取一下总页数把,虽然这里用不到
page_num = get_comment(url = url,get_page = True,tid = tid)
#根据需求修改循环的次数,这里是回复10次
for i in range(10):
#我回复的内容是从一个列表里面随机选择的,可以根据需要自定义
content = random.choice(settings.data['data'])
publish_comment(tid = tid,content = content,Cookie = settings.Cookie_Baidu)
入口函数:
if __name__ == '__main__':
#如果获取楼层信息,不需要给定参数
#run()
#发起灌水则要将参数指定为True
run(publish = True)
配置文件参考
评论模板参考的别人的,想必是csdn一键三连的模板。
#要在这里补齐你的cookie
Cookie_Baidu = {"Cookie":""}
data = {
"data":[
"写的很不错,感谢大神的分享!","感谢大佬分享,很详细。","学到了,支持!","点赞支持一下,原创不容易,深有体会。",
"博主,可以加你联系方式沟通交流吗?","大佬的文章,行云流水,字字珠玑,已关注收藏。",
"学到了,收藏一波~","很不错分享~进步的路上一起努力!也期待您的点赞支持!",
"博主写的非常清晰,对我很有帮助,谢谢,方便可以互相关注。共同学习~",
"总结的不错。可以可以。很强。继续加油~","这篇文章很不错,值得一看~",
"文章很赞,作者辛苦了!","学到了,非常值得一看。","走心好文,必须收藏!",
"啥都不说了,请收下我的膝盖!","太赞了!666666","大佬,我准备跟你混了!",
"佩服,佩服,一篇绝世好文!","厉害了!大佬就是大佬!","给大佬递茶~","看完这个后刷新了我对技术的认知!",
"技术懂得人很多,但懂得分享的人少之又少,支持大佬!","大佬,我要拜你为师!","很棒呀,学习啦,谢谢分享!",
"太优秀了!老铁~","真棒!茅塞顿开的感觉。","爱了爱了,干货满满,已收藏。","看来我还有好长的技术路要走啊!",
"大佬可否认识一下~","点赞支持一下,原创不容易,深有体会。","太实用了,准备一会试试。",
"大佬出品,必属精品~","一般不评论的,看到这感到非常的认同。","由浅入深,适合有基础的技术人员。",
"在CSDN学到了很多知识,真心希望CSDN越来越来好!","比较简单,适合小白。","分析的很到位,学到了很多,大赞!",
"写的这么好,建议付费!","写的不错,一起加油!","支持博主,支持CSDN!","大佬的文章一直是我坚持写作的动力。",
"帮助很大,拒绝白嫖,点赞打赏走一波~","最近也在学这个,博文真的写的挺好,感觉很有用~","原创不易,继续加油,已收藏。",
"大佬写的太棒了!支持多更!","深有感触,请问可以转载么?","这位仁兄高见,着实让人敬佩!","太精辟了!竖起我的大拇指!",
"都是博主辛苦创作,我来支持一下,奥利给!","为了我的爱马仕,冲冲冲!","活到老学到老,支持原创!",
"刚入行,特别需要这样的文章滋养,强烈推荐!","大佬的思考维度让人醍醐灌顶,牛皮PLUS!",
"进我的收藏夹吧~","老铁,你是吃代码长大的吗?","如此详细,付费也会支持!","学起来,头秃的那种~",
"好文,鉴定完毕!","博主真是开发界的杠把子啊!","文章非常有用,让我受益匪浅!","看君一席文,胜读十年书!",
"反手就是一个赞!","先占个坑,慢慢看。","代码之路任重道远,愿跟博主努力习之。",
"大佬辛苦了,难道您就是那天赋异禀之人?您必是时代的弄潮儿~","在最美的年华,做最好的自己,加油!",
"看了你的文章,内心的仰慕之情油然而生,赶紧给大佬点个赞!","很不错的文章,学到东西了!","感谢博主分享,学到不少东西!",
"好文!希望博主以后多多分享哈!","君之妙笔,令鄙不及,佩服佩服!","大佬的文章如行云流水,一气呵成,读后如醍醐灌顶,令我茅塞顿开~",
"学习的道路上一起进步,也期待你的关注与支持!","简单易懂,化繁为简!大师已登峰造极!","大佬的文章令我如痴如醉,请受小弟一拜~",
"放弃不难,但坚持一定很酷!","文采四溢,大佬这是被耽搁的文学家啊!","看三遍也看不够的好文,mark~","最近一直在找相关的资料,这文章出现得真及时!",
"写的很详细,学习到很多,感谢大佬!","文绉绉的程序大佬最帅了!","博主不光能写的一手好代码,还能写的一手好文章。",
"大佬一出手,精品果然有~","写的不错,果断收藏!","感谢博主分享,讲的挺不错,希望后面有更多的文章。","大佬666,看了之后受益很大。","哇,好棒啊,崇拜的小眼神~",
"大佬写的太好了!","大佬写的很好,手动点赞!","大佬,看了你的文章,内心的仰慕之情油然而生,赶紧给大佬点个赞!",
"大佬的文章让我受益匪浅,如痴如醉,以后的日子还希望能够得到大佬的谆谆指点!","学到了,点赞支持,一起加油!","大佬的文章让我受益颇多,手动给大佬点赞!",
"写的不错,just code it !","优秀优秀,必须给个大大的赞!","爱了爱了,得之我幸。",
"看完大佬的文章,我的心情竟是久久不能平静。正如老子所云:大音希声,大象无形。我现在终于明白我缺乏的是什么了。",
"感谢博主分享,讲的挺不错,希望后面有更多的文章,可以互关哦~","大佬牛逼!","哇,好棒啊,崇拜的小眼神 ,欢迎回赞,回评哦~~~",
"学到了,点赞支持,一起加油 (ง •̀o•́)ง (ง •̀o•́)ง","自己每次写文章都要好多个小时,有时一整天,看到这样的文章忍不住点个赞","感谢分享,对我这个菜鸡来说很友好。",
"支持博主,文章干净利落。不像其他很多人写篇文章里面都是一些公众号二维码啥的。","特别喜欢博主的写作风格,支持一波。","下班回家看到博主文章更新,学到了。","慕名而来,大佬你真的惊艳到我了!",
"抛开吸引人的标题,博主开发的精神值得学习。","大佬666,获益匪浅,灵感如泉涌般一发不可收拾!","原创不易,继续加油,已收藏。",
"写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!","内容写的很好,期待多更!","放弃不难,但坚持一定很酷!",
"不错 本来准备自己总结一下,比我的全面。","写的不错,顶个贴,点个赞,嘿嘿!","博主解释的很全面,学到了。","大佬,看了之后受益很大。",
"大佬,看了你的文章,内心的仰慕之情油然而生,赶紧给大佬点个赞!","写的挺不错的,继续加油哦!","自己每次写文章都要好多个小时,有时一整天,看到这样的文章忍不住点个赞。",
"这么好的文章,如果将来我再也看不到了,那我该怎么办?直到我毫不犹豫地把大佬的这篇文章收藏了,我内心的那种激动才逐渐平静下来。","感觉文章思路挺清晰的~","学到了,点赞支持,一起加油~",
"哇,好棒啊,崇拜的小眼神!","感谢分享,开源是我们开发人员共同的目标,互惠互利。","nice,赞一个!","博主解释的很全面,学到了。","这篇文章有东西的。",
"写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!","这篇文章很励志,也有点适合我。","首次看博,第一个留言就给博主了,很不错","我会认真研读的,谢谢大佬,辛苦辛苦!",
"很不错分享~进步的路上一起努力!也期待您的关注和点赞。","膜拜大佬的技术,来我博客指点江山吧!","写的不错 共勉~,最近也在开始写博客。大佬们来翻牌啊!",
"博主写的很详细,作为小白的我,都能看得懂,谢谢分享!","写的好好哦,我也在写博客,看了你的文章发现自己还有很多需要学习的地方,大佬写的很nice!",
"博主写的非常好,有理论有例子,非常容易看懂,感谢博主!","写得太齐全了,对于初学计算机网络的人说很有用,值得赞一下。","还是蛮不错的,引导初学者了解基本的。",
"同样是程序员,为何你能如此秀!","大佬的文章让我受益颇多!","写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!",
"博主写的非常清晰,对我很有帮助,谢谢,方便可以加个关注。共同学习!","学到了,学到了,给大佬点赞!","已关注,质量很高的博文!"]
}
获取cookie和tbs
首先打开贴吧,登录,然后随便找一个帖子,F12打开开发者工具->NetWork->All,此时应该什么都没有,接下来发起一次回复,会出来一个add项目,点击可以看到Request-URL,就是贴吧提供的评论接口,往下翻,可以看到Request Headers和Form Data,Cookie和tbs就藏在这里。
写在后面
可能这样手动获取cookie和tbs还是比较low,如果我能实现提供账号密码就自动灌水的话再来修改。