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

发表于:2023-4-21 09:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:都是好事    来源:稀土掘金

  前提
  1. 此功能是根据查找用户的UID,来对UP主的视频进行操作。
  2. 目前只可以给UP主首页的视频进行操作。
  3. 第一次登录需要手动获取Cookie。
  4. 点赞功能未优化需要,若存在已经点过赞的视频会报错。
  通用的类
  # @Time : 2023/3/27 20:33
  # @auth : 都是好事
  # @Email : 
  # @Content : My_webApi.py
  from selenium import webdriver
  from selenium.webdriver.chrome.options import Options
  import chardet
  class Any_Api:
      # 去掉自动化标识,创建webdriver对象
      def getWeb(self, htp):
          option = Options()
          option.add_experimental_option('excludeSwitches', ['enable-automation'])
          option.add_argument('--disable-blink-features=AutomationControlled')
          wb = webdriver.Chrome(options=option)
          wb.implicitly_wait(3)
          wb.get(htp)
          wb.maximize_window()
          return wb
      # 写入文件
      def check_charset(self, file_path):
          with open(file_path, "rb") as f:
              data = f.read(4)
              charset = chardet.detect(data)['encoding']
          return charset
      # 手动登录获取cookie
      def get_cookies(self, wb, filepath):
          cok = wb.get_cookies()
          with open(filepath, 'w', encoding=self.check_charset(filepath)) as f:
              for i in cok:
                  f.write(str(i))
                  f.write('\n')
      # 使用之前获取的cookie登录
      def set_cookies(self, wb, filepath):
          cookies = []
          with open(filepath, 'r', encoding=self.check_charset(filepath)) as f:
              for i in f:
                  cookies.append(eval(i.strip()))
          for i in cookies:
              wb.add_cookie(i)
      def now_win(self, wb):
          # 获取打开的多个窗口句柄
          windows = wb.window_handles
          # 切换到当前最新打开的窗口
          wb.switch_to.window(windows[-1])
  具体实现
  # @Time : 2023/3/27 20:28
  # @auth : 都是好事
  # @Email : 
  # @Content : bilibili.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/")
  # input()
  cookiePath = '这里填存放cookie文件的路径'
  # 手动登录获取cookie
  # anp.get_cookies(wb, cookiePath)
  # 使用获取的cookie登录
  anp.set_cookies(wb, cookiePath)
  # 等待登录主页刷新
  time.sleep(3)
  wb.refresh()
  # 输入UID进入个人主页
  sea_inp = wb.find_element(By.XPATH, '//input[@class="nav-search-input"]')
  sea_inp.click()
  sea_inp.send_keys('UIDxxxxxxxx')
  sea_but = wb.find_element(By.XPATH, '//div[@class="nav-search-btn"]')
  sea_but.click()
  anp.now_win(wb)
  time.sleep(3)
  user = wb.find_elements(By.XPATH, '//img[@data-src="https://i1.hdslb.com/bfs/face/96d230df1219334fcbc4531b524a674d8151b2f8.jpg@240w_240h_1c_1s.webp"]')
  user[0].click()
  anp.now_win(wb)
  window = wb.current_window_handle
  # 遍历视频,发送评论
  # 设置显式等待
  wdw = WebDriverWait(wb, 10, 0.5)
  viods = wb.find_elements(By.XPATH, '//a[@class="title"]')
  for i in viods:
      i.click()
      anp.now_win(wb)
      # 评论
      txta = wdw.until(
          EC.presence_of_element_located((By.XPATH, '//textarea[@class="reply-box-textarea"]')))
      txta.send_keys('up主你做的真好')
      fb_but = wb.find_element(By.XPATH, '//div[@class="send-text"]')
      fb_but.click()
      # 弹幕
      danmu = wdw.until(
          EC.presence_of_element_located((By.XPATH, '//input[@placeholder="发个友善的弹幕见证当下"]')))
      danmu.send_keys('每日一遍')
      next_btn = wb.find_element(By.XPATH, '//div[@class="bui-area bui-button-blue"]')
      wb.execute_script("arguments[0].click();", next_btn)
      # 点赞
      like = wb.find_element(By.XPATH, '//span[@class="like"]')
      like.click()
      wb.switch_to.window(window)
  input()
  此次总结
  之前看到有些视频下出现大量重复评论和重复弹幕,就想这个刷评论的操作应该不难用实现,于是就尝试了一下。目前基础可以实现,后续更新也是随缘,就当是一次小小的练习了。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号