jjzjj

基于selenium和autoit 实现B站视频自动上传功能

冰履踏青云 2024-01-18 原文

文章目录

1. 下载chromedriver

1.1 先查看自己的谷歌浏览器版本

可以直接输入命令chrome://version/查看,也可以在浏览器设置里查看

1.2 下载谷歌驱动

根据自己谷歌浏览器的版本下载相应的浏览器驱动,如果没有的可以尝试选择最接近的版本。

chromedriver下载地址: http://chromedriver.storage.googleapis.com/index.html

可以把chromedriver.exe放到与你的python解释器同一路径,这样在代码里调用就不用写chromedriver路径了,

(看个人喜好,也可以不放不过需要在代码里写上chromedriver路径)

2. selenium的使用

selenium的简单使用方法可以参考我这篇博客学习:selenium的使用

若只需要运行本项目的,直接跳过往下看

python环境安装 控制台直接pip install selenium就行

这里为避免每次都需要登录的问题我这里采用直接绑定已经存在的浏览器方案,这样只需要在第一次登录一下就行,该浏览器自动保持登录状态方便我们之后的操作。

selenium操作已经打开的浏览器参考 :

selenium操作已经打开的浏览器

参考上面的博客在谷歌浏览器路径下cmd进入控制台直接输入:

chrome.exe --remote-debugging-port=9527 --user-data-dir=“D:\AutomationProfile”

即会自动打开谷歌浏览器,打开之后默认的是谷歌引擎,在设置里修改为baidu即可上网

然后需要访问: https://www.bilibili.com/

先手动登录(手机app直接扫码就行),登录之后这个浏览器会自动保存登录信息,以后再打开就不用再登录了。

selenium 定位上传按钮并点击,参考代码

from time import sleep
from selenium.webdriver.common.by import By
# https://blog.csdn.net/weixin_44791551/article/details/124719506
import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from lxml import etree

# # chrome.exe --remote-debugging-port=9527 --user-data-dir=“D:\AutomationProfile”
options = Options()
# 调用已开启的浏览器
options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
bro = webdriver.Chrome(options=options)

# url = 'https://www.bilibili.com/'
# 第一次要先在浏览器登录之后才可以调用这个上传视频的接口
url = 'https://member.bilibili.com/platform/upload/video/frame?spm_id_from=333.1007.top_bar.upload'
bro.get(url)
time.sleep(5)
# 这里点击上传元素那里是个iframe,不能直接定位上传元素,要switch_to一下
iframe = bro.find_element_by_xpath('/html/body/div/div[3]/div[4]/div[2]/div/div/div/div/iframe')
bro.switch_to.frame(iframe)
# 定位上传元素按钮并点击
bro.find_element_by_class_name("upload-btn").click()


至此点击之后会弹出文件夹让选择文件,这里已经跳出三界之外了,不在selenium的管辖范围,我们采用autoit编写个自动化脚本程序帮我们实现自动选择文件并打开上传,下面开始自动化脚本程序制作。

3. autoit 制作视频上传脚本并打包成exe文件

针对b站上传视频出现弹窗,我们编写脚本只需要几行代码:

ControlFocus("打开","","Edit1")
WinWait("[CLASS:#32770]","",10)
ControlSetText("打开", "", "Edit1", $CmdLine[1])
Sleep(2000)
ControlClick("打开", "","Button1");

autoit官网下载地址:https://www.autoitscript.com/site/autoit/downloads/

直接点击下载,傻瓜式安装就ok

安装完成之后,点击电脑左下角的开始按钮即可看到:

第一步我们需要点击那个红框程序,开始编写脚本与调试


这里可能会遇到编写代码中文乱码问题,可以参考这篇博客: https://www.bbsmax.com/A/qVdeLD1Q5P/

看一下脚本,里面的参数并不是胡乱写的,我们是先用Autolt Window Info(x64)定位的,比如定位打开按键,就打开这个程序,拖动那个Finder Tool图标到选择框

然后定位打开按钮

这样参数都定位完了。

第三行的$CmdLine[1]可以写成一个完整的文件路径,这里为了灵活性改了,到时候把这个脚本转成exe格式后就可以用python灵活调用了,像这样

import os
path = 'C:\\Users\\admin\\vodeo\\1.mp4'
os.system('C:\\Users\\admin\\Desktop\\1.exe %s' % path)

直接就可以用python调用os自动上传了。

打包成exe文件也比较简单,直接点击Compile Script to .exe(x64)程序,选择脚本直接转化即可

至此简单的autoit脚本程序制作完成。

4. 最终实现

参考代码:

# -*- coding: UTF-8 -*-
import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from lxml import etree

# https://blog.csdn.net/weixin_44791551/article/details/124719506
# # chrome.exe --remote-debugging-port=9527 --user-data-dir=“D:\AutomationProfile”
options = Options()
# 调用已开启的浏览器
options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
bro = webdriver.Chrome(options=options)

# url = 'https://www.bilibili.com/'
# 第一次要先在浏览器登录之后才可以调用这个上传视频的接口
url = 'https://member.bilibili.com/platform/upload/video/frame?spm_id_from=333.1007.top_bar.upload'
bro.get(url)
time.sleep(5)
# 这里点击上传元素那里是个iframe,不能直接定位上传元素,要switch_to一下
iframe = bro.find_element_by_xpath('/html/body/div/div[3]/div[4]/div[2]/div/div/div/div/iframe')
bro.switch_to.frame(iframe)
# 定位上传元素按钮并点击
bro.find_element_by_class_name("upload-btn").click()
time.sleep(5)
# 点击之后会弹出文件夹让选择文件,这里已经跳出三界之外了,不在selenium的管辖范围,
# 我们采用autoit编写个自动化脚本程序帮我们实现自动选择文件并打开上传,脚本编写测试请看第三步,如果有我写好的1.exe可执行程序就不用看了


path = 'C:\\Users\\admin\\vodeo\\1.mp4'
os.system('C:\\Users\\admin\\Desktop\\1.exe %s' % path)

# autoit 中文字符输入问题 https://www.bbsmax.com/A/qVdeLD1Q5P/

# 上传成功之后填一下参数
time.sleep(5)
str = bro.page_source
html = etree.HTML(str)

# 判断网页是否出现“上传完成”字样
compete_up = html.xpath('//*[@id="video-up-app"]/div[1]/div/div/div[1]/div[2]/div[2]/div[2]/div[1]/div[1]/span//text()')
if len(compete_up) == 0:
    pass
else:
    if compete_up[0] == '上传完成':
        # 标签定位选择点击“自制”按钮。这里各栏目可以根据自己的需要选择或填写
        bro.find_element_by_xpath('//*[@id="video-up-app"]/div[1]/div/div/div[1]/div[3]/div[6]/div/div[2]/div/div[1]/div/span').click()
        time.sleep(2)
        # 定位点击立即投稿
        bro.find_element_by_xpath('//*[@id="video-up-app"]/div[1]/div/div/div[1]/div[3]/div[14]/div/span').click()

有关基于selenium和autoit 实现B站视频自动上传功能的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  3. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  4. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  5. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  6. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  7. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  8. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