Python贴吧灌水脚本

写在前面

作为一个水笔,我的梦想是无休止的灌水,无休止的经验+3,所以写了这么一个东西帮我灌水!需要的参数是cookie中的BDUSS,如何获取,咳咳,百度一下就好了嘛。

包和全局变量

#网页请求
import requests
#对变量进行深拷贝
import copy
#时间、正则
import time,re
#网页解析
from bs4 import BeautifulSoup as bs
#请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
    }
#拷贝一个请求头用于评论,等下会补充一个字段
headers_send = copy.copy(headers)
#获取tbs的接口,tbs用于验证用户身份的有效性
TBS_URL = "http://tieba.baidu.com/dc/common/tbs"
#贴吧的评论接口
ADD_URL = "https://tieba.baidu.com/f/commit/post/add"

获取已有页数

"""
url为当前页的地址,tid是帖子唯一标识符,是url中的一串数字
get_page字段默认为False,此时会输出帖子已有的评论
指定为True时,会补齐headers并中断函数
"""
def get_comment(url,tid,get_page=False):
	#请求帖子的第一页,不需要带cookie
    req = requests.get(url = url,headers = headers)
    #正则匹配,获取帖子总页数,会匹配到两个字段,都是一样的
    pattern = re.compile('<span class="red">(.*?)</span>')
    page_num = int(re.findall(pattern,req.text)[0])
    #如果get_page为True,则为headers添加Referer字段
    #缺少此字段的话,评论发送成功但无法显示
    if get_page:
        headers_send['Referer'] = 'https://tieba.baidu.com/p/{}?pn={}'.format(tid,page_num)
        return
    else:
    	#更改编码格式
        req.encoding = 'utf-8'
        #利用bs4解析网页,抓取评论
        html = bs(req.text,'lxml')
        comments = html.find_all('div',class_ = 'd_post_content j_d_post_content')
        #逐条输出,调用strip方法删除开头的空格
        #注意,无法输出滑稽等泡泡表情(图片什么的更不要想了)
        for comment in comments:
            print(comment.text.strip())
        #返回帖子总页数,用于抓取余下的评论
        return page_num

评论模块

"""
tid为帖子唯一标识符,content为灌水内容
Cookie仅需要BDUSS,tbs用于验证用户身份的合法性
"""
def send_comment(tid,content,Cookie,tbs):
    #构造post请求所需参数
    data = {
        'tid': tid,
        "tbs": tbs,
        'content': content,
        }
    #带上参数发起post请求
    req = requests.post(url = ADD_URL,data = data,cookies = Cookie,headers = headers_send)
    #获取post请求的response信息,并转换为json字典
    post_status = req.json()
    #如果发送成功的话,err_code是0
    if post_status['err_code'] == 0:
        print('{}发布成功'.format(content))
    else:
    	#输出错误信息
        print(post_status)

控制函数

#这里预定义了一个参数,默认为False
#此时不会发起灌水,而只是获取已有楼层信息
def run(send:bool = False):
	#要灌水的帖子地址,后面一串星号就是帖子的tid
    url = "https://tieba.baidu.com/p/**********"
    #用split方法将tid分离出来
    tid = url.split('/')[-1]
    #如果send为False,则输出已有楼层
    if not send:
    	#获取第一页的同时获取总页数
        page_num = get_comment(url = url,tid = tid)
        #总页数超过一页才有继续执行的必要
        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)
                #身为爬虫一定要有基本的节操....
                time.sleep(3)
    #如果send为True
    else: 
    	#调用get_comment函数补充headers_post
        get_comment(url = url,get_page = True,tid = tid)
        #在这里写你的BDUSS,至于如何获取,百度一下嘛!
        Cookie = {'BDUSS':''}
        #经验加3,岂不美哉?
        content = '经验加3!告辞!'
        #获取tbs,获取一次就够了,这里必须带上cookie
        tbs = requests.post(url=TBS_URL, headers=headers_get, cookies=Cookie).json()['tbs']
        """
        开始灌水吧!!!10次不够改成100次
        当然,你肯定不想一直对同一个帖子灌水
        可以写个函数批量获取帖子链接
        本篇博客里面当然没有这种函数
        """
        for i in range(10):
            send_comment(tid = tid,content = content,Cookie = Cookie,tbs = tbs)
            #暂停10秒,否则百度会化身大禹来治你!
        	time.sleep(10)

#入口函数
if __name__ == '__main__':
	#要灌水的话把参数改成True
    run(send = False)

写在后面

最近还写了requests贴吧签到脚本,部署到服务器就能实现云签到,对单个贴吧签到只需要BDUSS和贴吧名,前提是已关注对应的吧,获取所有关注的吧则需要额外的PTOKEN或STOKEN字段(两者选其一,BDUSS和PTOEKN是获取STOKEN的关键,获取关注的吧需要BDUSS和STOKEN),目前不清楚PTOKEN的生成规则,看着像32位小写的md5密文。抽空整理一下再写一篇文章。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值