Mac 下 Python+Selenium 自动上传西瓜视频

背景

研究下 Python+Selenium 自动化测试框架,简单实现 Mac 下自动化批量上传视频西瓜视频并发布,分享给需要的同学(未做过多的异常处理)。

脚本实现

首先通过手工手机号登录,保存西瓜视频网站的 cookie 文件
之后加载 cookie 内容,使用脚本批量上传视频,保存到草稿(也可自动发布,为了二次编辑,如修改封面)
最后通过遍历视频草稿列表,来进行草稿视频发布,PS: 同一天上传或发布视频太多时,会被西瓜视频限流。

安装依赖

# 安装依赖保存网站 cookie# 安装 chromedriver
$ brew install chromedriver

脚本内容

#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import json
import os
import shutil
import sysfrom selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import ActionChains
from pykeyboard import PyKeyboard
from pymouse import PyMouse
import pyperclipclass XiGua:"""Mac 西瓜视频自动上传视频及发布草稿"""def __init__(self):"""初始化,打开浏览器"""self.driver = webdriver.Chrome()def save_cookies(self, cookies_file_name):"""保存 cookiescookies_file_name: cookies 文件名称"""# 预留 20 秒,来进行手工登录time.sleep(20)# 登录成功后,保存 cookies 文件with open(cookies_file_name, 'w') as cookies_file:cookies_file.write(json.dumps(self.driver.get_cookies()))def load_cookies(self, cookies_file_name):"""加载 cookiecookies_file_name: cookies 文件名称"""# 加载 cookies 文件with open(cookies_file_name, 'r') as cookies_file:cookies_list = json.load(cookies_file)for cookie in cookies_list:if 'expiry' in cookie:del cookie['expiry']self.driver.add_cookie(cookie)# 加载 cookie 后,刷新页面生效self.driver.refresh()def is_exist_element_by_xpath(self, xpath):"""判断元素是否存在"""flag = Truetry:self.driver.find_element_by_xpath(xpath)return flagexcept Exception as e:flag = Falseprint("xpath: [%s] 的元素不存在,错误:%s" % xpath, e)return flagdef upload_video(self, video_file_path):"""上传视频video_file_path: 上传视频路径"""# 打开上传视频页面self.driver.get("https://studio.ixigua.com/upload?from=post_article")# 点击上传self.driver.find_element_by_class_name("byte-upload-trigger-drag").click()time.sleep(5)# 选择视频文件k = PyKeyboard()m = PyMouse()# 打开k.press_keys(['Command', 'Shift', 'G'])x_dim, y_dim = m.screen_size()k.press_keys(['Shift'])m.click(x_dim // 2, y_dim // 2, 1)# 复制视频文件路径pyperclip.copy(video_file_path)# 粘贴k.press_keys(['Command', 'V'])time.sleep(2)k.press_key('Return')time.sleep(2)k.press_key('Return')time.sleep(2)# 设置转载选项self.driver.find_element_by_xpath('//*[@id="js-video-list-content"]/div/div[2]/div[4]/div[2]/div/div/label[2]/span/span').click()time.sleep(1)# 同步到抖音# self.driver.find_element_by_class_name("byte-checkbox-mask").click()# 循环判断视频上传成功,不成功等待10秒后,再次判断,直到成功while '上传成功' not in self.driver.find_element_by_xpath('//*[@id="js-video-list-content"]/div/div[1]/div[1]/div[2]/div[2]').text:print("循环等待视频上传成功,等待10秒")time.sleep(10)# 设置视频封面self.driver.find_element_by_class_name("m-xigua-upload").click()print('点击-上传封面')time.sleep(5)try:reload = self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[1]/div/div/div/div[2]')# 视频封面解析失败处理,循环刷新if reload != '':print('视频封面解析失败处理,开始循环刷新')while XiGua.is_exist_element_by_xpath(self,'/html/body/div[3]/div/div[2]/div/div[1]/div/div/div/div[2]'):# 点击循环self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[1]/div/div/div/div[2]').click()print('刷新失败后,等待5秒,再次刷新')time.sleep(5)# 选择第一个图片img = self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[1]/div/div/div[1]/img')img.click()except Exception as e:print('封面解析正常,无需刷新')pass# 下一步cover_next_element = WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div[2]/div'))cover_next_element.click()print('点击-封面下一步')try:# 完成裁剪cover_crop_element = WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath('//*[@id="tc-ie-base-content"]/div[2]/div[2]/div[2]/div/div[2]/div/div/div[2]'))if cover_crop_element != '':cover_crop_element.click()print('点击-封面完成裁剪')else:print('封面无需裁剪')except Exception as e:print('裁剪封面出现异常:%s' % e)passtime.sleep(5)# 确定self.driver.find_element_by_xpath('//*[@id="tc-ie-base-content"]/div[2]/div[2]/div[3]/div[3]/button[2]').click()print('点击-封面确定')time.sleep(1)# 再次确定self.driver.find_element_by_xpath('/html/body/div[4]/div/div[2]/div/div[2]/button[2]').click()print('点击-封面再次确定')time.sleep(5)# 存草稿draft_element = WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath('//*[@id="js-submit-draft-0"]/button'))action = ActionChains(self.driver)print('点击-保存草稿')# 移动滚动条到底部js = "window.scrollTo(0,document.body.scrollHeight)"self.driver.execute_script(js)# 移动到 存草稿 按钮点击action.move_to_element(draft_element).click().perform()def close(self):"""关闭浏览器"""self.driver.close()def batch_upload(self, videos_dir_path):"""批量上传视频videos_dir_path: 上传视频存储路径"""files = os.listdir(videos_dir_path)# 降序排序上传,草稿发布时,视频序号则为顺序files.sort(reverse=True)# 批量上传视频for file in files:if os.path.splitext(file)[1] == '.mp4':full_file_path = os.path.join(videos_dir_path, os.path.splitext(file)[0])print("==开始上传视频:%s" % full_file_path)self.upload_video(full_file_path)src = os.path.join(videos_dir_path, file)dst = os.path.join(videos_dir_path, 'bak', file)# 发布完成后,移到到备份目录shutil.move(src, dst)def videos_release(self):"""草稿视频发布"""self.driver.get("https://studio.ixigua.com/content")time.sleep(2)# 点击草稿导航draft_navigation_element = WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath('//*[@id="app"]/div/section/div/div[1]/ul/li[3]'))draft_navigation_element.click()print('点击-草稿导航')time.sleep(2)# 草稿列表draft_elements = self.driver.find_elements_by_class_name('content-card__title ')# 草稿列表为空,则退出if len(draft_elements) == 0:print("草稿列表为空")XiGua.close(self)sys.exit()# 循环发布草稿,每次都发布第一个for i in range(1, 99999):# 草稿列表为空,退出if draft_elements == '':print('草稿发布完成,总共:%s' % str(i))XiGua.close(self)sys.exit()print('当前发布数量 %s, 发布视频: %s' % (str(i), draft_elements[0].text))# 发布草稿第一个视频draft_elements[0].click()time.sleep(3)# 立即发布element2 = WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath('//button[contains(text(), "发布")]'))element2.click()print('点击-视频发布')# 判断是否发布失败,如标题超长try:# 错误处理if XiGua.is_exist_element_by_xpath(self, '/html/body/div[3]/div/div/div/span'):print('发布出现错误,退出,请检查错误,如标题超长等')sys.exit()except Exception as e:print('草稿发布异常:%s' % e)pass# 处理封面分辨率低提示try:# 封面分辨率低cover_cancel_element = self.driver.find_element_by_xpath('//div[contains(text(), "取消")]')print('封面分辨率低处理,直接取消')# 错误处理if cover_cancel_element != '':print('取消封面分辨率低')cover_cancel_element.click()# 立即发布cover_publish_element = WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath('//button[contains(text(), "发布")]'))cover_publish_element.click()except Exception as e:print('封面分辨率低出现异常:%s' % e)pass# 点击草稿draft_publish_element = WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath('//*[@id="app"]/div/section/div/div[1]/ul/li[3]'))draft_publish_element.click()time.sleep(2)print('重新获取草稿列表')draft_elements = self.driver.find_elements_by_class_name('content-card__title ')print(draft_elements)def xigua_videos_release(self, base_url, cookies_file_path):"""西瓜视频发布草稿base_url: 西瓜视频网站cookies_file_path: 西瓜视频 cookies 文件路径"""self.driver.get(base_url)# 加载 cookiesXiGua.load_cookies(self, cookies_file_path)# 草稿发布视频XiGua.videos_release(self)# 关闭浏览器XiGua.close(self)def xigua_batch_upload(self, base_url, cookies_file_path, videos_dir_path):"""西瓜视频批量发布视频base_url: 西瓜视频网站cookies_file_path: 西瓜视频 cookies 文件路径videos_dir_path: 上传视频存储路径"""self.driver.get(base_url)XiGua.load_cookies(self, cookies_file_path)XiGua.batch_upload(self, videos_dir_path)XiGua.close(self)def xigua_save_cookies(self, base_url, cookies_file_path):"""保存网站 cookiebase_url: 网站地址cookies_file_path: 网站 cookies 文件路径"""self.driver.get(base_url)# 保存 cookiesXiGua.save_cookies(self, cookies_file_path)XiGua.close(self)if __name__ == '__main__':xi_gua = XiGua()# 西瓜视频base_url = 'https://www.ixigua.com/'xigua_cookies = '/tmp/xigua_update_video/xigua_cookies.txt'videos_dir_path = '/tmp/rm'## 1. 保存 cookie# xi_gua.xigua_save_cookies(base_url, 'xigua_cookies.txt')## 2. 批量上传xi_gua.xigua_batch_upload(base_url, xigua_cookies, videos_dir_path)## 3. 批量发布草稿# xi_gua.xigua_videos_release(base_url, xigua_cookies)


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战 

