码迷,mamicode.com
首页 > 其他好文 > 详细

BliBli抢楼全攻略

时间:2016-09-08 13:02:19      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

B站抢楼是一个很好玩的事情,每当新番出新集时。总有很多人想能够在前排发表评论,但是因为人数众多,往往不能如愿,今天就教大家一个抢楼的好办法。

我们平时抢楼的整个流程是这样的:

1.在官方放出的新番更新时间时等待

2.到时间后一直不停的刷新网页,等待新集数网页链接出现,出现后点击进入

3.等待网页载入完成,然后写入并发表评论。

但是这么做,基本是不可能抢到一楼的。

在看之前最好先了解下http协议基础内容,知道post和get就行了:这里有一篇文章很不错:HTTP 协议详解

技术分享

了解之后,测试就可以得出我们就可以知道b站发表评论的方式是向服务器post数据,使用http fox监视数据后,post的数据是这样的:技术分享

其中的message就是我们要发的内容,oid则是目标番剧的代码,b站的每个番剧都会有一个类似的编号。

那么我们要做的就是获得目标剧的编号,然后在第一时间post数据,这样我们省去了加载网页的过程直接完成抢楼。

虽然B站有很多动漫,但是每天更新的数量还是很有限的,而且日漫都是在半夜发布,而且番剧号都是有顺序的递加,所以只需要在番剧更新前几分钟测试下,就能得到将要更新的番剧号

因为发表弹幕需要登录,所以这里还使用了selenium模拟登录并获得网页cookies,关于cookies,有兴趣也可以了解下:cookie协议详解

具体代码如下:

from selenium import webdriver
import requests
from re import findall


def get_cookies():
    driver = webdriver.Firefox()
    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),
    }
    anime_num = input(请输入要抢楼的番剧编号\n->)
    message = input(请输入要发送的信息\n->)
    data = {
        message: message,
        type: 1,
        oid: anime_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()

我只实现了最基础的发表弹幕功能,缺点是你必须提供要抢楼的番剧号,有兴趣的可以继续完成,我提供下思路:通过BeautifulSoup,检测番剧主页面,是否更新,然后在更新时提取出番剧编号,自动发弹幕。

祝抢楼愉快~~~

BliBli抢楼全攻略

标签:

原文地址:http://www.cnblogs.com/INnoVationv2/p/5852347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!