自動上傳視頻到B站和西瓜視頻


代碼效果演示
Gitee源碼

# -*- coding: utf-8 -*-
# Version: Python 3.9.7
# Author: TRIX
# Date: 2021-09-14 21:34:14
# Use:自動生成視頻封面 並自動上傳視頻到B站 和 西瓜視頻 由於該程序部分代碼只適配於作者的硬件和軟件 部分快捷鍵為作者自定義 在對代碼修改前 請勿隨意運行該程序 視頻配置要求文件 VideoConfig.txt

#使用之前 先配置 VideoConfig.txt 且保證網絡正常 如果程序出錯 鼠標移動到屏幕左上角停止程序運行

from pyautogui import *
from PIL import Image,ImageDraw,ImageFont
from time import sleep,time
import pyperclip
import os,fnmatch
import shutil
from send2trash import send2trash

def coverGener(title,fontPath,coverSavePath):
	'''標題文本 最多九個漢字 字體 封面生成目錄'''
	pic=Image.new('RGBA',(1146,717),'#1D1D1F')#以MODE模式 新建一個(weight,height)純色圖片 如果不指定顏色 默認為透明黑色 0 0 0 0 默認分辨率72 圖片打印分辨率要求300
	drawer=ImageDraw.Draw(pic)#繪制器
	fontCode=ImageFont.truetype(font=fontPath,size=100)#ImageFont對象 ttf字體格式
	drawer.text((650,64),'源碼',fill='#F25228',align='center',font=fontCode)#(x,y)處 寫入str fill顏色 align對齊
	fontBrief=ImageFont.truetype(font=fontPath,size=74)#ImageFont對象 ttf字體格式
	drawer.text((850,85),'在簡介',fill='#F25228',align='center',font=fontBrief)#(x,y)處 寫入str fill顏色 align對齊
	fontTitle=ImageFont.truetype(font=fontPath,size=120)#ImageFont對象 ttf字體格式
	titleW,titleH=drawer.textsize(title,font=fontTitle)#返回str的(weight,height)
	drawer.text((int((1146-titleW)/2),215),title,fill='#00A3ED',align='center',font=fontTitle)#(x,y)處 寫入str fill顏色 align對齊
	fontSub=ImageFont.truetype(font=fontPath,size=88)#ImageFont對象 ttf字體格式
	drawer.text((128,400),'Python程序  效果演示',fill='#F5F5F7',align='center',font=fontSub)#(x,y)處 寫入D:\[vidstr fill顏色 align對齊
	pic.save(coverSavePath, quality=100,dpi=(300,300))#無色差保存 網絡圖片不會出現色差問題 只有 拍攝照片 或 PS等軟件 處理后的圖片會有色差問題 常用模式 RGB RGBA CMYK L黑白模式 高質量 300分辨率 默認分辨率72 圖片打印分辨率要求300