三、Web自动化项目实战

四、App自动化项目实战 

五、一线大厂简历

六、测试开发DevOps体系 

七、常用自动化测试工具

八、JMeter性能测试 

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到! 

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/269647.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android : BottomNavigation底部导航_简单应用

示例图&#xff1a; 1.先创建底部导航需要的图片 res → New → Vector Asset 创建三个矢量图 图片1 baseline_home.xml <vector android:height"24dp" android:tint"#000000"android:viewportHeight"24" android:viewportWidth"24…

让植被管理更精准:数据可视化的新利器

【小编整理了300可视化大屏源文件&#xff0c;需要可后台私~&#xff01;】 在当今时代&#xff0c;数据可视化技术已经成为了一个非常重要的技术。对于植被管理来说&#xff0c;数据可视化也有着非常重要的作用。通过将植被管理数据可视化&#xff0c;我们可以更加清晰地了解植…

maui sqlite开发一个商城加购物车的演示(1)

界面演示 using ShoppingUI;namespace ShoppingUI;public partial class App : Application {public App(){InitializeComponent();MainPage new LoginPage();}static LoginDatabase database;// Create the database connection as a singleton.public static LoginDatabase …

PyTorch: 基于【MobileNet V2】处理MNIST数据集的图像分类任务【准确率99%+】

目录 引言1. 安装PyTorch2. 下载并加载MNIST数据集3. 搭建基于MobileNet V2的图像分类模型运行结果&#xff08;重点看网络开头和结束位置即可&#xff09; 4. 设置超参数、损失函数、优化器5. 训练模型6. 测试模型运行结果 完整代码结束语 引言 在深度学习和计算机视觉的世界…

(第32天)RHEL 7 安装 Oracle 12CR2 RAC 数据库

前言 Oracle 12CR2 版本是 12.2.0.1 版本,是 12C 家族中最早的比较稳定的版本,在 19C 没出来之前,很多人选择 12CR2 作为稳定版本进行安装。目前 19C 长期稳定版已经出来,Oracle 对于 12CR2 版本的支持周期也止步于 2022 年,应该很少会有人再选择 12CR2,除非应用上不支持…

【Hadoop_04】HDFS的API操作与读写流程

1、HDFS的API操作1.1 客户端环境准备1.2 API创建文件夹1.3 API上传1.4 API参数的优先级1.5 API文件夹下载1.6 API文件删除1.7 API文件更名和移动1.8 API文件详情和查看1.9 API文件和文件夹判断 2、HDFS的读写流程&#xff08;面试重点&#xff09;2.1 HDFS写数据流程2.2 网络拓…

数据结构-05-跳表SkipList

1-什么是跳表 跳表SkipList是一种随机化的数据结构&#xff0c;基于并联的链表&#xff0c;实现简单&#xff0c;插入、删除、查找的复杂度均为 O(logN)&#xff08;大多数情况下&#xff0c;因为是实现上是概率问题&#xff09;&#xff0c;因为其性能匹敌红黑树且实现较为简单…

Layui深入

1、代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>注册页面</title> <style> .container { max-width: 600px; margin: 0 auto; padding: 20px; …

Ubuntu20.04降低linux版本到5.4.0-26-generic

前言 试用ubuntu20.04安装昇腾的驱动和cann的时&#xff0c;出现如下问题&#xff1a; (base) rootubuntu:/home/work# ./Ascend-hdk-910-npu-driver_23.0.rc3_linux-aarch64.run --full Verifying archive integrity... 100% SHA256 checksums are OK. All good. Uncompr…

时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解

时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解 可…

java版Spring Cloud+Spring Boot+Mybatis之隐私计算 FATE - 多分类神经网络算法测试

一、说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练&#xff0c;并使用该模型对数据进行 多分类预测。 二分类算法&#xff1a;是指待预测的 label 标签的取值只有两种&#xff1b;直白来讲就是每个实例的可能类别只有两种 (0 或者 1)&…

数据挖掘目标(客户价值分析)

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as snsIn [2]: datapd.read_csv(r../教师文件/air_data.csv)In [3]: data.head()Out[3]: Start_timeEnd_timeFareCityAgeFlight_countAvg_discountFlight_mileage02011/08/182014/0…