在chrome的headless環境下,FFmpeg處理視頻流,模擬B站登陸,驗證登錄成功率還能夠,視頻分割,線程池控制併發,下載和上傳獨立,擴展性很強,擴展網站只用寫plugin代碼繼承下載基類便可。
原項目由星際圈子裏的ForgQi大佬開發,ForgQi的服務器過時了,如今我在搬,服務器放在vultr上(超級費流量)。
鬥魚的流包已失效,我如今主要想辦法解決這個問題(歡迎聯繫我交流這個難點)。html
部署流程:前端
必需要爲64位的linux,32位的chrome和driver很難下載了,官網中止更新python
VPS:Ubuntu 18.04.2 LTS,16的也可。linux
#下載 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb #安裝 sudo dpkg -i google-chrome-stable_current_amd64.deb
這樣下載chrome是最新的,個人版本是V73.0.XXX版本,google-chrome --version,dpkg的過程當中可能會出現一些錯誤,參考:
最後再從新dpkg就好了。git
4.安裝chromedriver,chromedriver版本必須和chrome版本對應,網上有不少博客給出了對應關係表,可是對我chrome都是老版本了,沒有找到對應,最後還好在官網找到了個人版本對應的:
多是後來官網發現對應chrome的版本確實容易出問題,後面的dirver版本直接用chrome的版本爲名建文件夾。github
地址:http://chromedriver.storage.googleapis.com/index.htmlchrome
安裝後解壓,放在/usr/bin 中,記得給這個執行權限,不然程序最後會出錯,(我直接給了777。chmod 755 ./chromedriver)api
5.安裝pyhon3-dev的版本,只安裝python3沒用,後面跑起來巨多錯誤(好比「No Module named Setuptools」),缺乏不少module,服務器
python是應用app,包含了基礎的python庫和python運行環境。
python-dev是基於python的一個擴展開發包,包含了更高級的庫。在開發一些高級功能的項目時有可能須要用到。cookie
咱們的程序一樣須要dev版本的環境。
在遇到' error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 '的錯誤後,google了下,在一個issue的幫助下,試了以下
sudo apt-get install python3 python-dev python3-dev build-essential libssl-dev libffi-dev libxml2-dev libxslt1-dev zlib1g-dev python-pip python-pip3,而後在文件目錄裏執行pip3 install -r requirements.txt,我當時中間有build失敗的信息,可是最後輸出的那幾個模塊安裝都成功了,最開始沒裝dev版本的py,報了不少錯。
6.安裝FFmpeg
sudo add-apt-repository ppa:djcj/hybrid
sudo apt-get update
sudo apt-get install ffmpeg
7.一些其餘的
由於中間出了不少錯,給源碼加了一些報錯的信息,
這裏要打開註釋。
測試上傳功能的時候,由於classic在播,須要修改config的那個房間號連接,上面的信息不能變,下面的連接換一個沒在播的選手連接,由於「會根據配置文件裏的名字,找文件上傳的,能夠把鏈接改爲沒開播的,可是名字要在」。
還在在這裏加一個try
當時就是經過這裏找到chromedriver沒有權限的問題。
最後先用python3 運行Bilibili.py ,會打印出中間一些東西,由於一開始上傳那裏仍是失敗,log裏沒有什麼信息,經過直接用py3執行後打印出了計算B站滑動登陸模塊的像素值,可是仍是不斷打印出更新cookie失敗,登陸這塊是經過
模擬人操做滑動驗證碼,先二值化、灰度處理找到缺口處,得知要移動多少像素,可是會發現拖到位置仍是不能經過驗證,它會提示拼圖被怪物吃了。由於滑動驗證碼還會分析你拖動的行爲,因此咱們不能直接拖動到正確位置,要像真的人同樣,有加速度,先快後慢,上下抖動,有時候還會拖過再拖回來,這樣經過驗證的成功率就很高了。
不斷打印出更新更新cookie失敗感受b站是否是更新滑動驗證的模塊,最後準備問下b站的前端朋友,最後控制檯忽然成功了,原來登陸這個是有概率的,,,程序是不斷會去嘗試直到成功,上傳成功後就會刪除視頻。
8.另一些其餘記錄
程序不下載,會檢測文件,有文件就上傳了
或者這個選手下播了就會上傳
在event.py中能夠控制進程數,主進程一共5個線程,一個主線程,一個reload線程,一個線程池,線程池控制併發量,若是有下載,線程池裏其中一個線程會開一個進程處理下載,線程池大小決定能有幾個下載,我開了5個。每一個進程要麼上傳要麼下載,主進程有三個線程,子線程負責IO操做,主線程下發任務更改變量,每個週期都會檢測開播和文件狀況,還會檢測代碼是否更新,更新的話空閒會重啓,選手下載完會直接調用上傳,或者等它每個週期的檢測來上傳,通常狀況是先上傳再下載,可是首次登錄cookie或者別的地方可能會出問題,因此它上傳失敗,若是在播就又去下載了。
一些參考連接:
https://www.jianshu.com/p/366a5da9ed10
http://www.javashuo.com/article/p-ybpozpmr-ck.html
https://blog.csdn.net/lwgkzl/article/details/77836207
https://github.com/scrapy/scrapy/issues/2115
https://blog.csdn.net/u011748542/article/details/88083358