代码效果演示Gitee源码#-*-coding:utf-8-*-#Version:Python3.9.7#Author:TRIX#Date:2021-09-1421:34:14#Use:自动生成视频封面和自动上传视频到哔哩哔哩和西瓜视频。由于部分程序代码只适用于笔者的硬件和软件,部分快捷键是笔者自定义的。请不要在修改代码前随意运行程序。视频配置要求文件VideoConfig.txt#使用前先配置VideoConfig.txt,确保网络正常。如果程序运行失败,将鼠标移至屏幕左上角停止程序fontPath,coverSavePath):'''标题文字最多可以包含9个汉字和封面生成目录'''pic=Image.new('RGBA',(1146,717),'#1D1D1F')#创建一个MODE模式新增一个(weight,height)如果不指定纯色图片,默认颜色为透明黑0000默认分辨率为72图片打印分辨率需要300drawer=ImageDraw.Draw(pic)#DrawerfontCode=ImageFont.truetype(font=fontPath,size=100)#ImageFont对象ttf字体格式drawer.text((650,64),'source',fill='#F25228',align='center',font=fontCode)#(x,y)writestrfillcoloralignfontBrief=ImageFont.truetype(font=fontPath,size=74)#ImageFont对象ttf字体格式drawer.text((850,85),'简述',fill='#F25228',align='center',font=fontBrief)#(x,y)写str填充颜色对齐对齐fontTitle=ImageFont.truetype(font=fontPath,size=120)#ImageFont对象ttf字体格式titleW,titleH=drawer.textsize(title,font=fontTitle)#Returnstr的(weight,height)drawer.text((int((1146-titleW)/2),215),title,fill='#00A3ED',align='center',font=fontTitle)#(x,y)writestrfillcoloralignalignmentfontSub=ImageFont.truetype(font=fontPath,size=88)#ImageFont对象ttf字体格式drawer.text((128,400),'Python程序效果演示',fill='#F5F5F7',align='center',font=fontSub)#(x,y)writeD:\[vidstr填充颜色对齐对齐pic.save(coverSavePath,quality=100,dpi=(300,300))#无色差保存网络图片不会出现色差问题只有拍照或者用PS等软件处理过的图片才会出现色差问题普通模式RGBRGBACMYKL黑白模式高质量300分辨率默认分辨率72图像打印分辨率n要求是300defuploadToXigua(delay,videoSavePath,title,titleSuffix,coverSavePath,videoBriefTitle,videoBrief,codeSiteTitle,codeSite,mode):click(1440,140)#click个人网站click(1732,244,button='right')#选择西瓜上传视频页面点击(1463,245)#打开热键('ctrl','pgdn')#切换到上传页面休眠(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)#Edit标题点击(767,651)#进入标题编辑区pyperclip.copy(title)#复制标题到剪贴板hotkey('ctrl','v')#粘贴标题pyperclip.copy(titleSuffix)#复制标题后缀到剪贴板热键('ctrl','v')#粘贴标题后缀#选择封面点击(690,884)#选择视频封面睡眠(0.5+延迟)点击(464,230)#选择本地上传点击(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)#点击确认休眠(0.5+delay)点击(1060,682)#点击结束sleep(2+delay)click(1120,855)#退出封面编辑界面#编辑视频为原始热键('ctrl','home')#到视频上传页面开头打字(['down'forninrange(4)])#rolldown4gridclick(535,778)#clickoriginal#editprofileclick(450,939)#clickmoreoptionstypewrite(['down'forninrange(2)])#向下滚动2格点击(623,868)#进入个人资料编辑区pyperclip.copy(videoBriefTitle)hotkey('ctrl','v')#粘贴个人资料标题pyperclip.copy(videoBrief)hotkey('ctrl','v')#粘贴介绍press('enter')#Segmentpyperclip.copy(codeSiteTitle)hotkey('ctrl','v')#粘贴源码链接标题pyperclip.copy(codeSite)hotkey('ctrl','v')#粘贴源链接click(1244,574)#退出标签编辑区#投稿热键('ctrl','end')#移动到视频编辑页面末尾ifmode=='upload':click(447,933)#点击发布elifmode=='test':click(586,934)#点击保存草稿defuploadToBilibil(delay,videoSavePath,coverSavePath,title,labelList,videoBrief,codeSite,mode):click(1440,140)#点击个人网站click(1730,350,button='right')#选择B站上传视频页面click(1440,250)#打开热键inanewpage('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)#确认视频休眠(0.5+delay)#选择视频模板click(1600,810)#选择模板界面click(1430,930)#点击Python模板#选择coverpress('tab')#切换到coverbuttonclick(580,955)#点击选择coversleep(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)#Edittitletypewrite(['down','down','down','down',])#向下滚动页面4格click(785,895)#进入标题编辑区press('home')#移动光标到标题开头pyperclip.copy(title)#复制标题到剪贴板热键('ctrl','v')#粘贴标题click(1100,780)#退出标题编辑区#编辑标签typewrite(['down','down','down','down',])#向下滚动页面4格click(1300,875)#进入标签编辑区forlabelinlabelList:#粘贴标签pyperclip.copy(label)hotkey('ctrl','v')press('enter')sleep(0.5)click(1275,730)#退出标签编辑区#Editfan动态热键('ctrl','end')#移至视频编辑界面末尾点击(900,490)#进入粉丝动态编辑区pyperclip.copy(videoBrief)hotkey('ctrl','v')#粘贴介绍click(1170,760)#退出扇形动态编辑区#Editorprofiletypewrite(['up'forninrange(18)])#向上滚动页面18格click(650,459)#进入视频profileeditorhotkey('ctrl','v')#粘贴介绍hotkey('ctrl','end')#移至介绍编辑区末尾pyperclip.copy(codeSite)hotkey('ctrl','v')#粘贴源码链接click(1234,815)#退出视频介绍编辑#投稿热键('ctrl','end')#移至视频上传页面末尾ifmode=='upload':click(595,780)#投稿视频elif模式=='test':click(795,780)#保存模板defuploadVideo(mode='upload',delay=0):#上传视频的所有步骤modeuploadmodestartTimeStamp=time()-90#程序开始运行的时间#OpenVideoConfig.txt详细介绍和条件要求在VideoConfig.txtwithopen('VideoConfig.txt','r',encoding='utf-8')asf:#读取所有视频配置config=f.readlines()[1:13]title=config[0]。split('=')[1].strip()videoLabels=config[1].split('=')[1].strip()labelList=videoLabels.split()如果len(labelList)>4:引发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()如果len(codeSite)>131:raiseValueError('Pleasere-editthesourcelinkupto131characters')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)#upload视频缩放比例为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文件夹下fnmatch.filter(os.listdir(videoSavePath),'*.'+videoFormat):#如果startTimeStamp>os.匹配一级目录下唯一的mp4文件。path.getctime(videoSavePath+'\\'+file):#要上传的视频的时间戳<程序开始运行时的时间戳-90s<正在录制的视频的时间戳shutil.move(videoSavePath+'\\'+file,videoUploadedPath)#将本次上传的视频移动到videoUploadedPath文件夹中#检测videoUploadedPath文件夹中的视频数量,将文件夹中创建时间最早的文件移动到回收站leastTimeStamp=time()#返回i当前的unix时间戳,fileinenumerate(fnmatch.filter(os.listdir(videoUploadedPath),'*.'+videoFormat)):#foreachmp4fileinsidefileTimeStamp=os.path.getctime(videoUploadedPath+'\\'+file)#output文件创建timeunixtimestampiffileTimeStamp<=leastTimeStamp:#如果文件创建时间戳小于当前最小时间戳TimeStamp=fileTimeStampfori,fileinenumerate(os.listdir(videoUploadedPath)):#Foreachmp4fileinsideifleastTimeStamp==os.path.getctime(videoUploadedPath+'\\'+file):#如果最小时间戳=文件创建时间戳send2trash(videoUploadedPath+'\\'+file)#将文件移动到回收站FAILSAFE=True#如果程序出错,鼠标移动到屏幕左上角,抛出pyautogui.FailSafeException并停止程序#ConfigurebeforeusingVideoConfig.txt并确保网络正常确保浏览器打开的页面数不超过1uploadVideo(mode='upload',delay=0)#mode:test测试是否上传步骤正常执行或上传上传视频默认为upload#delay:程序的float键步骤执行延迟秒默认延迟0秒
