使用Python+Selenium实现B站自动评论、点赞、发弹幕(二)

284 阅读2分钟

前提

此次是对之前版本的更新,时隔数日在摸鱼期间完善了这一次的更新,首先理了一下之前版本的存留问题,然后也想了几个后续可以优化和可处理的问题

  1. 优化点赞功能:准备用显示等待获取点赞图标,对已点赞的视频进行处理
  2. 多个账号刷评:提前准备好大量账号的Cookie,刷评操作完成后切换用户
  3. 其余内容:投币功能实现,关注功能实现,转发功能实现,收藏功能实现

实现思路

  1. 点赞功能使用获取集合的方式判断点赞图标是否存在
  2. 对于多个用户登录,我把整体的代码进行一个封装,后续获取多个用户的cookie集合后直接用循环遍历即可完成
  3. 投币、关注功能存在多个的状态,实现思路与点赞类似
  4. 由于基于Selenium,b站当前Web端的转发只适用于个人空间的转发
# @Time : 2023/4/1 14:41
# @auth : 都是好事
# @Email : 
# @Content : bli_plus.py
import time
from selenium.webdriver.common.by import By
# 显式等待模块
from selenium.webdriver.support.ui import WebDriverWait
# 显式等待条件
from selenium.webdriver.support import expected_conditions as EC
from anyUser import My_webApi

# 调用封装的通用类
anp = My_webApi.Any_Api()

wb = anp.getWeb(htp="https://www.bilibili.com/")


# ---------------------------------------------------------------------------------------------

class bili:
    def __init__(self, web, cookies):
        self.wb = web
        self.cookiePath = cookies
        self.wbw = WebDriverWait(self.wb, 10, 0.5)

    def login(self):
        # 使用获取的cookie登录
        anp.set_cookies(self.wb, self.cookiePath)
        # 等待登录主页刷新
        time.sleep(3)
        self.wb.refresh()

    def user(self, uid):
        # 查询用户
        sea = self.wb.find_element(By.XPATH, '//input[@class="nav-search-input"]')
        sea.click()
        sea.send_keys(uid)
        sea_but = self.wb.find_element(By.XPATH, '//div[@class="nav-search-btn"]')
        sea_but.click()
        # 进入用户页面
        anp.now_win(self.wb)
        time.sleep(3)
        user = self.wb.find_elements(By.XPATH,
                                     '//img[@data-src="https://i1.hdslb.com/bfs/face/96d230df1219334fcbc4531b524a674d8151b2f8.jpg@240w_240h_1c_1s.webp"]')
        user[0].click()

    def void(self):
        # 进入投稿页面
        anp.now_win(self.wb)
        v_list = self.wb.find_element(By.XPATH, '//div[@class="n-tab-links"]/a[@href="/34980281/video"]')
        v_list.click()

        # 获取用户主页面
        window = self.wb.current_window_handle
        # 遍历视频,发送评论
        # 设置显式等待
        viods = self.wb.find_elements(By.XPATH, '//li[@class="small-item fakeDanmu-item"]/a[@class="cover"]')
        for i in viods:
            i.click()
            anp.now_win(self.wb)
            # 评论
            txta = self.wbw.until(
                EC.presence_of_element_located((By.XPATH, '//textarea[@class="reply-box-textarea"]')))
            txta.send_keys('up主你做的真好')

            fb_but = self.wb.find_element(By.XPATH, '//div[@class="send-text"]')
            fb_but.click()

            # 弹幕
            danmu = self.wbw.until(
                EC.presence_of_element_located((By.XPATH, '//input[@placeholder="发个友善的弹幕见证当下"]')))
            danmu.send_keys('每日一遍')
            next_btn = self.wb.find_element(By.XPATH, '//div[@class="bui-area bui-button-blue"]')
            self.wb.execute_script("arguments[0].click();", next_btn)

            # 投币
            coin = self.wb.find_elements(By.XPATH, '//span[@class="coin"]')
            if len(coin) != 0:
                coin[0].click()
                self.wb.find_element(By.XPATH, '//div[@class="coin-bottom"]//span[@class="bi-btn"]').click()

            # 点赞
            like = self.wb.find_elements(By.XPATH, '//span[@class="like"]')
            if len(like) != 0:
                like[0].click()

            # 回到用户主页面
            self.wb.switch_to.window(window)



bl_p = bili(web=wb, cookies='cookie的地址')
bl_p.login()
bl_p.user('UP主的UID')
bl_p.void()

后续更新: 1.实现优化对大量用户cookie集的获取和遍历 2.一次运行对多个UP主的视频进行操作,优化执行效率