百度貼吧自動回帖的兩種方式,使用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() #這句會報錯,但可以幫助跳到指定層主,非常有用,如果不跳到指定層主的位置,就會定位不到那個層主的‘我也說一句’的按鈕,百度貼吧會在我們離開層主的視界后自動收縮層主的跟帖,所以會造成定位不到。肉眼很難觀察到,用f12反復關閉和打開,再搜索可以看到。 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 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秒回帖






從第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':'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)     #說話太頻繁,這時候不要太快回帖了,回了也沒用,會連續返回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回帖,不要把回帖間隔設置的太小,否則輕則容易出很多驗證碼,中則禁言幾個小時,重則永久性的被全吧范圍封號之后無法使用回帖功能了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM