66

使用函数计算解析视频地址

 4 years ago
source link: https://www.tuicool.com/articles/BF3aM3F
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近工作上的事情比较忙,于是不得不花些时间追剧分散一下注意力。因为之前听过一期高晓松与亲王马伯庸《晓说》,因此追的是很多人已经看完的根据马伯庸小说改编的《长安十二时辰》。

fmeYFrZ.jpg!web

然而,独播该剧的优酷动辄120秒的广告,实在是太影响观影体验。于是花了点时间搞了今天这个小创造: 视频地址解析 。严格来讲,这个小工具其实不算是什么创造,因为类似的工具其实有很多。只是正好之前一直关注serverless,因此这个工具其实是使用阿里云的函数计算来完成。方案如下:

6FzM7zf.jpg!web

使用函数计算来做这个功能其实并不是“锤子思维”,而是因为在github找的一些视频地址解析工具命令行方式提供,而我为了在几分钟以为快速解决自己问题,不想花时间使用代码来调用工具中的执行函数。因此每个函数计算其实是开了一个 进程 去执行视频地址解析命令,然后向前端返回结果。函数计算因为是按照调用计费,非常适合这种场景。一来不用对进程未正常退出进行容错处理;二来频繁创建和销毁进程是非常昂贵的,不适合放在我的小vps上处理这种任务;第三,阿里云函数计算提供每个月100W次的免费调用额度(都是贫穷惹的祸呀:sweat_smile:)

为了快速完成这个小工具,我选择 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 目录下:

.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 最搭:

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!

–EOF–


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK