在chrome的headless环境下,FFmpeg处理视频流,模拟B站登录,验证登陆成功率还可以,视频分割,线程池控制并发,下载和上传独立,扩展性很强,扩展网站只用写plugin代码继承下载基类即可。
原项目由星际圈子里的ForgQi大佬开发,ForgQi的服务器过期了,现在我在搬,服务器放在vultr上(超级费流量)。
斗鱼的流包已失效,我现在主要想办法解决这个问题(欢迎联系我交流这个难点)。
部署流程:
-
必须要为64位的linux,32位的chrome和driver很难下载了,官网停止更新
-
VPS:Ubuntu 18.04.2 LTS,16的也可。
-
安装chrome,
#下载
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就行了。
4.安装chromedriver,chromedriver版本必须和chrome版本对应,网上有很多博客给出了对应关系表,但是对我chrome都是老版本了,没有找到对应,最后还好在官网找到了我的版本对应的:
可能是后来官网发现对应chrome的版本确实容易出问题,后面的dirver版本直接用chrome的版本为名建文件夹。
安装后解压,放在/usr/bin 中,记得给这个执行权限,否则程序最后会出错,(我直接给了777。chmod 755 ./chromedriver)
5.安装pyhon3-dev的版本,只安装python3没用,后面跑起来巨多错误(比如“No Module named Setuptools”),缺少很多module,
python是应用app,包含了基础的python库和python运行环境。
python-dev是基于python的一个扩展开发包,包含了更高级的库。在开发一些高级功能的项目时有可能需要用到。
我们的程序同样需要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
https://www.cnblogs.com/EasonJim/p/7113367.html
https://blog.csdn.net/lwgkzl/article/details/77836207
https://github.com/scrapy/scrapy/issues/2115
https://blog.csdn.net/u011748542/article/details/88083358