全自动赚钱项目假想

阿蓝
阿蓝
阿蓝
1208
文章
0
评论
2020-12-1613:56:14 评论 123 次浏览 4713字阅读15分42秒

项目前期准备

  1. 程序语言: Python 3
  2. 服务器: Google Cloud Platform
  3. 数据库: Firestore
  4. 程序托管:Github、Google Cloud Source Repositories
  5. 自动任务调度:Cloud Scheduler
  6. 第三方库、软件: FFmpeg、Requests、PIL、Selenium
  7. IM: Telegram

系统功能模块分解

一个全自动发布 ** 视频的系统,大致需要包含以下几个模块,根据你自己选择的类别、原始素材的不同,可能会有一定差异。

  1. 任务分配模块
  2. 原始图片、音频、视频素材提取、制作模块
  3. ** 视频上传模块
  4. 服务器自动部署模块
  5. 程序运行结果通知模块
  6. 程序自动更新模块

接下来我们将对每个模块一一展开阐述。

任务分配模块

对于一个自动化制作视频并上传的系统,整个系统运作的第一步是系统需要知道自己当前需要从哪个任务开始执行。以一个最简单的任务系统来说,假如整个任务是一个线性增长的任务ID,那么这个任务分配模块也就等同于一个自增ID的数据库字段。对于一个现实的任务分配模块而言,肯定要比这复杂一些,不过最核心的还是告诉程序接下来要进行哪个任务。由于整个系统基本都架构在强大而易用的Google Cloud Platform(后面简称GCP)平台之上,所以任务分配模块我直接使用 GCP 平台上的 NoSQL 数据库: Cloud Firestore。什么是Cloud Firestore呢?借用 Firestore 官网来做个简单介绍:

Cloud Firestore 是一款 NoSQL 文档数据库,它使您可以在全球范围内轻松存储、同步和查询您的移动应用及 Web 应用的数据。

我使用 Firestore 来做很多事,在任务分配模块,只需要新建一个 专属的 Collection及每个标签对应的 Document 即可,比如下面这个演示图。里面包含 counter、 task、 taskID等三个 Document ,其中 task 文档中的 status 的值设置为 on,代表当前任务状态为可继续执行。如果某个阶段的任务执行完毕,或有严重bug需要人工修复,那么这个值就会被设置为 off。其中 taskID 仅为演示才临时添加的Document,实际上的任务分配模块是在另一个专属的 Collection中,要复杂的多,但核心是一样的。任务分配模块的具体执行流程:

  1. 程序读取 task 文档中的 status 的值,如果为:on,则任务继续执行,如果为off,程序直接退出并发送通知消息
  2. 程序随机提取一个 taskID 文档,并解析当前需要执行的任务ID,根据一定规则解析成需要下载的原始素材URL
  3. 程序在后续动作中成功上传一个 ** 视频后,更新 taskID 中对应的任务ID
  4. 某个时间段内任务数量达到上线,设置 task 文档中 status的值为 off

视频制作模块

不同于其他大多数人,我的目标是能实现视频的全自动制作与上传,整个过程不需要人工参与,所以这个前提让我直接摒弃了无法用程序生成的视频类型,比如:**讲解、真人出镜、影视剪辑等等。这里以我自己某个频道的视频制作来做案例,那么这个用程序自动生成视频的流程是这样的:

  1. 下载音频 MP3 的原始素材
  2. 制作封面图片
  3. 用音频 MP3 和封面图用程序自动合成完整视频

下载MP3素材使用 Python 的 Requests库,或者使用 Linux 下的命令行工具 wget、curl都是可以的。

制作封面图使用 Python 的 PIL 库。提前准备好背景图、字体、标题文字,用 PIL 就能自动生成任何需要的图片。

具体实现思路可以自行 Google,当初我也是花了不少时间在研究这个令我抓狂的库(为了让图上的文字能自动居中)。

下面的代码仅供参考(这是我程序中使用的原始代码)

