
腳本開發(fā)環(huán)境
? ?說明下開發(fā)和實施這個自動化腳本的幾個微不足道的小前提:
- 電腦或Mac或Surface,操作系統(tǒng)不限,Mac或Linux優(yōu)先
- 手機
- 有條件訪問Youtube或Tiktok(無需注冊賬號)
- 國內(nèi)平臺的APP及賬號
- 每月1-2美金的服務器費用
功能框架

? ?按照整個流程步驟,首先是要完成對若干頻道的監(jiān)測,這部分可以使用平臺API如Youtube API或第三方API如Pytube,也可以直接使用selenium庫進行更直接的網(wǎng)頁監(jiān)控,一旦發(fā)現(xiàn)有新視頻上架立刻進入下載流程,下載功能可以通過第三方API如Pytube或第三方下載網(wǎng)頁用selenium腳本下載。接著,使用FFMPEG/Opencv/Pillow等第三方多媒體庫對視頻進行編輯,為發(fā)布到自媒體平臺提供必要的資源,如畫面縮放銳化亮度調(diào)整,抽幀做封面,翻譯標題,添加翻譯字幕,美化封面等等。最后,使用selenium把發(fā)布內(nèi)容依次輸入到自媒體平臺的上傳界面里。聽上去是不是超級簡單,接下來我們就一個一個步驟詳細操作一遍。
安裝Python環(huán)境
? ?既然面向零基礎,那么Python環(huán)境搭建也帶過一下,不需要看的可以直接跳過這一章節(jié)。當前我們雖然使用本地計算機進行調(diào)試,但由于未來我們的搬運腳本是需要運行在云上里的,因此請盡量優(yōu)先選擇Mac或Ubuntu等比較常用的操作系統(tǒng),方便提前熟悉服務器配置環(huán)境,當然Python是跨平臺的語言,因此使用Windows也完全沒有問題。首先確保你的電腦里安裝了Python3,一般較新的MacOS或Linux發(fā)行版都是安裝的了。用個命令讀取一下版本確認一下:
$ python --version
? ?如果不是python3.x,再試一下:
$ python3 --version
? ?如打印結果沒有Python 3.x.x,那就需要去python.org根據(jù)提示進行下載和安裝,也是很簡單。
? ?第二步需要確保包安裝器 pip 也安裝完成,命令行中輸入:
$ pip -V
或
$ pip3 -V
? ?進行確認,如未安裝,可以使用以下命令快速安裝:
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
或
$ sudo python3 get-pip.py
? ?接著講下文本編輯器環(huán)境,當然作為解釋性語言,系統(tǒng)默認的文本編輯器都可以作為Python編寫的工具。但有時候我們?yōu)榱颂岣呶覀冃实墓δ?,如語法錯誤提醒,如函數(shù)/變量自動補全等等,會使用一些功能更強大的編輯器,如我比較喜歡的Sublime Text,它輕量免費,又有大量插件可以按需安裝,可以上https://www.sublimetext.com/下載安裝,安裝完界面如下:

? ?安裝完后別忘在Install package里裝上Anaconda插件,方便Python語法的提示和補全。



? ?最后一步,運行Python程序。最簡單的方式,當然就是直接在命令行中用Python命令直接運行腳本,如:
$ python hello.py
? ?當然調(diào)試過程中更推薦直接用Sublime Text的Build功能在編輯器里直接看到運行結果。


