BliBli搶樓全攻略


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,檢測番劇主頁面,是否更新,然后在更新時提取出番劇編號,自動發彈幕。

祝搶樓愉快~~~


免責聲明!

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



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