avatar ImageBG_PATHdrawAvatar ImageDrawDrawavatar

# 背景图尺寸xSize ySize avatarsize #字体大小,根据背景图尺寸 和 字数个数而定 最大 400fontSize xSize cover_titlemyFont ImageFonttruetypeFONTS_PATH fontSize # 中文字体# print('font Size = {}'.format(fontSize))

# 放置文字的坐标xPos xSize fontSize cover_titleyPos ySize fontSize# print('xPos = {}, yPos = {}'.format(xPos, yPos))

# 生成封面图drawAvatartextxPos yPos cover_title fill fontmyFont drawAvatar avatarsaveCOVER_PATH #

保存封面图合成视频使用神器 FFmpeg这个工具把我折磨的够呛,头发掉的可不少,不过最后的成果还是令我非常满意的。比如,一条 16.8M 的音频,搭配背景图,生成的 1080P 清晰度的视频大小,也只是 16.9M 而已。

下面是我耗费无数心血测试成功,用来生成视频的FFmpeg命令,供你参考。具体FFmpeg使用方法,请自行 Google。

command f'ffmpeg -loglevel panic -r 0.01 -loop 1 -i {cover_path} -i {mp3_file_path} -c:v libx264 -t {mp3_length} {video_file_path}'subprocessruncommand shell

** 上传模块

又一个让我耗费无数日日夜夜的模块。起初,我使用的是 ** 官方的 API 上传接口:** Data API V3。这个接口的使用非常简单,也特别稳定,按照官方教程基本都能操作成功。但,由于两点特别的理由(虽然算不上致命缺陷),让我下决心转向了使用不太稳定又不省心的 Selenium模块进行模拟上传。

  1. ** API 每天最多只能上传6条视频,上传更多需要填写一个超长的申请表且不一定能通过审核
  2. ** API 两个月前开始要求经过认证才能给“第三方”使用,除非你开通 每个月 $6 的G Suit套装

6刀我暂时是不想出的,但更重要的是每天只能上传6条的配额,这点让我无法忍受。毕竟,咱这种自动生成的视频,无法跟别人那种动辄吸引百万播放的精美制作视频相比,只能以量取胜。每天6条,喝西北风去啊。

无奈,Selenium 模拟上传走起呗。

关于这个,我不想多说,有需要的,可以参考一个 Github 上的开源库,我自己的上传模块也是基于这位小哥的代码进行个性化定制而来的。Github: **_uploader_selenium要说最大的贡献,就是这个开源库让我意识到使用Selenium模拟上传**视频是切实可行的(之前我一直以为**上传页面没有使用标准input是无解的)。

信心有了,开源库也有了,相信你也可以很快搞定的,起码应该比我这个半路出家自学 Python 的家伙应该顺利很多吧。

服务器自动部署模块前面所有的模块开发完毕后,你就要面临一个很重要的环节了:把程序部署到服务器上去。

虽说可以在类似 Vultr 这样的平台采购一台 VPS 并把程序部署上去并不间断运行,但基于以下几条理由,我继续选择了 GCP 旗下的 Google Cloud Engine。

  1. 使用 Google Cloud Engine 可以和 GCP 的其他功能无缝衔接,比如 Firestore等
  2. 选择 抢占式实例,一台2vCPU、1G内存的实例,每个月只需要 $2,实际运行费用则只有 $1 左右(并没有24小时运行)
  3. 在 Google Cloud Engine内上传视频到 **是免流量费的

鉴于此,我选择将程序托管在GCE并选择抢占式实例。

注意,这类抢占式实例价格只有标准实例的一半左右,但是每次运行时间最长不能超过24小时,但对于我们的任务而言,这点完全不成问题。

