百度贴吧无限自动水贴的两种方式,使用requests(urllib2)和selenium两种方式回帖

本文介绍,回复贴吧指定某楼层主的帖子的方法。在这里不介绍无限发主贴和无限回复主贴的方法,无限发主题帖会爆吧,引起别人的反感,并且很容易遭到吧主的封杀;无限回主题帖,会让整个帖子的每楼的回复充满了自己的内容,影响别人阅读也会遭人反感。只要看了本文就可以无限回帖了,如果非要改成发主题帖或者回主题帖,那肯定只会比这简单,自己理解修改下就可以了。

一般向系统里面添加数据,无非就几种手段,普通人最常用的是用浏览器或者app手动发帖回帖。

第二种是使用类似qtp  selenium之类的自动化测试工具,自动操作浏览器来进行发帖。

第三种是使用jmeter lr python的requests或者urllib之类的,通过抓包分析,然后请求发帖的接口。

第四种是直接向数据库中插入发帖数据,但百度的数据库密码我们肯定是破解不了的,不适合这种方法。

所以本文主要讲述第二种和第三种发帖。

在这里不介绍qtp发帖,者工具太庞大了,并且是收费软件。python安装的人比较多,所以介绍python+selenium回帖。

通过接口方式回帖,以python的requests为例。

话不多说,上代码。

 1 #coding=utf-8
 2 from  selenium import webdriver
 3 from selenium.webdriver.support import expected_conditions as EC
 4 from selenium.webdriver.common.by import By
 5 import re,time
 6 ##########加载profile,可以免登陆
 7 #profile = webdriver.FirefoxProfile(r‘C:\Users\Administrator\AppData\Local\Mozilla\Firefox\Profiles\urkg7uqr.default‘)
 8 #driver = webdriver.Firefox(profile,timeout=300)
 9
