• 基于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”
    
    • 1

    即会自动打开谷歌浏览器,打开之后默认的是谷歌引擎,在设置里修改为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()
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

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

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

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

    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)
    
    • 1
    • 2
    • 3

    直接就可以用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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    MySQL日志系统 - 一文贯通MySQL日志
    ubuntu20开启NTP服务器操作步骤
    【Rust日报】2022-08-08 基于Rust能力的Linux runtime
    嵌入式系统usb测试笔记
    IDEA中的“Deployment“ 将项目直接部署到服务器上
    程序验证之Dafny--证明霍尔逻辑的半自动化利器
    Kubernetes(k8s)资源控制器 RS、Deployment详细介绍
    LuatOS-SOC接口文档(air780E)-- ioqueue - io序列操作
    解决reudx中的异步问题 applyMiddleware thunk
    Fragment中获取Activity的方法进行fragment的切换
  • 原文地址:https://blog.csdn.net/weixin_44327634/article/details/126171813