在 GCP 上配置一个服务器模版并实现全自动启动实例、销毁实例是一件让人体验极其愉悦的事情。以下是大体的操作流程:

  1. 开一台普通实例(抢占式也无所谓,这里仅作为基础配置使用)
  2. 在这台服务器上部署你的程序,安装所有必要的模块,调试并运行成功
  3. 使用 crontab 设置每分钟运行一次你的主程序(配置 flock锁确保不重复启动)
  4. 关闭服务器,以这台配置好的服务器为基础,新建一个机器映像
  5. 以前面新建的机器映像为基础,新建一个实例模版,在实例模板中选择抢占式实例
  6. 配置一个云函数 Google Cloud Functions,实现以实例模版为基础的自动启动或销毁实例群组
  7. 配置一个 Cloud Scheduler,设置为从早上10点到晚上22点,每小时自动启动一台抢占式实例

经过以上配置,现在的程序运行机制是这样的:

  1. Cloud Scheduler会在每天上午10点,到晚上22点之间,每小时访问一次你的云函数。
  2. 这个云函数会自动启动一台你之前配置好的抢占式实例。
  3. 一旦服务器启动完毕,便会每分钟运行一次你的主程序。但由于设置了 flock 程序锁,所以不用担心程序会重复启动。只有当前程序运行完毕后,才会在下一分钟再次启动新任务。
  4. 程序在一小时内制作并上传一定数量的视频,达到限额(我设置的是每小时8个),则自动发送销毁当前服务器的指令,同时将任务状态设置为 off,等待下一小时的唤醒。
  5. 经过一小时后,Cloud Scheduler再次访问你的任务云函数并启动实例、运行程序、销毁实例,以此循环,直到晚上十点,结束一天的任务,进入休息状态。等待第二天上午十点的到来,并开始新一天的任务。

恭喜你,你有了一套完整的全自动运行并帮你赚取美元收益的**视频发布系统。

程序自动更新模块对于一个已经部署好服务器模板的系统而言,如何自动更新程序版本成了另外一个需要解决的小问题。

最早,我需要手动 SSH 连接 VPS,再上传新版程序,但这明显不可持续。后来,我通过云函数中转的方式更新程序版本。

现在,我把程序托管在 Github 私人仓库,并在Google Cloud Source Repositories进行同步。

然后,在程序自动运行的命令中,加入自动更新代码的环节,就可以实现这样的效果:每次更新完代码,直接上传到 Github 仓库,Google Cloud Source Repositories会自动同步最新代码。在主程序运行前会自动拉取最新代码,然后才开始运行主程序。

比如我配置的一份自动运行命令(关键内容已启用自动混淆功能)

#!/bin/sh$time "+%Y-%m-%d %H:%M:%S""${time}" /home/whoami/iYTBpull https://source.developers.google.com/p/ytb/r/github_whoami_iytb/usr/bin/python3 iYTB.py >> iYTB.log 21

程序运行结果通知模块由于程序以自动化方式运行于一台随时可能会自我销毁的服务器中,打通一条发送任务状态的消息通道就有了很大的必要性。

好在,这样的一个消息通道实现起来是非常容易的,比如我目前在用的这个方式: Telegram 群组通知基本只需要三个步骤即可。

  1. 申请一个 Telegram Bot
  2. 新建一个 Telegram Group,把机器人拉入群组并设置为管理员
  3. 部署一个能向群组发送消息的 Cloud Functions

部署完毕以后,不管是程序的出错消息、意外bug、成功通知等,都可以用发送 GET 请求的方式到云函数,你就可以在群组内收到最新的消息通知了,包含了程序开始时间、cookies状态、上传视频的标题、程序实际上传所化的时间、发布成功的视频ID、程序完整运行时长等。

至此,整个项目框架基本完毕,剩下的就是微调以及素材补充了。

  • 微信号
  • 微信扫一扫
  • weinxin
  • 搞钱阿蓝
  • 微信扫一扫
  • weinxin
  • 公众号:搞钱阿蓝(xhllsys)
  • 文章来源:搞钱阿蓝 转载请务必保留本文链接:https://www.xhllsys.com/2569.html

您必须才能发表评论!