标题【自媒体营销神器】一键自动下载短视频并分发至长视频平台脚本开源展示 标题链接https://www.bilibili.com/read/cv1905700 meta-col学习 view578 like43 comment30 time1-21 字段1【自媒体营销神器】一键自动下载短视频并分发至长视频平台脚本开源展示 字段2项目语言:Python 开发历时:一个月 为什么要开源:Those whom God wishes to destroy, he first makes mad. 用到的库: 首先是项目展示环节: 脚本处理示例↑ 第一期工程之将人工筛选的视频下载并处理成搞笑合集↑ 第二期工程之将特定达人的视频下载并处理成搞笑合集↑ 第二期工程之将Q群沙雕图处理成沙雕图合集↑ 第三期工程之更新合集封面图的处理方式↑ 第三期工程之自动识别美女的视频,下载并处理成小姐姐合集(还没开始做)↑ 然后是项目地址: https://github.com/hokaso/douyin2bilibili 各脚本文件详解: douyin2bilibili_Collection.py:国内抖音达人个人视频合集(抖音+国内+个人) douyin2bilibili_streamline.py:国内抖音人工筛选视频合集(抖音+国内+筛选) douyin2bilibili_streamline_oversea.py:国外抖音人工筛选视频合集(抖音+国际+筛选) pure_upload.py:仅通过分发平台上传的脚本 upload.exe&upload_bg.exe:分发视频时调取的选择文件脚本 GBK.ttf:处理封面图时所用到的字体 youtube_upload.py:基于you-get的油管视频转载脚本 希望做成的所有功能一览: 其中已达成的目标(除了上述的三个以外): 快手&抖音+国内&国外+个人: https://github.com/muyangren907/Kwai_download_script 其中仅快手国际筛选未实现。 接下来是技术细节: 1.视频的抓取:最早期的版本的下载模块,我使用了@Jack-Cherish的抖音爬虫(https://github.com/Jack-Cherish),在此表示感谢。其原理为,根据短视频的分享链接,进入相应PC端网页,提取原视频链接并下载。后来发现国内的token验证并不严谨(https://github.com/AppSign/douyin),故改为模拟手机端app发包并收集json,批量解析视频链接后下载(个人合集),但这一招对签名算法不同的国际版抖音app无效,故只能使用下一招:通过fiddler进行手机抓包,提取json文件解析链接下载(https://github.com/muyangren907/Kwai_download_script)。 2.封面图的处理:最早我仅仅通过(https://www.bilibili.com/read/cv1424947)这篇文章中第九项的方法生成封面图,后来觉得这样的封面有些单调,就改了算法,检测到图片的尺寸若小于20/27,就使用三图模式(具体算法见下图)。至于这一张图和三张图怎么获取,这里就用到了moviepy.editer库中VideoFileClip类的duration方法,获取列表前三个视频1/2时间段的视频截图,根据时间码,用ffmpeg进行截图,然后去除黑边,再合并。 3.视频背景图的处理:首先肯定要有一张干净的底层模板,在这层模板上我划出了几个自由填充的区域:Logo、简介、标题、二维码(第一阶段)、头像、昵称。对应每个短视频,生成相应的背景图片,相关技术:PIL 第一期的背景图↑,后来由于视频平台会对包含二维码的视频限流,故第二期工程就改成了以下这种模式↓。 详细的图片处理方法请直接参考我的代码。 4.图片与视频的嵌合,以及单个视频的合并:通过ffmpeg实现,相关教程请参考: https://www.jianshu.com/p/b30f07055e2e 5.视频的分发:如果一个一个平台的传,估计得累死,所以我选择火星云分发(https://publish.caasdata.com),基本支持国内所有大型长视频平台。因为没找到网站的api,所以用了selenium,一个基于谷歌浏览器的自动化测试框架,可以模拟大部分人工操作流程。 以上就是我脚本所有的内容了,希望能来个大神帮忙写个GUI啥的…… 6.自媒体运营的技巧:最重要的,转载的不要投原创!转载的不要投原创!转载的不要投原创!重要的事情说三遍!这个脚本给你们是用来引流的,不是用来薅平台羊毛的!其次则是标封的把控,这里有个教程可以分享给大家: 7.油管一键转载脚本:这个就没啥好说的了,抓取油管的封面,再通过you-get抓取视频,然后调取分发模块。其中肯定会有人奇怪这一行:if(int(img.headers['content-length']) > 1098),这是因为有些老视频,或者没有刻意上传高清封面图的视频,它的maxresdefault.jpg是这个样子的: 这张图的大小为1097,所以如果视频本身就没高清封面,那就不传封面了,让平台的系统自己截取去~ |