10 #driver = webdriver.Firefox(timeout=50)
11 driver=webdriver.Chrome()
12 driver.get(‘https://tieba.baidu.com/p/4778694923‘)
13 str_cookie=‘BIDUPSID=1B0EC2BA376CBF4E68F4952620B2C7A6; PSTM=1491645170; BDUSS=3NNcWtmZHI2MXdqaE55MUhUN35EYTR-cHppV2VCdDYxLXE5T3Z5eTVvNlhRQkJaSVFBQUFBJCQAAAAAAAAAAAEAAAAw2CBnudvS9LTzyqrAsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJez6FiXs-hYa; BAIDUID=17ECF3B92FDCAFB2D548C94DXXXXXXX:FG=1‘     #cookie字符串用f12查看网络中的请求贴吧的,请求头中的cookie
14 list=re.findall(‘([\s\S]*?)=([\s\S]*?); ‘,str_cookie+‘; ‘)
15 for  l in list:
16     ck={‘name‘:l[0],‘value‘:l[1]}
17     print ck
18     driver.add_cookie(ck)           #来个正则把cookie字符串转成slenium的cookie格式字典,添加到driver。cookie字符串是请求贴吧时用f12查看的 network的headers的请求头的cookie,复制就可以了,这样selenium也可以免登陆
19 driver.get(‘https://tieba.baidu.com/p/4778694923‘)
20
21 ###########回主贴,写内容但不回帖
22 driver.find_element_by_id(‘ueditor_replace‘).click()
23 time.sleep(5)                                            #停5秒钟可以发现上面的代码click已经自动拖到页面底部了,没有必要先点击输入框直接赋值也可以,考虑到模拟正常情况,还是点击下,因为百度有些post参数是动态的。
24 js="document.getElementById(‘ueditor_replace‘).innerHTML=‘abc‘"
25 driver.execute_script(js)
26
27
28 all=driver.find_elements_by_css_selector(‘div.l_post‘)     ###获取所有层主的外层div
29 print all
30 for a in all:
31     #print a.text,‘*************************\n‘
32     bt=‘‘
33     try:
34         bt=a.find_element_by_id(‘post_content_106859548218‘)              ####回复指定的层主
35
36     except Exception,e:
37         pass
38     if bt!=‘‘:
39         #a.find_element_by_class_name(‘lzl_link_unfold‘).click()    #首次回复
40         try:
41             bt.click()                            #这句会报错,但可以帮助跳到指定层主,非常有用,如果不跳到指定层主的位置,就会定位不到那个层主的‘我也说一句’的按钮,百度贴吧会在我们离开层主逇师徒后自动收缩层主的跟帖,所以会造成定位不到。
42         except Exception,e:
43             pass
44      time.sleep(3)
45         print a.tag_name
46         print a.text,‘\n*****************************************************************‘
47         for i in range(1000):
48             #driver.find_element_by_xpath(‘//*[@id="j_p_postlist"]/div[22]/div[2]/div[2]/div[2]/div[2]/ul/li[6]/a‘).click()   #这种方式不靠谱,前面插了广告或者删了帖子,可能回复层别的层主了
49            51             a.find_element_by_class_name(‘j_lzl_p‘).click()
52             #a.find_elements_by_partial_link_text(‘我也说一句‘)[0].click()     ##我也说一句按钮
53
54             driver.find_element_by_id(‘j_editor_for_container‘).click()
55             driver.execute_script(‘document.getElementById("j_editor_for_container").innerHTML="hello"‘)
56             driver.find_element_by_css_selector(‘.lzl_panel_submit‘).click()
57
58             time.sleep(60)                 #每隔60秒回帖

下面来上的是requests代码

#coding:utf-8
import requests
import re
import json
import time
ss=requests.session()

str_cookie=‘BAIDUID=9BB79332C64C55ADFF47BB66E2XXXXXXXXX:FG=1; PSTM=1490700622; BIDUPSID=E5593392C48A25ACD2751413DE5A5707; TIEBA_USERTYPE=ab202a741d89ac4664dafb03; bdshare_firstime=1491115637991; BDSFRCVID=A08sJeC62ZvIB7ciINso-O6ye2xAuYRTH6aouvwQVMCH1Qmt0l4GEG0PqM8g0KubLsfKogKK3gOTH4rP; H_BDCLCKID_SF=tJuO_I8afI83fP36q4r2DjvWqxby26nCtnbeaJ5nJDoAflTtjPbEyfCyhgc9tJc-tjbCLxT4QpP-HJ7G5RJG3xudyaQI2R0jannxKl0MLPjYbb0xynoDXbtEyUnMBMPe52OnaIb-LIcjqR8Zj6KajTbP; bottleBubble=1; pgv_pvi=3998808064; pgv_si=s197984256; BDRCVFR[S_ukKV6dOkf]=mk3SLVN4HKm; PSINO=6; H_PS_PSSID=1448_19035_21084; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; TIEBAUID=3b218806eb200790fd2ae7b1; BDUSS=F-LVMwU09YOVBpcEZwZjlYRVlEbVY0MjZNZ0dWU1dTaHdvM0k2UmZYQ3hSaEJaSVFBQUFBJCQAAAAAAAAAAAEAAAAw2CBnudvS9LTzyqrAsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALG56FixuehYNH; STOKEN=5cb27861dad46603e26d289c5a8ec87c75e0acaf2a2ad105c34cf3c029c9f757; wise_device=0; LONGID=1730205744;‘
reg=‘([\s\S]*?)=([\s\S]*?);‘
dict_cookie={}
for c in  re.findall(reg,str_cookie):
   dict_cookie[c[0]]=c[1]
print ‘dict_cookie:‘,dict_cookie           ###cookie字符串转字典,也可以直接把cookie字符串携带在requests的请求头中实现登录

user_agent_list = [‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36‘,
                  ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.10548.400‘
    ]
header={}
import random
dict_data={
‘ie‘:‘utf-8‘,
‘kw‘:‘中华城市‘,
‘fid‘:‘429477‘,
‘tid‘:‘5063074699‘,
‘floor_num‘:‘2‘,
‘quote_id‘:‘106047109156‘,
‘rich_text‘:‘1‘,
‘tbs‘:‘1d2e70d051724ba01491647010‘,
‘content‘:‘啦啦啦‘,
‘lp_type‘:‘0‘,
‘lp_sub_type‘:‘0‘,
‘new_vcode‘:‘1‘,
‘tag‘:‘11‘,
‘repostid‘:‘106047109156‘,
‘anonymous‘:‘0‘,

}   ####抓包得到的
dict_data[‘kw‘]=‘中华城市‘ 了 #重要,不能填错
dict_data[‘fid‘]=‘429477‘        #fid是贴吧什么时候建的,可以抓包也可以用上面的获取fid的接口得到,fid指的是贴吧是第多少个建的贴吧,数字越小,说明贴吧建的越早
dict_data[‘tbs‘]=‘1d2e70d051724ba01491647010‘   ##这个值是有生命周期的,用个天把时间没问题
dict_data[‘tid‘]=‘5065229106‘    ##tid指的是主题帖子的id
dict_data[‘floor_num‘]=‘2‘     ###这个不重要,随便多少都可以
dict_data[‘quote_id‘]=‘106092995926‘      #用f12定位看以看到post_id字段,指的是层主帖子的id
dict_data[‘repostid‘]=dict_data[‘quote_id‘]
dict_data[‘content‘]=‘啦啦啦德玛西亚‘   #content顾名思义是回复的内容了,除了这几个外其他的data参数都可以不修改。

#获取fid的接口 ,吧name换成贴吧名字,复制到浏览器地址栏回车就ok了http://tieba.baidu.com/f/commit/share/fnameShareApi?ie=utf-8&fname=%E6%B5%A0%E6%B0%B4%E4%BA%8C%E4%B8%AD

i=0

while(1):
    i=i+1
    try:
        header[‘User-Agent‘]=random.choice(user_agent_list)   ##习惯性的学爬虫来个随机换user-agent,但贴吧和知乎 这种都是基于账号追踪的,换ua和代理ip是没有任何作用的,逃避不了被识别为机器人
        header[‘Connection‘]=‘close‘
        header.update({ ‘Host‘:‘tieba.baidu.com‘,‘Origin‘:‘http://tieba.baidu.com‘,‘Referer‘:‘http://tieba.baidu.com/p/5065229106‘})

        dict_data[‘content‘]=‘哈哈哈哈‘+str(i)

        res=ss.post(‘http://tieba.baidu.com/f/commit/post/add‘,cookies=dict_cookie,data=dict_data,headers=header)
        res_content=res.content
        res_text=res.text

        print time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime(time.time())),‘  ‘,json.dumps(json.loads(res_content),ensure_ascii=False) ###这样可以清楚的看到json里面的\u xxxx之类的对应的中文。

        if ‘"err_code":0‘ not in res.content:   ##errcode0表示回帖成功了

            i=i-1

        if ‘"err_code":220034‘ in res_content:
            time.sleep(300)     #说话太频繁,这时候不要太快回帖了,回了也没用
        if ‘"need_vcode":0,‘ not in res_content:
            #print res_content
            print u‘需要验证码‘
            time.sleep(180)         ###如果回复太快了会弹出验证码,等一段时间不回帖就好啦。
    except Exception,e:
        #i=i-1
        print e
    time.sleep(10)

好了,上面就是介绍的两种方法了,一个从ui界面上回帖,一个从接口回帖。

用slenium回帖的好处是,不需要抓包理解http接口,和反复的测试总结出某些参数的意义和作用。上面的slenium代码没有加入处理验证码和禁言一段时间的情况。需要加上才能保证程序一直是可运行的,增强容错能力,不至于程序中断退出。

用requests的回帖方式,需要抓包,并且post参数中有个值是动态并且有生命周期的,这个不容易把握,好处是发帖速度非常快,如果不考虑百度限制的话,requests的回帖速度是slenium的几十倍甚至上百倍。

好了,介绍完了,那么大家需要注意的是,不管是selenium还是requets回帖,不要把回帖间隔设置的太小,否则轻则容易出很多验证码,中则禁言几个小时,重则永久性的被全吧范围封号之后无法使用回帖功能了。

时间: 2024-08-01 22:45:03

百度贴吧无限自动水贴的两种方式,使用requests(urllib2)和selenium两种方式回帖的相关文章

上课笔记_使用DWR实现自动补全 类似百度搜索框的自动显示效果

使用DWR实现自动补全 自动补全:是指用户在文本框中输入前几个字母或汉字的时候,自动在存放数据的文件或数据库中将所有以这些字母或汉字开头的数据提示给用户供用户选择 在日常上网过程中,我们经常使用搜索引擎,当我们输入想要检索的关键字时,搜索引擎会提示我们相关的关键字 训练要点: 掌握使用DWR框架开发Ajax程序 使用MyEclipse 10.0 + MySql5.0 新建数据库:可以手动随便新建一个测试用的 DROP TABLE IF EXISTS `books`; CREATE TABLE `

Android 开源组件 ----- Android LoopView无限自动轮转控件

Android 开源组件 ----- Android LoopView无限自动轮转控件 2015-12-28 15:26 by 杰瑞教育, 32 阅读, 0 评论, 收藏, 编辑 一.组件介绍 App产品中信息列表头部都会有自动轮转的广告图片,使用ViewPager可以实现但编码比较麻烦,我们可以采用使用LoopView开源控件来完成, LoopView是一个强大的轮转大图控件,并且提供了许多配置方法足以满足你的应用需求 二.环境配置 如果您的项目使用 Gradle 构建, 只需要在您的buil

七种实现左侧固定,右侧自适应两栏布局的方法

总结一下左边固定,右边自适应的两栏布局的七种方法.其中有老生常谈的float方法,BFC方法,也有CSS3的flex布局与grid布局.并非所有的布局都会在开发中使用,但是其中也会涉及一些知识点.关于最终的效果,可以查看这里 常用的宽度自适应的方法通常是利用了block水平的元素宽度能随父容器调节的流动特性.另外一种思路是利用CSS中的calc()方法来动态设定宽度.还有一种思路是,利用CSS中的新型布局flex layout与grid layout. 首先创建基本的HTML布局和最基本的样式.

JavaScript基础 === 全等于 比较运算符 既比较两个变量的值,也比较两个变量的类型

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=ut

【C语言】编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。

/*编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数. 例如:输入传入(0 , 5)函数返回5,传入(10 , 9)函数返回1,传入(12 , 4)函数返回4 */ #include <stdio.h> int yue(int a,int b) { int temp; int n; if (a>b) { temp=a; a=b; b=temp; } n=a; if(a==0) return b; else while(n!=0) { if( a%n==0 &&

js方式清空表单数据的两种方式

方法1:遍历页面元素 /* 清空FORM表单内容  id:表单ID*/ function ClearForm(id) { var objId = document.getElementById(id); if (objId == undefined) { return; } for (var i = 0; i < objId.elements.length; i++) { if (objId.elements[i].type == "text") { objId.elements

27、输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路:同归并算法 本题: 1 public class Solution { 2 public ListNode Merge(ListNode list1, ListNode list2) { 3 ListNode head; 4 if (list1 == null) { 5 return list2; 6 } 7 if (list2 == null) { 8 return list1; 9 } 10

Android与IOS的优缺点比较 对 Android 与 IOS 比较是个个人的问题。 就好比我来说,我两个都用。我深知这两个平台的优缺点。所以,我决定分享我关于这两个移动平台的观点。另外,然后谈谈我对新的 Ubuntu 移动平台的印象和它的优势。 IOS 的优点 虽然这些天我是个十足的 Android 用户,但我必须承认 IOS 在某些方面做的是不错。首先,苹果公司在他们的设备更新方面有更

Android与IOS的优缺点比较 对 Android 与 IOS 比较是个个人的问题. 就好比我来说,我两个都用.我深知这两个平台的优缺点.所以,我决定分享我关于这两个移动平台的观点.另外,然后谈谈我对新的 Ubuntu 移动平台的印象和它的优势. IOS 的优点 虽然这些天我是个十足的 Android 用户,但我必须承认 IOS 在某些方面做的是不错.首先,苹果公司在他们的设备更新方面有更好的成绩.这对于运行着 iOS 的旧设备来说尤其是这样.反观 Android ,如果不是谷歌亲生的 Ne

两种 eratosthenes 筛法的时间比较,第二种快很多会比较好用

#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int maxn = 10000005; int vis[maxn]; int n; //int eratosthenes() //{ //    memset(vis,0,sizeof(vis)); //    for(int i=2;i<=n;i++) /