最近工作上的事情比较忙,于是不得不花些时间追剧分散一下注意力。因为之前听过一期高晓松与亲王马伯庸《晓说》,因此追的是很多人已经看完的根据马伯庸小说改编的《长安十二时辰》。
然而,独播该剧的优酷动辄120秒的广告,实在是太影响观影体验。于是花了点时间搞了今天这个小创造:视频地址解析。严格来讲,这个小工具其实不算是什么创造,因为类似的工具其实有很多。只是正好之前一直关注serverless,因此这个工具其实是使用阿里云的函数计算来完成。方案如下:
使用函数计算来做这个功能其实并不是“锤子思维”,而是因为在github找的一些视频地址解析工具命令行方式提供,而我为了在几分钟以为快速解决自己问题,不想花时间使用代码来调用工具中的执行函数。因此每个函数计算其实是开了一个进程去执行视频地址解析命令,然后向前端返回结果。函数计算因为是按照调用计费,非常适合这种场景。一来不用对进程未正常退出进行容错处理;二来频繁创建和销毁进程是非常昂贵的,不适合放在我的小vps上处理这种任务;第三,阿里云函数计算提供每个月100W次的免费调用额度(都是贫穷惹的祸呀?)
为了快速完成这个小工具,我选择 Python 作为自己函数计算的开发语言。阿里云的函数计算也支持 Java, Node.js, C#, PHP 等其他语言,挑选一个自己趁手的就行。整体上,函数计算这个产品非常简单,基本跟着引导就能做完。其中有几个点比较常见也很重要,在这里简单记录一下。
1. 函数的调试
函数计算有 Web IDE, 你可以直接在上面编写和调试代码。但是,如果你习惯使用 VS Code在本地调试的话,推荐你使用函数计算的VSCode 插件。
2. 添加外部依赖
函数计算的 Python 环境默认配置了标准库以及几个常用的的包依赖。如果需要添加其他依赖,你需要使用 fun 这个工具来管理和添加语言依赖。
对于 Python, 只需要使用如下命令安装包依赖即可:
fun install –runtime python3 –package-type pip flask
该命令会将依赖包安装在项目目录的 .fun
目录下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
.fun └── python ├── bin │ ├── flask │ └── you-get └── lib └── python3.6 └── site-packages ├── Click-7.0.dist-info │ ├── INSTALLER │ ├── LICENSE.txt │ ├── METADATA │ ├── RECORD |
3. 使用 flask 封装 web server
函数计算有好几种触发方式,最常规的肯定是通过 HTTP API 调用方式触发。这个场景,当时是 fask 与 Python 最搭:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
from flask import Flask from flask import request from flask import make_response app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def home(): resp = make_response(' <h1>Home</h1> ', 200) return resp @app.route('/signin', methods=['GET']) def signin_form(): # action url 中的service_name,function_name need replace html = ''' <form action="/2016-08-15/proxy/service_name/func_name/signin" method="post"><input name="username"> <input name="password" type="password"> <button type="submit">Sign In</button> </form>''' resp = make_response(html, 200) return resp @app.route('/signin', methods=['POST']) def signin(): if request.form['username'] == 'admin' and request.form['password'] == 'password': html = ' <h3>Hello, admin!</h3> ' else: html = ' <h3>Bad username or password.</h3> ' resp = make_response(html, 200) return resp @app.route('/signin2', methods=['GET']) def signin2(): if request.args.get('username') == 'admin' and request.args.get('password') == 'password': html = ' <h3>Hello2, admin!</h3> ' else: html = ' <h3>Bad username or password.</h3> ' resp = make_response(html, 200) return resp def handler(environ, start_response): # maybe pre do something here return app(environ, start_response) |
有时候,我们折腾事情可能会因为过程而忘记了初心。对于追剧这件小事这种情况是肯定不允许发生的。愉快的追剧去吧。
Enjoy!