使用Heroku搭建在线服务API下载 YouTube bilibili 字幕

Heroku是一个支持多种编程语言的PaaS云服务平台,提供丰厚的计算、数据库免费额度。近期突发奇想用Heroku搭建了一个字幕下载应用,支持YouTube与B站字幕在线下载,后期研究好后可以开放API出来。

本文记录了Heroku部署使用中遇到的问题,迫于免费应用 30 分钟休眠机制,初次打开可能会较慢,后续字幕下载应用将迁移到独立主机上。

功能预览

  • 将按钮拖拽到标签栏,播放视频的时候点击即可完成字幕下载
  • 支持 YouTube bilibili 字幕预览、srt 与 txt 格式字幕下载,啰嗦的教程视频可以只看字幕学习
  • 西瓜视频、B站搬运能手,后期将支持 YouTube 在内的多个视频网站视频下载(占坑)
  • 提供 YouTube 关键字搜集展示,了解视频是如何推广、SEO 的

YouTube/B站字幕下载

image-20200317225201044

image-20200317225406366

Heroku 简介

Heroku 是最早做 Serverless 服务的云计算厂商之一,Heroku 灵活性极高,最早支持 Ruby 语言,后面支持了主流的 Java Python Node.js 等语言,是免费托管后端应用的首选。除了免费计算服务额度,Hexoku 还提供了一定的免费数据存储额度,通过大量的插件和扩展,支持如数据库、电子邮件和其他很多服务。包括 PostgreSQL、Redis、Kafka 等资源。

总之来说,Hexoku 的免费范围内支持在有限的资源环境中运行完整的云应用程序,你只需要将代码提交到 Git 仓库,剩下的一且都可以交付出去。

优点缺点
免费额度丰富够用,不限时长30秒不使用会暂时休眠
资源齐全,包含数据库、中间件只有美国节点,大陆访问略慢

Heroku 部署的坑

尽管 Heroku 已经非常优秀,但是由于英语水平有限,官网又很慢,初次使用难免还是有一些晦涩的问题。

如何创建应用

下载 Hexoku CLI 并登陆后,执行一个命令即可创建一个 App

> heroku create
Creating app... done, ⬢ boiling-shore-56596
https://boiling-shore-56596.herokuapp.com/ | https://git.heroku.com/boiling-shore-56596.git

在目录下编写代码,启动一个 Web 服务器:

// index.js
const http = require('http')

http.createServer((req, res) => {
res.end("ok")
}).listen(process.env.PORT || 5000)

创建一个 Procfile 文件,相当于项目的启动脚本

web: node index.js

提交改动,完成部署:

git add -A
git commit -m "Init commit"

remote: -----> Compressing...
remote: Done: 38.1M
remote: -----> Launching...
remote: Released v20
remote: https://boiling-shore-56596.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/boiling-shore-56596
58d902b..b696f57 master -> master

访问测试

curl https://boiling-shore-56596.herokuapp.com/

大功告成,就是这么简单。

端口监听问题

端口监听环节 Heroku 的原理是将应用的端口映射到 url 上,这个映射关系应该由 Heroku 容器来自动实现,即:

  • 你应该监听哪个端口,是 Hexoku 通过环境变量分给你的
  • 每次启动应用分配的端口不同,通过 PORT 获取
  • 只有监听了指定的端口,应用才能启用,否则会超时关闭应用

在 Node.js 中,可以使用 process.env.PORT 获取端口信息。

资源问题

创建好 PostgreSQL 后,如何获得连接字符串,如何设置环境变量在应用中使用?

资源、配置均被注入到环境变量中,可执行 heroku config 查看:

heroku config

=== arcane-chamber-98126 Config Vars
DATABASE_URL: postgres://hz******eni******xy:d92******9a947efe7a5******931d538df5ccaf96******c67a73@******.compute-1.amazonaws.com:5432/******

可见 Heroku 的部分资源是托管在 AWS 上啊。

heroku 避免睡眠/休眠

设置一个定时任务,每几分钟访问一次就避免休眠了:

crontab  -e

*/15 * * * * curl https://arcane-chamber-98126.herokuapp.com/api/

以上任务每 15 分钟通过 curl 访问一次应用,避免 heroku 30 分钟休眠。

heroku 几个错误问题

自动断开

检查端口是否绑定监听上,如果 web 应用没有监听上 heroku 指定的端口,过一会儿就会被 kill。

打开很慢

一方面是因为主机在美国,收基础计算服务商网络影响,DNS 与网络状况都一般;另一方面是免费版长时间(30 分钟)不活跃的应用将被休眠,直到下次访问冷启动会很慢。

可以写一个定时脚本,定时去访问一下只要产生流量即可,避免 30 分钟休眠。

npm ERR! Cannot read property ‘match’ of undefined

原因是 Node.js 应用上 Heroku 只识别一个依赖配置文件,请删除 package-lock.jsonyarn.lock 其中一个重新提交再试,或者两个都删除。

error: failed to push some refs to ‘https://git.heroku.c

原因是依赖没有装上,Heroku build 的时候报错,最后导致提交不上去,请优先处理 Heroku build 错误而不是一昧的怪罪到 Git 上。

heroku 应用文件丢失

Heroku 不提供磁盘存储服务,尤其是免费应用 30 分钟没有活动就休眠,请不要使用文件、SQLite 等文件相关的记录器,这个不保证能持久使用。