? ?好了,基本的Python環(huán)境我們有了,接下來讓我們通過編寫一個個搬運相關的分解腳本,完成整個自動化功能吧。
腳本一:Youtube影片獲取
? ?常見的后臺調(diào)取Youtube頻道和影片數(shù)據(jù)的方法有兩種,一種是使用Google官方的Youtube Data API,另一種使用第三方Python庫Pytube,由于官方API需要注冊賬號激活API等等操作,也不支持任意下載,而Pytube數(shù)據(jù)功能完整,還可以下載視頻的各個分辨率版本,所以我們就統(tǒng)一使用Pytube來完成所有在Youtube上的操作。
? ?需要注意,由于現(xiàn)在我們還在本地執(zhí)行,須確保執(zhí)行腳本的電腦可以訪問Youtube官網(wǎng),這樣Pytube的接口才可以讀取到Youtube上的信息。
1) 讀取指定視頻的信息。
? ?讀取頻道前,我們先寫個幾行讀取某個指定視頻的信息,首先import Pytube模組,使用YouTube()接口導入視頻的URL地址生成video對象,這里隨意找了個視頻地址:
from pytube import YouTube
video = YouTube("https://www.youtube.com/watch?v=tO_L8bik10k")
? ?嘗試打印video對象里的各種參數(shù),更多的參數(shù)可參考文檔https://pytube.io/en/latest/api.html#youtube-object:
print("Video_title = " + video.title)
print("Video_author = " + video.author)
print("Video_length = " + str(video.length))
? ?打印結果如下:
Video_title = Los Angeles Clippers vs. Brooklyn Nets Full Game Highlights | Nov 12 | 2022-23 NBA Season
Video_author = The Asylum
Video_length = 578
[Finished in 4.1s]
2) 下載視頻
? ?眾所周知Youtube的視頻都會有不同的分辨率進行選擇,我們Pytube進行下載的時候,也是可以選擇不同的分辨率的,一般質(zhì)量較好的視頻都是有1080p的,而且根據(jù)我的觀察,很多Short影片(Youtube的短視頻)還會有2160p這樣的高質(zhì)量畫面可供下載。在Pytube里我們把這些不同的格式和分辨率的副本叫做流(Stream)。我們隨便找個Short影片看看它有多少Stream:
from pytube import YouTube
video = YouTube("https://www.youtube.com/watch?v=WZbKAFP1090")
print(video.streams)
? ?執(zhí)行以上代碼后的打印信息會相當龐大,粗粗看下它是列表結構,列表中的每一項都是包含了每個stream的詳細信息的字典:
[..., <Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2" progressive="True" type="video">,, ...]
? ?如果我們只想看到分辨率為720p的視頻,只需要在打印的代碼調(diào)用streams的filter方法,過濾出我們需要的stream:
print(video.streams.filter(res="720p"))
? ?當然,我們搬運視頻當然最好是用比較高的分辨率,一般不建議使用大于1440p,因為過高的分辨率可能會在后面上傳自媒體平臺時被平臺壓縮,導致畫質(zhì)更差,因此用1080p一般就足夠了,所以讓我們用一個for循環(huán)找出res不大于1080p的畫質(zhì)最高的那個stream:
current_res = 0
stream_highest_res = video.streams[0]
for everystream in video.streams.filter(type="video"):
if int(everystream.resolution[:-1]) > 1080:
continue
if int(everystream.resolution[:-1]) > current_res:
current_res = int(everystream.resolution[:-1])
stream_highest_res = everystream
print("Highest stream: ", stream_highest_res)
? ?從而找到了:
Highest stream: <Stream: itag="248" mime_type="video/webm" res="1080p" fps="30fps" vcodec="vp9" progressive="False" type="video">
? ?這里要特別提一下的是,streams對象本身有提供一個找出最高分辨率的方法,video.streams.get_highest_resolution(),但是這個方法最高只能找到720p,無法返回1080p或更高的視頻,所以棄用。(這可能也是很多國外油管下載站為什么最高只能提供到720p的原因)
? ?接下來,我們把這個手工找到的1080p影片下載下來:
stream_highest_res.download(filename='v1080p.webm')
? ?這時可以看到在python文件的同目錄下有了一個叫做v1080p.webm的視頻文件,用chrome就可以打開。當然除了filename,還可以在download()里用output_path=來指定文件存放目錄。做的更細致點還可以在YouTube方法里指定下載進度和完成的回調(diào)函數(shù),用來追蹤下載過程。比如想收到下載完成通知,可以修改原來的YouTube()調(diào)用參數(shù),并增加回調(diào)函數(shù)定義:
video = YouTube("https://www.youtube.com/watch?v=WZbKAFP1090", on_complete_callback=download_complete_handler)
...
def download_complete_handler(stream, file_path):
print ("File: " + stream.title + "downloaded completed in " + file_path)
? ?這樣下載完成后,我們就可以看到提示打印:
File: JIGGY! Merrick & Fynn #Shortsdownloaded completed in /Users/yeyu/Docs/python projects/demo for media/v1080p.webm
? ?目前我們下載是完成了,但是用chrome播放這個視頻的時候會發(fā)現(xiàn)只有圖像沒有聲音,翻到前面的打印查看它的stream,發(fā)現(xiàn)1080p的stream參數(shù)里只有vcode=‘VP9’,卻沒有類似720p stream里的acode=,不知道這是什么原因,似乎超過720p以后音頻和視頻就分離了,基本油管里的視頻都是這個樣子。但是我們完全不用擔心,還是有很多辦法的,比如不是很在意極致效果的可以直接非常方便地下載720p,如果還是要用1080p,那就在stream里找到一條音軌合并進視頻即可。
? ?讓我們先找到一條音軌,還是使用filter方法,找到第一條采樣率128k的音頻stream:
stream_audio = video.streams.filter(type="audio", abr="128kbps")[0]
stream_audio.download(filename="audio.mp4")
? ?這樣我們就已經(jīng)把視頻文件和音頻文件都單獨下載好了

? ?在下一篇文章里我們將使用FFMPEG工具對兩個文件進行自動合并,輸出分辨率為1080p的音視頻文件,并開始進入頻道(Channel)監(jiān)控。
進入下一篇:《躺著就能漲粉?Python自動化短視頻搬運(二)|合并影片》
本篇用到的代碼:
from pytube import YouTube
def download_complete_handler(stream, file_path):
print ("File: " + stream.title + "downloaded completed in " + file_path)
video = YouTube("https://www.youtube.com/watch?v=WZbKAFP1090",
on_complete_callback=download_complete_handler)
print("Video_title = " + video.title)
print("Video_author = " + video.author)
print("Video_length = " + str(video.length))
current_res = 0
stream_highest_res = video.streams[0]
for everystream in video.streams.filter(type="video"):
if int(everystream.resolution[:-1]) > 1080:
continue
if int(everystream.resolution[:-1]) > current_res:
current_res = int(everystream.resolution[:-1])
stream_highest_res = everystream
print("Highest stream: ", stream_highest_res)
stream_highest_res.download(filename='v1080p.webm')
stream_audio = video.streams.filter(type="audio", abr="128kbps")[0]
print(stream_audio)
stream_audio.download(filename='audio.mp4')
download_youtube_video.py