百度贴吧自动回帖的两种方式,使用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
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import re,time
##########加载profile,可以免登陆
#profile = webdriver.FirefoxProfile(r'C:\Users\Administrator\AppData\Local\Mozilla\Firefox\Profiles\urkg7uqr.default')
#driver = webdriver.Firefox(profile,timeout=300) #driver = webdriver.Firefox(timeout=50)
driver=webdriver.Chrome()
driver.get('https://tieba.baidu.com/p/4778694923')
str_cookie='BIDUPSID=1B0EC2BA376CBF4E68F4952620B2C7A6; PSTM=1491645170; BDUSS=3NNcWtmZHI2MXdqaE55MUhUN35EYTR-cHppV2VCdDYxLXE5T3Z5eTVvNlhRQkJaSVFBQUFBJCQAAAAAAAAAAAEAAAAw2CBnudvS9LTzyqrAsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJez6FiXs-hYa; BAIDUID=17ECF3B92FDCAFB2D548C94DXXXXXXX:FG=1' #cookie字符串用f12查看网络中的请求贴吧的,请求头中的cookie
list=re.findall('([\s\S]*?)=([\s\S]*?); ',str_cookie+'; ')
for l in list:
ck={'name':l[0],'value':l[1]}
print ck
driver.add_cookie(ck) #来个正则把cookie字符串转成slenium的cookie格式字典,添加到driver。cookie字符串是请求贴吧时用f12查看的 network的headers的请求头的cookie,复制就可以了,这样selenium也可以免登陆
driver.get('https://tieba.baidu.com/p/4778694923') ###########回主贴,写内容但不回帖
driver.find_element_by_id('ueditor_replace').click()
time.sleep(5) #停5秒钟可以发现上面的代码click已经自动拖到页面底部了,没有必要先点击输入框直接赋值也可以,考虑到模拟正常情况,还是点击下,因为百度有些post参数是动态的。
js="document.getElementById('ueditor_replace').innerHTML='abc'"
driver.execute_script(js) all=driver.find_elements_by_css_selector('div.l_post') ###获取所有层主的外层div
print all
for a in all:
#print a.text,'*************************\n'
bt=''
try:
bt=a.find_element_by_id('post_content_106859548218') ####回复指定的层主 except Exception,e:
pass
if bt!='':
#a.find_element_by_class_name('lzl_link_unfold').click() #首次回复
try:
bt.click() #这句会报错,但可以帮助跳到指定层主,非常有用,如果不跳到指定层主的位置,就会定位不到那个层主的‘我也说一句’的按钮,百度贴吧会在我们离开层主的视界后自动收缩层主的跟帖,所以会造成定位不到。肉眼很难观察到,用f12反复关闭和打开,再搜索可以看到。
except Exception,e:
pass
time.sleep(3)
print a.tag_name
print a.text,'\n*****************************************************************'
for i in range(1000):
#driver.find_element_by_xpath('//*[@id="j_p_postlist"]/div[22]/div[2]/div[2]/div[2]/div[2]/ul/li[6]/a').click() #这种方式不靠谱,前面插了广告或者删了帖子,可能回复层别的层主了
a.find_element_by_class_name('j_lzl_p').click()
#a.find_elements_by_partial_link_text('我也说一句')[0].click() ##我也说一句按钮 driver.find_element_by_id('j_editor_for_container').click()
driver.execute_script('document.getElementById("j_editor_for_container").innerHTML="hello"')
driver.find_element_by_css_selector('.lzl_panel_submit').click() time.sleep(60) #每隔60秒回帖 从第28行道49行繁琐了一些,功能主要是跳转到指定的层主的页面位置,换种方法也可以这样
floor=dr.find_element_by_xpath('//span[contains(text(),"21楼")]') dr.execute_script("arguments[0].scrollIntoView();", floor) time.sleep(2) #再去定位元素 tar = dr.find_element_by_xpath('//div[contains(@data-field,"157780442")]//a[contains(text(),"我也说一句")]') tar.click()
下面来上的是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':'',
'tid':'',
'floor_num':'',
'quote_id':'',
'rich_text':'',
'tbs':'1d2e70d051724ba01491647010',
'content':'啦啦啦',
'lp_type':'',
'lp_sub_type':'',
'new_vcode':'',
'tag':'',
'repostid':'',
'anonymous':'', } ####抓包得到的
dict_data['kw']='中华城市' 了 #重要,不能填错
dict_data['fid']='' #fid是贴吧什么时候建的,可以抓包也可以用上面的获取fid的接口得到,fid指的是贴吧是第多少个建的贴吧,数字越小,说明贴吧建的越早
dict_data['tbs']='1d2e70d051724ba01491647010' ##这个值是有生命周期的,用个天把时间没问题
dict_data['tid']='' ##tid指的是主题帖子的id
dict_data['floor_num']='' ###这个不重要,随便多少都可以
dict_data['quote_id']='' #用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) #说话太频繁,这时候不要太快回帖了,回了也没用,会连续返回errcode220034
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) ##每隔10秒回帖
上面就是介绍的两种方法了,一个从ui界面上回帖,一个从接口回帖。
用slenium回帖的好处是,不需要抓包理解http接口,和反复的测试总结出某些参数的意义和作用。上面的slenium代码没有加入处理验证码和禁言一段时间的情况。需要加上才能保证程序一直是可运行的,增强容错能力,不至于程序中断退出。
用requests的回帖方式,需要抓包,并且post参数中有个值是动态并且有生命周期的,这个不容易把握,好处是发帖速度非常快,如果不考虑百度限制的话,requests的回帖速度是slenium的几十倍甚至上百倍。
好了,介绍完了,那么大家需要注意的是,不管是selenium还是requets回帖,不要把回帖间隔设置的太小,否则轻则容易出很多验证码,中则禁言几个小时,重则永久性的被全吧范围封号之后无法使用回帖功能了。
百度贴吧自动回帖的两种方式,使用requests(urllib2)和selenium两种方式回帖的更多相关文章
- 百度移动搜索自动转码太坑爹,JS跳转地址会被抓取
这段时间碰到个很崩溃的问题,一个页面通过 script 加载请求服务端进行统计再输出js进行跳转,分为两个步骤分别统计, 打开页面通过script 请求远程服务器进行统计并输出要通过js使页面跳转的最 ...
- SEO -- WordPress怎设置百度站长链接自动提交
百度站长平站更新了主动推送(实时)推送的方式,受到了广大站长的好评,但是对于使用WordPress的网站来说怎么设置自动提交呢,在这里介绍一种比较简单且有效的方法.我们可以使用 WP BaiDu Su ...
- 使用工厂方法模式设计能够实现包含加法(+)、减法(-)、乘法(*)、除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果。要求使用相关的工具绘制UML类图并严格按照类图的设计编写程序实
2.使用工厂方法模式设计能够实现包含加法(+).减法(-).乘法(*).除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果.要求使用相关的工具绘制UML类图并严格按照类图的设计编写程 ...
- 1、使用简单工厂模式设计能够实现包含加法(+)、减法(-)、乘法(*)、除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果。要求使用相关的工具绘制UML类图并严格按照类图的设计编写程
1.使用简单工厂模式设计能够实现包含加法(+).减法(-).乘法(*).除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果.要求使用相关的工具绘制UML类图并严格按照类图的设计编写程 ...
- thinkphp 的两种建构模式 第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用。第二种架构模式两个单入口文件,分别生成两个应用定义define。。。函数可以定义配置文件。。。。
thinkphp 的两种建构模式 第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用. ...
- 解决网页在手机浏览器打开不停刷新的方案(百度的ua自动转向js问题)
一:发现问题 原有可能是网站内挂了一个百度的ua自动转向js,手机访问的话会被自动转到feiyujd.com,然后又被转到www点feiyujd点com,这样反复死循环.就形成了一直在刷新,网站一闪一 ...
- python将两个数组合并成一个数组的两种方法的代码
内容过程中,把写内容过程中常用的内容收藏起来,下面的资料是关于python将两个数组合并成一个数组的两种方法的内容,希望能对小伙伴们有帮助. c1 = ["Red","G ...
- http发送请求方式;分为post和get两种方式
http发送请求方式:分为post和get两种方式
- 百度地图之自动提示--autoComplete
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- javascript 实现类似百度联想输入,自动补全功能
js 实现类似百度联想输入,自动补全功能 方案一: search是搜索框id="search" //点击页面隐藏自动补全提示框 document.onclick = functi ...
随机推荐
- 谈谈 Android 的优点和不足之处?
优点:1.开放性,开源,免费,可定制2.挣脱运营商束缚3.丰富的硬件选择4.不受任何限制的开发商5.无缝结合的 Google 应用缺点:1.安全问题.隐私问题2.同质化严重3.运营商对 Android ...
- linux使用du查看文件夹大小
du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du –sh -s不显示该目录下面的文件大小,只显示该目录的大小 -h以人类可读的方式显示. 比如显示work下面的Apache-tom ...
- 网易云课堂_C++程序设计入门(下)_第11单元:工欲善其事必先利其器 - STL简介_第11单元 - 单元作业2:OJ编程 - list 与 deque
第11单元 - 单元作业2:OJ编程 - list 与 deque 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之 ...
- ubuntu登录SYSU-SECURE
1. 选中SYSU-SECURE网络连接. 2. 点击进入Wi-Fi 安全性选项卡. 3. 修改[认证(T)]项的值为[受保护的EAP(PEAP)]. 4. 连接成功.
- 作为程序员,你关注哪些国外 IT 网站?
1.在线编程练习: LintCode——在线刷题网站,阶梯式训练,可帮助你更快速深入地了解各类面试题型,提供专业导师写的最优代码作为参考(Lintcode 标准答案查询——lintcode 的参考答案 ...
- 按需加载controller——angular
一.多视图应用 AngularJS 通过路由支持多视图应用, 可以根据路由动态加载所需的视图.随着视图的不断增加, js文件会越来越多, 而 AngularJS 默认需要把全部的 js 都一次性加载, ...
- 描述下什么是springcloud,springcloud中的组件有哪些?分别描述下它的原理?
1.什么是springcloud,springcloud中的组件有哪些? Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的微服务:就是把 ...
- json,异步加载,时间线
JSON是一种传输数据的格式 JSON.stringify(obj); obj--string JSON.parse(str); string-->obj
- 笔记纪要:C# WebService URL重写
背景# 有时候我们会有这样的需求,将 WebService URL 中的 asmx 后缀去掉:或者我们要模拟普通 Web 的 URL,接口名称直接拼接在 URL 中.这些情况我们都要用到URL重写. ...
- 交换机安全学习笔记 第六章 IPV4 ARP攻击
ARP欺骗攻击 常用工具: dsniff(Linux/windows).ettercap(Linux/windows).cain(仅windows). ARP欺骗攻击的目的是嗅探发往某主机的所有IP ...