def uploadToXigua(delay,videoSavePath,title,titleSuffix,coverSavePath,videoBriefTitle,videoBrief,codeSiteTitle,codeSite,mode):
	click(1440,140)#點擊個人網站
	click(1732,244,button='right')#選擇西瓜上傳視頻頁面
	click(1463,245)#在新頁面打開
	hotkey('ctrl','pgdn')#切換到上傳頁面
	sleep(2.5+delay)
	click(1210,578)#點擊上傳視頻
	sleep(1+delay)
	hotkey('shift','alt','s')#選擇文件快捷鍵
	typewrite(videoSavePath)#選擇視頻儲存文件夾
	sleep(0.5+delay)
	press('enter')
	hotkey('winleft','left')#分屏窗口快捷鍵
	click(570,191)#選擇視頻
	click(760,990)#確認視頻
	sleep(0.5+delay)

	#編輯標題
	click(767,651)#進入標題編輯區域
	pyperclip.copy(title)#復制標題到剪貼板
	hotkey('ctrl','v')#粘貼標題
	pyperclip.copy(titleSuffix)#復制標題后綴到剪貼板
	hotkey('ctrl','v')#粘貼標題后綴

	#選擇封面
	click(690,884)#選擇視頻封面
	sleep(0.5+delay)
	click(464,230)#選擇本地上傳
	click(950,615)#選擇上傳本地圖片
	sleep(1+delay)
	hotkey('winleft','left')#分屏窗口快捷鍵
	hotkey('shift','alt','s')#選擇文件快捷鍵
	typewrite(coverSavePath)#選擇視頻封面
	sleep(0.5+delay)
	press('enter')
	sleep(1+delay)
	click(1215,567)#切換到封面編輯界面
	dragTo(1215,258,duration=0.5)#編輯視頻封面
	sleep(1+delay)
	click(1195,982)#退出編輯區域
	sleep(1+delay)
	click(1545,834)#完成剪裁
	sleep(1+delay)
	click(1593,992)#點擊確定
	sleep(0.5+delay)
	click(1060,682)#點擊最終確定
	sleep(2+delay)
	click(1120,855)#退出封面編輯界面

	#編輯視頻為原創
	hotkey('ctrl','home')#轉到視頻上傳頁面開頭
	typewrite(['down' for n in range(4)])#向下滾動4格
	click(535,778)#點擊原創

	#編輯簡介
	click(450,939)#點擊更多選項
	typewrite(['down' for n in range(2)])#向下滾動2格
	click(623,868)#進入簡介編輯區域
	pyperclip.copy(videoBriefTitle)
	hotkey('ctrl','v')#粘貼簡介標題
	pyperclip.copy(videoBrief)
	hotkey('ctrl','v')#粘貼簡介
	press('enter')#分段
	pyperclip.copy(codeSiteTitle)
	hotkey('ctrl','v')#粘貼源碼鏈接標題
	pyperclip.copy(codeSite)
	hotkey('ctrl','v')#粘貼源碼鏈接
	click(1244,574)#退出標簽編輯區域

	#投稿
	hotkey('ctrl','end')#移動到視頻編輯頁面尾部
	if mode=='upload':
		click(447,933)#點擊發布
	elif mode=='test':
		click(586,934)#點擊存草稿

def uploadToBilibil(delay,videoSavePath,coverSavePath,title,labelList,videoBrief,codeSite,mode):
	click(1440,140)#點擊個人網站
	click(1730,350,button='right')#選擇B站上傳視頻頁面
	click(1440,250)#在新頁面打開
	hotkey('ctrl','pgdn')#切換到上傳頁面
	sleep(2.5+delay)
	click(1120,800)#點擊上傳視頻
	sleep(1+delay)
	hotkey('shift','alt','s')#選擇文件快捷鍵
	typewrite(videoSavePath)#選擇視頻儲存文件夾
	sleep(0.5+delay)
	press('enter')
	hotkey('winleft','left')#分屏窗口快捷鍵
	click(570,191)#選擇視頻
	click(760,990)#確認視頻
	sleep(0.5+delay)

	#選擇視頻模板
	click(1600,810)#選擇模板界面
	click(1430,930)#點擊Python模板

	#選擇封面
	press('tab')#切換到封面按鈕
	click(580,955)#點擊選擇封面
	sleep(1+delay)
	hotkey('winleft','left')#分屏窗口快捷鍵
	hotkey('shift','alt','s')#選擇文件快捷鍵
	typewrite(coverSavePath)#選擇視頻封面
	sleep(0.5+delay)
	press('enter')
	sleep(1+delay)
	click(1280,740)#切換到封面編輯界面
	press('down')#向下滾動一格
	click(1210,930)#確認封面
	sleep(1+delay)

	#編輯標題
	typewrite(['down','down','down','down',])#向下滾動頁面4格
	click(785,895)#進入標題編輯區域
	press('home')#光標移動到標題開頭
	pyperclip.copy(title)#復制標題到剪貼板
	hotkey('ctrl','v')#粘貼標題
	click(1100,780)#退出標題編輯區域

	#編輯標簽
	typewrite(['down','down','down','down',])#向下滾動頁面4格
	click(1300,875)#進入標簽編輯區域
	for label in labelList:#粘貼標簽
		pyperclip.copy(label)
		hotkey('ctrl','v')
		press('enter')
		sleep(0.5)
	click(1275,730)#退出標簽編輯區域

	#編輯粉絲動態
	hotkey('ctrl','end')#移動到視頻編輯界面結尾
	click(900,490)#進入粉絲動態編輯區域
	pyperclip.copy(videoBrief)
	hotkey('ctrl','v')#粘貼簡介
	click(1170,760)#退出粉絲動態編輯區域

	#編輯簡介
	typewrite(['up' for n in range(18)])#向上滾動頁面18格
	click(650,459)#進入視頻簡介編輯
	hotkey('ctrl','v')#粘貼簡介
	hotkey('ctrl','end')#移動到簡介編輯區結尾
	pyperclip.copy(codeSite)
	hotkey('ctrl','v')#粘貼源碼鏈接
	click(1234,815)#退出視頻簡介編輯

	#投稿
	hotkey('ctrl','end')#移動到視頻上傳頁面尾部
	if mode=='upload':
		click(595,780)#投稿視頻
	elif mode=='test':
		click(795,780)#保存模板

