zoukankan      html  css  js  c++  java
  • 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('请输入要抢楼的番剧编号
    ->')
        message = input('请输入要发送的信息
    ->')
        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,检测番剧主页面,是否更新,然后在更新时提取出番剧编号,自动发弹幕。

    祝抢楼愉快~~~

  • 相关阅读:
    windows live writer backup
    SQL SERVER单独安装
    VS异常--未找到与约束 ContractName Microsoft.VisualStudio.Language.Intellisense.IGlyphService RequiredTypeIdentity
    ASP.NET之报表--RDLC(一)---附源码
    尚未指定报表“Report1”的报表定义
    人月神话
    [LeetCode]Reverse Nodes in k-Group
    [LeetCode]Divide Two Integer
    [LeetCode]Minimum Path Sum
    [LeetCode]Regular Expression Matching
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/5852347.html
Copyright © 2011-2022 走看看