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

1. 下载chromedriver

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

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

image-20220712132732006

image-20220712132334872

1.2 下载谷歌驱动

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

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

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

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

image-20220712133328945

2. selenium的使用

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

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

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

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

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

selenium操作已经打开的浏览器

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

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

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

image-20220715135909063

然后需要访问: 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/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pqZ38yix-1659664280377)(../AppData/Roaming/Typora/typora-user-images/image-20220715182430863.png)]

直接点击下载,傻瓜式安装就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)程序,选择脚本直接转化即可

image-20220715184817503

至此简单的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()

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...