B站搶樓是一個很好玩的事情,每當新番出新集時。總有很多人想能夠在前排發表評論,但是因為人數眾多,往往不能如願,今天就教大家一個搶樓的好辦法。
我們平時搶樓的整個流程是這樣的:
1.在官方放出的新番更新時間時等待
2.到時間后一直不停的刷新網頁,等待新集數網頁鏈接出現,出現后點擊進入
3.等待網頁載入完成,然后寫入並發表評論。
但是這么做,基本是不可能搶到一樓的。
在看之前最好先了解下http協議基礎內容,知道post和get就行了:這里有一篇文章很不錯:HTTP 協議詳解
簡單測試就可以得出我們就可以知道b站發表評論的方式是向服務器post數據,使用http fox監視數據后,post的數據是這樣的:
其中的message就是我們要發的內容,oid則是目標番劇的代碼,b站的每個番劇都會有一個類似的編號。
那么我們要做的就是獲得目標劇的編號,然后在第一時間post數據,這樣我們省去了加載網頁的過程直接完成搶樓。
因為發表彈幕需要登錄,所以這里還使用了selenium模擬登錄並獲得網頁cookies,關於cookies,有興趣也可以了解下:cookie協議詳解
具體代碼如下:
from selenium import webdriver import requests from re import findall from bs4 import BeautifulSoup import time def get_cookies(): driver = webdriver.Opera() url = 'https://passport.bilibili.com/login' driver.get(url) driver.find_element_by_xpath('//*[@id="userIdTxt"]').send_keys(input('請輸入用戶名')) driver.find_element_by_xpath('//*[@id="passwdTxt"]').send_keys(input('請輸入密碼')) driver.find_element_by_xpath('//*[@id="vdCodeTxt"]').click() driver.find_element_by_xpath('//*[@id="vdCodeTxt"]').send_keys(input('請輸入驗證碼(不分大小寫)')) driver.find_element_by_css_selector( 'body > div.head_foot_content > div > div.content-bd > div.content-r > form > input.login').click() if driver.current_url != url: print('登錄成功') qianglou(driver.get_cookies()) else: print('登陸失敗,請重試') get_cookies() def qianglou(cookie): cookies = { 'DedeUserID': cookie[1].get('value'), 'DedeUserID__ckMd5': cookie[2].get('value'), 'SESSDATA': cookie[3].get('value'), # 'DedeUserID': 12219609, # 'DedeUserID__ckMd5': 'fff63aa9b5e53ec3', # 'SESSDATA': '92847f1e%2C1476104322%2Cb700756a', } anime_num = input('請輸入要搶樓的番劇編號\n->') message = input('請輸入要發送的信息\n->') url = 'http://bangumi.bilibili.com/anime/v/' + str(anime_num) i = 1 get_av_num(url, message, cookies, i) def get_av_num(url, message, cookies, i): print('try', i) content = BeautifulSoup(requests.get(url).content.decode('utf8', 'ignore'), 'lxml') av_infos = content.find('a', class_='v-av-link') if av_infos is None: i += 1 get_av_num(url, message, cookies, i) av_infos = av_infos.text + '/' av_num = findall('AV(.*?)/', av_infos)[0] av_num = int(av_num) data = { 'message': message, 'type': 1, 'oid': av_num } send_message(cookies, data) def send_message(cookies, data): url = 'http://api.bilibili.com/x/v2/reply/add' content = requests.post(url, data=data, cookies=cookies).content.decode('utf8', 'ignore') result = findall('"message":"(.*?)"', content) if result[0] == 'ok': print('發送完成') else: send_message(cookies, data) if __name__ == '__main__': get_cookies() # qianglou()
我只實現了最基礎的發表彈幕功能,缺點是你必須提供要搶樓的番劇號,有興趣的可以繼續完成,我提供下思路:通過BeautifulSoup,檢測番劇主頁面,是否更新,然后在更新時提取出番劇編號,自動發彈幕。
祝搶樓愉快~~~