【云+社区年度征文】全网第一个基于云函数的马保国彩色二维码生成器

2020-11-27 18:13:14 浏览数 (1)

前言

接触云函数已经有一段时间嘞,TCB云开发的云函数对于前端开发人员来说是一个开发利器,我们可以基于云函数开发很多有意思的应用。这不,我们可以用它来合成彩色二维码,就让马保国老师来成为上云第一人吧(程序员要讲码德,耗子尾汁)。

函数创建

登录腾讯云账号点击云函数选择新建云函数 colorful_qrcode

create_func.pngcreate_func.png

安装 CloudBase CLI

没有安装 node 环境的要先安装 node.js。

安装@cloudbase/cli
代码语言:txt复制
npm i -g @cloudbase/cli

如果安装失败,则您可能需要修改 npm 权限,或者以系统管理员身份运行如下代码:

代码语言:txt复制
sudo npm install -g @cloudbase/cli

测试安装结果

代码语言:txt复制
cloudbase -v

下载云函数并编写代码

终端中登录腾讯云

终端中输入下面的命令:

代码语言:txt复制
tcb login

CloudBase CLI 会自动打开云开发控制台获取授权,单击同意授权按钮允许 CloudBase CLI 获取授权。

下载云函数

1.新建文件夹 tcb

2.CD进入文件夹新建配置文件cloudbaserc.json

输入如下内容

代码语言:txt复制
{
  "envId": "环境ID",
  "functionRoot": "functions",
  "functions": [
    {
      "name": "colorful_qrcode",
      "timeout": 60,
      "runtime": "Python3.6",
      "installDependency": false,
      "handler": "index.main"
    }
  ]
}

3.下载函数并编写代码

代码语言:txt复制
cloudbase functions:download colorful_qrcode
tcb_fun_download.pngtcb_fun_download.png

生成二维码有很多方案,这里需要生成彩色的所以就用了 Python 的 MyQR 生成工具。

代码语言:txt复制
version, level, qr_name = myqr.run(
    words=words,  # 不支持中文,支持 0~9,a~z, A~Z 以及常见的常用英文标点符号和空格
    version=13,  # 版本,从 1至 40
    level='H',  # 纠错等级,范围是L、M、Q、H,从左到右依次升高
    picture=picture,  # 文件要放在目录下
    colorized=True,   # True 为彩色,False 为黑白
    contrast=1.0,  # 对比度
    brightness=1.0,  # 亮度
    save_name=save_name,  # 命名随便都行,格式可以是 jpg,png,bmp,gif
    save_dir=os.getcwd()  # 路径要存在
)

函数部署

函数是用 Python 写的,运行时为 3.6

1.安装依赖

输入如下命令生成 requirements.txt 文件

代码语言:txt复制
pip3 freeze > requirements.txt

2.项目根目录安装依赖

代码语言:txt复制
pip3 install -r requirements.txt -t ./

3.使用如下命令部署

代码语言:txt复制
cloudbase functions:deploy colorful_qrcode

可以在命令后附加 --force 选项指定 Cloudbase CLI 覆盖已存在的云函数。

体验方法

HTTP 访问服务地址:

http://tcb.xuedingmiao.com/colorful_qrcode

支持传入两个参数:

  • 请求参数说明:

名称

类型

必填

说明

bgPic

string

false

二维码背景图

content

string

false

二维码内容

  • bgPic 为图片的网络地址,函数执行时会把图片下载下来
  • bgPic 参数缺省时默认返回马保国老师,支持传入 jpg,png,bmp,gif 格式的网络图片
  • content 为生成二维码的内容,不支持中文,支持 0~9,a~z, A~Z 以及常见的常用英文标点符号和空格,缺省时默认返回博主公号地址
默认返回内容默认返回内容

GIF示例:

  • 马保国劝你耗子尾汁
colorful_qrcode_mbg_hzwz.gifcolorful_qrcode_mbg_hzwz.gif
  • 其它动图
colorful_qrcode_other.gifcolorful_qrcode_other.gif

说说几个坑点

这是博主的第一个 Python 云函数,自然踩了很多坑,差点放弃了马(保国)老师。

1.运行环境

第一个坑就是 Python 依赖安装了,官方虽有文档说明但是写的不够清楚,博主最后使用的pip3 install -r requirements.txt -t ./进行的依赖安装。

然后文档上有这么一句话:

函数运行的系统是 CentOS 7,您需要在相同环境下进行安装。若环境不一致,则可能导致上传后运行时出现找不到依赖的错误。

所以为了保险起见,我在 centos7 上安装了一遍并进行了部署(下图为博主使用的系统版本)。

centos-version.pngcentos-version.png

然后还是遇到了依赖问题:

代码语言:txt复制
ImportError: cannot import name '_imaging'

不过这个只要把 pillow 版本改为 4.0.0 就可以了。

2.文件夹权限

云函数在执行过程中,都拥有一块500MB的临时磁盘空间 /tmp,用户可以在执行代码时对该空间进行一些读写操作,也可以创建子目录,但这部分数据在函数执行完成后不会保留。

运行环境内除 /tmp 目录下,其他均限制为只读。

所以在本函数中我们要把生成二维码的目录改为 /tmp,这样才可以得到二维码。

3.执行时间及内存

因为在执行过程中需要下载网络图然后生成二维码所以需要把超时时间改为较大的时间,同样为了增加执行效率也需要适当修改内存配置

函数配置函数配置

其它问题

不推荐使用大的 GIF 图玩耍,较容易出现类似如下的执行超时错误

代码语言:txt复制
Result:{"errorCode":-1,"errorMessage":"Invoking task timed out after 60 seconds"}

参考文档

  • MyQR
  • CloudBase CLI 配置文件说明
  • 云函数管理
  • 云函数依赖安装
  • 使用 HTTP 访问云函数
  • 云函数在执行过程中的可写空间

0 人点赞