代碼效果演示
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秒