在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