def uploadVideo(mode='upload',delay=0):#上傳視頻所有步驟 mode 上傳模式
	startTimeStamp=time()-90#程序開始運行的時間

	#打開 VideoConfig.txt 詳細介紹和條件要求 在 VideoConfig.txt
	with open('VideoConfig.txt','r',encoding='utf-8')as f:#讀取視頻所有配置
		config = f.readlines()[1:13]
	title=config[0].split('=')[1].strip()
	videoLabels = config[1].split('=')[1].strip()
	labelList=videoLabels.split()
	if len(labelList)>4:
		raise ValueError('標簽最多4個 請重新編輯')
	videoBriefTitle = config[2].split('=')[1].strip()
	videoBrief = config[3].split('=')[1].strip()
	codeSiteTitle=config[4].split('=')[1].strip()
	codeSite=config[5].split('://')[1].strip()
	if len(codeSite)>131:
		raise ValueError('源碼鏈接最多131個字符 請重新編輯')
	coverSavePath=config[6].split('=')[1].strip()
	fontPath=config[7].split('=')[1].strip()
	videoSavePath=config[8].split('=')[1].strip()
	titleSuffix=config[9].split('=')[1].strip()
	videoUploadedPath=config[10].split('=')[1].strip()
	videoFormat=config[11].split('=')[1].strip()

	#生成視頻封面
	coverGener(title,fontPath,coverSavePath)

	#上傳視頻 縮放比例為90% 分辨率1920x1080 固定坐標 執行操作有延遲 相應點擊坐標不能大幅度改變
	#打開Edge瀏覽器
	click(160,1060)
	sleep(2+delay)

	#切換輸入法
	click(1802,1056)#點擊輸入法
	click(1720,885)#切換到美式鍵盤

	#上傳視頻到B站
	uploadToBilibil(delay,videoSavePath,coverSavePath,title,labelList,videoBrief,codeSite,mode)

	#上傳視頻到西瓜視頻
	uploadToXigua(delay,videoSavePath,title,titleSuffix,coverSavePath,videoBriefTitle,videoBrief,codeSiteTitle,codeSite,mode)

	#移動本次上傳視頻到 videoUploadedPath 文件夾
	for file in fnmatch.filter(os.listdir(videoSavePath), '*.'+videoFormat):#在第一級目錄匹配唯一的mp4文件
		if startTimeStamp>os.path.getctime(videoSavePath+'\\'+file):#所要上傳的視頻創建的時間戳<程序開始運行時間戳-90s<正在錄制的這個視頻創建的時間戳
			shutil.move(videoSavePath+'\\'+file,videoUploadedPath)#移動本次上傳視頻到 videoUploadedPath 文件夾

	#檢測 videoUploadedPath 文件夾內video個數 把文件夾內 創建時間最早的文件 移動到回收站
	leastTimeStamp=time()#返回現在 unix時間戳
	for i,file in enumerate(fnmatch.filter(os.listdir(videoUploadedPath), '*.'+videoFormat)):#對里面的每個mp4文件
		fileTimeStamp=os.path.getctime(videoUploadedPath+'\\'+file)#輸出文件創建時間 unix時間戳
		if fileTimeStamp<=leastTimeStamp:#如果文件創建時間戳比當前最小時間戳還小
			leastTimeStamp=fileTimeStamp
	for i,file in enumerate(os.listdir(videoUploadedPath)):#對里面的每個mp4文件
		if leastTimeStamp==os.path.getctime(videoUploadedPath+'\\'+file):#如果最小時間戳=文件創建時間戳
			send2trash(videoUploadedPath+'\\'+file)#把該文件移動到回收站


FAILSAFE=True# 如果程序出錯 鼠標移動到屏幕左上角 拋出 pyautogui.FailSafeException 異常 並停止程序
#使用之前 先配置 VideoConfig.txt 且確保網絡正常 確保瀏覽器打開的頁面不超過1
uploadVideo(mode='upload',delay=0)
#mode:test 測試是否正常執行上傳步驟 或 upload 上傳視頻 默認為upload
#delay:float 程序關鍵步驟執行延遲秒數 默認延遲0秒


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM